diff --git a/web/src/components/card/ExportCard.tsx b/web/src/components/card/ExportCard.tsx index b1d668e8c..d57a30b52 100644 --- a/web/src/components/card/ExportCard.tsx +++ b/web/src/components/card/ExportCard.tsx @@ -21,6 +21,7 @@ import { baseUrl } from "@/api/baseUrl"; import { cn } from "@/lib/utils"; import { shareOrCopy } from "@/utils/browserUtil"; import { useTranslation } from "react-i18next"; +import { ImageShadowOverlay } from "../overlay/ImageShadowOverlay"; type ExportProps = { className: string; @@ -224,7 +225,7 @@ export default function ExportCard({ {loading && ( )} -
+
{exportedRecording.name.replaceAll("_", " ")}
diff --git a/web/src/components/overlay/ImageShadowOverlay.tsx b/web/src/components/overlay/ImageShadowOverlay.tsx new file mode 100644 index 000000000..6eb7075b0 --- /dev/null +++ b/web/src/components/overlay/ImageShadowOverlay.tsx @@ -0,0 +1,27 @@ +import { cn } from "@/lib/utils"; + +type ImageShadowOverlayProps = { + upperClassName?: string; + lowerClassName?: string; +}; +export function ImageShadowOverlay({ + upperClassName, + lowerClassName, +}: ImageShadowOverlayProps) { + return ( + <> +
+
+ + ); +} diff --git a/web/src/components/player/BirdseyeLivePlayer.tsx b/web/src/components/player/BirdseyeLivePlayer.tsx index 2e9461293..f94e9aca2 100644 --- a/web/src/components/player/BirdseyeLivePlayer.tsx +++ b/web/src/components/player/BirdseyeLivePlayer.tsx @@ -6,6 +6,7 @@ import MSEPlayer from "./MsePlayer"; import { LivePlayerMode } from "@/types/live"; import { cn } from "@/lib/utils"; import React from "react"; +import { ImageShadowOverlay } from "../overlay/ImageShadowOverlay"; type LivePlayerProps = { className?: string; @@ -76,8 +77,7 @@ export default function BirdseyeLivePlayer({ )} onClick={onClick} > -
-
+
{player}
diff --git a/web/src/components/player/LivePlayer.tsx b/web/src/components/player/LivePlayer.tsx index f61e544eb..1f5ca703a 100644 --- a/web/src/components/player/LivePlayer.tsx +++ b/web/src/components/player/LivePlayer.tsx @@ -25,6 +25,7 @@ import { PlayerStats } from "./PlayerStats"; import { LuVideoOff } from "react-icons/lu"; import { Trans, useTranslation } from "react-i18next"; import { useCameraFriendlyName } from "@/hooks/use-camera-friendly-name"; +import { ImageShadowOverlay } from "../overlay/ImageShadowOverlay"; type LivePlayerProps = { cameraRef?: (ref: HTMLDivElement | null) => void; @@ -328,10 +329,7 @@ export default function LivePlayer({ > {cameraEnabled && ((showStillWithoutActivity && !liveReady) || liveReady) && ( - <> -
-
- + )} {player} {cameraEnabled && diff --git a/web/src/views/classification/ModelSelectionView.tsx b/web/src/views/classification/ModelSelectionView.tsx index e4db0ab5b..53f9c0af0 100644 --- a/web/src/views/classification/ModelSelectionView.tsx +++ b/web/src/views/classification/ModelSelectionView.tsx @@ -1,6 +1,7 @@ import { baseUrl } from "@/api/baseUrl"; import ClassificationModelWizardDialog from "@/components/classification/ClassificationModelWizardDialog"; import ActivityIndicator from "@/components/indicators/activity-indicator"; +import { ImageShadowOverlay } from "@/components/overlay/ImageShadowOverlay"; import { Button } from "@/components/ui/button"; import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; import useOptimisticState from "@/hooks/use-optimistic-state"; @@ -163,7 +164,7 @@ function ModelCard({ config, onClick }: ModelCardProps) { className={cn("size-full", isMobile && "w-full")} src={`${baseUrl}clips/${config.name}/dataset/${coverImage?.name}/${coverImage?.img}`} /> -
+
{config.name}