@geekapps/silo-elements-nextjs 0.3.18 → 0.3.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/VideoPlayer.tsx"],"names":["CaptionsIcon"],"mappings":"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","file":"VideoPlayer.js","sourcesContent":["\"use client\";\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n KeyboardEvent,\n PointerEvent,\n ReactElement,\n ReactNode,\n} from \"react\";\nimport gsap from \"gsap\";\nimport {\n Play,\n Pause,\n Volume2,\n VolumeX,\n Maximize,\n Minimize,\n Captions as CaptionsIcon,\n Settings,\n} from \"lucide-react\";\n\nexport type VideoSourceType = \"dash\" | \"hls\" | \"file\";\n\nexport type SourceProps = {\n id?: string;\n src: string;\n label?: string;\n type?: VideoSourceType;\n default?: boolean;\n};\n\nexport type CaptionsProps = {\n src?: string; // URL that returns JSON: Array<{ src, srclang, label, default? }>\n data?: Array<{ src: string; srclang: string; label: string; default?: boolean }>; // inline captions, bypasses fetch\n};\n\nexport type ThumbnailProps = {\n /** Single URL (legacy). Use urls for adaptive resolution. */\n src?: string;\n /** Map of width label to URL: { \"320w\": \"...\", \"640w\": \"...\", \"1280w\": \"...\", \"1920w\": \"...\" } */\n urls?: Record<string, string>;\n};\n\nexport type StoryboardFrameProps = {\n start: number;\n end: number;\n image: string;\n x?: number;\n y?: number;\n w?: number;\n h?: number;\n};\n\nexport type StoryboardResolution = {\n /** VTT content with sprite URLs already resolved (no temp S3 upload needed) */\n vttText?: string | null;\n spriteUrl: string;\n tileW: number;\n tileH: number;\n cols: number;\n rows?: number | null;\n};\n\nexport type StoryboardProps = {\n /** Legacy: single VTT URL */\n src?: string;\n fallbackImage?: string;\n width?: number;\n height?: number;\n /** Multi-resolution storyboards from post-worker: { \"180p\": {...}, \"480p\": {...} } */\n resolutions?: Record<string, StoryboardResolution>;\n children?: ReactNode;\n};\n\ntype ParsedStoryboard = Omit<StoryboardProps, \"children\"> & {\n frames: StoryboardFrameProps[];\n};\n\ntype ResolvedCaption = {\n src: string;\n srclang: string;\n label: string;\n default?: boolean;\n};\n\nexport type ChaptersProps = {\n src?: string; // URL that returns JSON: Array<{ startTime, title, endTime? }>\n data?: Array<{ startTime: number; title: string; endTime?: number }>;\n};\n\ntype ResolvedChapter = {\n startTime: number;\n title: string;\n endTime?: number;\n};\n\nexport type AgeRatingProps = {\n /** The age_ratings JSON from the file: { US: \"PG-13\", BR: \"14\", EU: \"PEGI 16\" } */\n data?: Record<string, string>;\n /** BCP-47 locale like \"en-US\", \"pt-BR\", \"de-DE\" — picks the right region key */\n locale?: string;\n /** Custom lookup for display info per region+code: { title, description, imageUrl } */\n lookup?: Record<string, { title?: string; description?: string; imageUrl?: string }>;\n};\n\nexport type RatingProps = {\n /** Aggregate counts */\n counts?: { LOVE?: number; LIKE?: number; DISLIKE?: number };\n /** Current user's reaction */\n userReaction?: \"LOVE\" | \"LIKE\" | \"DISLIKE\" | null;\n /** Called when user clicks a reaction button */\n onReact?: (reaction: \"LOVE\" | \"LIKE\" | \"DISLIKE\" | null) => void;\n};\n\ntype ParsedVideoChildren = {\n sources: SourceProps[];\n captionsSrc?: string;\n captionsData?: Array<{ src: string; srclang: string; label: string; default?: boolean }>;\n chaptersSrc?: string;\n chaptersData?: ResolvedChapter[];\n thumbnailSrc?: string;\n thumbnailUrls?: Record<string, string>;\n storyboard?: ParsedStoryboard;\n ageRating?: AgeRatingProps;\n rating?: RatingProps;\n};\n\ntype QualityOption = {\n id: string;\n label: string;\n type: \"auto\" | \"hls\" | \"dash\";\n index?: number;\n supported?: boolean;\n hdr?: boolean;\n};\n\ntype VideoProps = {\n title?: string;\n description?: string;\n children: ReactNode;\n className?: string;\n autoHideControls?: boolean;\n defaultVolume?: number;\n maxHeight?: string | number;\n /** Fixed height — disables aspect-ratio so the player stays at exactly this height regardless of video dimensions */\n fixedHeight?: string | number;\n};\n\ntype WebkitVideoElement = HTMLVideoElement & {\n webkitDisplayingFullscreen?: boolean;\n webkitEnterFullscreen?: () => void;\n webkitExitFullscreen?: () => void;\n};\n\ntype FullscreenCapableElement = HTMLDivElement & {\n webkitRequestFullscreen?: () => Promise<void> | void;\n};\n\ntype FullscreenCapableDocument = Document & {\n webkitFullscreenElement?: Element | null;\n webkitExitFullscreen?: () => Promise<void> | void;\n};\n\nconst AUTO_QUALITY: QualityOption = {\n id: \"auto\",\n label: \"Auto\",\n type: \"auto\",\n supported: true,\n};\n\nfunction deviceSupportsHdr(): boolean {\n if (typeof window === \"undefined\") return false;\n try { return window.matchMedia(\"(dynamic-range: high)\").matches; } catch { return false; }\n}\n\nfunction deviceSupportsOpus(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n if (typeof MediaSource !== \"undefined\" && MediaSource.isTypeSupported) {\n if (MediaSource.isTypeSupported('audio/mp4; codecs=\"opus\"')) return true;\n }\n const a = document.createElement(\"audio\");\n return a.canPlayType('audio/ogg; codecs=\"opus\"') !== \"\" ||\n a.canPlayType('video/mp4; codecs=\"opus\"') !== \"\";\n } catch { return false; }\n}\n\nfunction deviceSupportsCodec(codecStr: string): boolean {\n if (typeof window === \"undefined\") return true;\n try {\n if (typeof MediaSource !== \"undefined\" && MediaSource.isTypeSupported) {\n return MediaSource.isTypeSupported(`video/mp4; codecs=\"${codecStr}\"`);\n }\n return true;\n } catch { return true; }\n}\n\nfunction isHdrLevel(level: any): boolean {\n // hls.js exposes videoRange on level after manifest parse\n const range = level?.videoRange ?? level?.video_range ?? \"\";\n return range === \"PQ\" || range === \"HLG\" || range === \"HDR10\" ||\n (typeof level?.name === \"string\" && /hdr/i.test(level.name));\n}\n\nfunction isHdrAudioCodec(codecStr: string): boolean {\n return /opus/i.test(codecStr);\n}\n\nconst PLAYBACK_SPEEDS = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2];\n\ntype SettingsTab =\n | \"root\"\n | \"quality\"\n | \"subtitles\"\n | \"subtitles-style\"\n | \"audio\"\n | \"playback\";\n\ntype SubtitleStyle = {\n track: string; // srclang or \"off\"\n size: \"small\" | \"medium\" | \"large\" | \"xlarge\";\n color: \"white\" | \"yellow\" | \"cyan\";\n bg: \"none\" | \"semi\" | \"solid\";\n};\n\nexport function Source(_props: SourceProps) {\n return null;\n}\nSource.displayName = \"SiloSource\";\n\nexport function Captions(_props: CaptionsProps) {\n return null;\n}\nCaptions.displayName = \"SiloCaptions\";\n\nexport function Chapters(_props: ChaptersProps) {\n return null;\n}\nChapters.displayName = \"SiloChapters\";\n\nexport function VideoThumbnail(_props: ThumbnailProps) {\n return null;\n}\nVideoThumbnail.displayName = \"SiloVideoThumbnail\";\n\nexport function Storyboard(_props: StoryboardProps) {\n return null;\n}\nStoryboard.displayName = \"SiloStoryboard\";\n\nexport function StoryboardFrame(_props: StoryboardFrameProps) {\n return null;\n}\nStoryboardFrame.displayName = \"SiloStoryboardFrame\";\n\nexport function AgeRating(_props: AgeRatingProps) {\n return null;\n}\nAgeRating.displayName = \"SiloAgeRating\";\n\nexport function Rating(_props: RatingProps) {\n return null;\n}\nRating.displayName = \"SiloRating\";\n\nexport function Video({\n title,\n description,\n children,\n className,\n autoHideControls = true,\n defaultVolume = 0.72,\n maxHeight,\n fixedHeight,\n}: VideoProps) {\n const parsed = useMemo(() => parseVideoChildren(children), [children]);\n\n const [captions, setCaptions] = useState<ResolvedCaption[]>([]);\n const [chapters, setChapters] = useState<ResolvedChapter[]>([]);\n const [poster, setPoster] = useState<string | undefined>(undefined);\n\n const captionsSourceRef = useRef<string>(\"\");\n\n // Resolve captions — either from inline data or by fetching src URL\n useEffect(() => {\n // Identify the caption \"source key\" — src URL or first srclang from inline data\n const sourceKey = parsed.captionsSrc ?? parsed.captionsData?.[0]?.srclang ?? \"\";\n\n function applyResolved(data: ResolvedCaption[]) {\n const resolved = data.map((c, i) => ({ ...c, default: c.default ?? i === 0 }));\n setCaptions(resolved);\n // Auto-activate only when the caption source changes (new file/language), not on every content update\n if (captionsSourceRef.current !== sourceKey) {\n captionsSourceRef.current = sourceKey;\n const defaultTrack = resolved.find((c) => c.default);\n if (defaultTrack) {\n setSubtitleMode(defaultTrack.srclang);\n setSubtitleStyle((st) => ({ ...st, track: defaultTrack.srclang }));\n }\n }\n }\n\n if (parsed.captionsData) {\n applyResolved(parsed.captionsData);\n return;\n }\n if (!parsed.captionsSrc) { setCaptions([]); return; }\n let cancelled = false;\n fetch(parsed.captionsSrc, { cache: \"no-store\" })\n .then((r) => r.json())\n .then((data: ResolvedCaption[]) => {\n if (!cancelled && Array.isArray(data)) applyResolved(data);\n })\n .catch(() => { if (!cancelled) setCaptions([]); });\n return () => { cancelled = true; };\n }, [parsed.captionsSrc, parsed.captionsData]);\n\n // Resolve chapters — either from inline data or by fetching src URL\n useEffect(() => {\n if (parsed.chaptersData) {\n setChapters(parsed.chaptersData);\n return;\n }\n if (!parsed.chaptersSrc) { setChapters([]); return; }\n let cancelled = false;\n fetch(parsed.chaptersSrc, { cache: \"no-store\" })\n .then((r) => r.json())\n .then((data: ResolvedChapter[]) => {\n if (!cancelled && Array.isArray(data)) setChapters(data);\n })\n .catch(() => { if (!cancelled) setChapters([]); });\n return () => { cancelled = true; };\n }, [parsed.chaptersSrc, parsed.chaptersData]);\n\n const initialSourceIndex = useMemo(() => {\n const index = parsed.sources.findIndex((source) => source.default);\n return index >= 0 ? index : 0;\n }, [parsed.sources]);\n\n const initialSubtitleMode = useMemo(() => {\n const track = captions.find((c) => c.default);\n return track?.srclang ?? \"off\";\n }, [captions]);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const chromeRef = useRef<HTMLDivElement | null>(null);\n const playerRef = useRef<HTMLDivElement | null>(null);\n const showAgeRatingRef = useRef<(() => void) | null>(null);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const progressRef = useRef<HTMLDivElement | null>(null);\n\n const hlsRef = useRef<any>(null);\n const dashRef = useRef<any>(null);\n const hideTimerRef = useRef<number | null>(null);\n\n const [sourceIndex, setSourceIndex] = useState(initialSourceIndex);\n const [qualities, setQualities] = useState<QualityOption[]>([AUTO_QUALITY]);\n const [selectedQuality, setSelectedQuality] = useState(\"auto\");\n const [audioTracks, setAudioTracks] = useState<\n { id: number; label: string; supported?: boolean }[]\n >([]);\n const [selectedAudio, setSelectedAudio] = useState<number>(0);\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [settingsVisible, setSettingsVisible] = useState(false);\n\n const [settingsTab, setSettingsTab] = useState<SettingsTab>(\"root\");\n const [playbackRate, setPlaybackRate] = useState(1);\n const [subtitleStyle, setSubtitleStyle] = useState<SubtitleStyle>({\n track: initialSubtitleMode,\n size: \"medium\",\n color: \"white\",\n bg: \"semi\",\n });\n\n const [subtitleMode, setSubtitleMode] = useState(initialSubtitleMode);\n const [activeCue, setActiveCue] = useState<string | null>(null);\n const [storyboardSheetSize, setStoryboardSheetSize] = useState<{ w: number; h: number } | null>(null);\n const storyboardSheetUrlRef = useRef<string>(\"\");\n\n const [storyboardCues, setStoryboardCues] = useState<StoryboardFrameProps[]>([]);\n // Multi-resolution storyboard state — loaded cues per resolution key\n const storyboardCacheRef = useRef<Map<string, StoryboardFrameProps[]>>(new Map());\n // Which resolution is currently active for preview\n const [activeStoryboardRes, setActiveStoryboardRes] = useState<string | null>(null);\n // Preloaded sprite images (by URL) so they don't flash on first hover\n const preloadedSpritesRef = useRef<Set<string>>(new Set());\n\n // Rating state — internal so clicks don't re-render the parent and restart the video\n const [ratingCounts, setRatingCounts] = useState<{ LOVE: number; LIKE: number; DISLIKE: number }>(\n () => ({ LOVE: parsed.rating?.counts?.LOVE ?? 0, LIKE: parsed.rating?.counts?.LIKE ?? 0, DISLIKE: parsed.rating?.counts?.DISLIKE ?? 0 })\n );\n const [userReaction, setUserReaction] = useState<\"LOVE\" | \"LIKE\" | \"DISLIKE\" | null>(parsed.rating?.userReaction ?? null);\n const userReactionRef = useRef(userReaction);\n userReactionRef.current = userReaction;\n // Sync counts/userReaction when parent provides them for the first time (async load)\n const ratingInitializedRef = useRef(false);\n const incomingCounts = parsed.rating?.counts;\n const incomingUserReaction = parsed.rating?.userReaction;\n useEffect(() => {\n if (ratingInitializedRef.current) return;\n if (!incomingCounts && incomingUserReaction === undefined) return;\n ratingInitializedRef.current = true;\n if (incomingCounts) {\n setRatingCounts({ LOVE: incomingCounts.LOVE ?? 0, LIKE: incomingCounts.LIKE ?? 0, DISLIKE: incomingCounts.DISLIKE ?? 0 });\n }\n if (incomingUserReaction !== undefined) {\n setUserReaction(incomingUserReaction ?? null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [incomingCounts?.LOVE, incomingCounts?.LIKE, incomingCounts?.DISLIKE, incomingUserReaction]);\n // Keep a stable ref to the latest onReact callback so we don't need it in deps\n const onReactRef = useRef<RatingProps[\"onReact\"]>(parsed.rating?.onReact);\n onReactRef.current = parsed.rating?.onReact;\n\n const [preview, setPreview] = useState<{\n cue: StoryboardFrameProps;\n left: number;\n time: number;\n } | null>(null);\n\n const [duration, setDuration] = useState(0);\n const [currentTime, setCurrentTime] = useState(0);\n const [bufferedTime, setBufferedTime] = useState(0);\n\n const [isDragging, setIsDragging] = useState(false);\n const [isHoveringProgress, setIsHoveringProgress] = useState(false);\n const dragPointerIdRef = useRef<number | null>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [hasPlayed, setHasPlayed] = useState(false);\n const ageRatingTlRef = useRef<gsap.core.Timeline | null>(null);\n const ageRatingPauseTimerRef = useRef<number | null>(null);\n const ageRatingWrapRef = useRef<HTMLDivElement | null>(null);\n const ageRatingIconRef = useRef<HTMLDivElement | null>(null);\n const ageRatingTextRef = useRef<HTMLDivElement | null>(null);\n // true after the overlay has been shown and fully faded out at least once\n const ageRatingShownRef = useRef(false);\n // true when 1-min pause threshold fired — show on next play\n const ageRatingQueuedRef = useRef(false);\n // true when age rating should fire as soon as controls hide\n const ageRatingPendingRef = useRef(false);\n const [clickIcon, setClickIcon] = useState<\"play\" | \"pause\" | null>(null);\n const clickIconTimerRef = useRef<number | null>(null);\n const clickIconRef = useRef<HTMLDivElement | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [controlsVisible, setControlsVisible] = useState(true);\n const settingsPanelRef = useRef<HTMLDivElement | null>(null);\n const settingsContentRef = useRef<HTMLDivElement | null>(null);\n const progressTrackRef = useRef<HTMLDivElement | null>(null);\n const progressThumbRef = useRef<HTMLDivElement | null>(null);\n const [volume, setVolume] = useState(defaultVolume);\n const [isMuted, setIsMuted] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [playerHeight, setPlayerHeight] = useState(0);\n const [playerWidth, setPlayerWidth] = useState(0);\n\n // Thumbnail: pick best available URL based on player width and network quality\n useEffect(() => {\n const urls = parsed.thumbnailUrls;\n if (!urls || Object.keys(urls).length === 0) {\n setPoster(parsed.thumbnailSrc ?? undefined);\n return;\n }\n const sorted = Object.entries(urls)\n .map(([label, url]) => ({ px: parseInt(label.replace(\"w\", \"\"), 10) || 0, url }))\n .filter((e) => e.px > 0)\n .sort((a, b) => a.px - b.px);\n if (sorted.length === 0) { setPoster(parsed.thumbnailSrc ?? undefined); return; }\n const dpr = typeof window !== \"undefined\" ? window.devicePixelRatio ?? 1 : 1;\n const conn = typeof navigator !== \"undefined\" ? (navigator as any).connection : null;\n const connFactor = conn?.effectiveType === \"4g\" ? 1 : conn?.effectiveType === \"3g\" ? 0.5 : 0.25;\n const targetPx = (playerWidth || 640) * dpr * (conn ? connFactor : 1);\n const best = sorted.find((e) => e.px >= targetPx) ?? sorted[sorted.length - 1]!;\n setPoster(best.url);\n }, [parsed.thumbnailUrls, parsed.thumbnailSrc, playerWidth]);\n\n const rawActiveSource = parsed.sources[sourceIndex] ?? parsed.sources[0] ?? null;\n // Stabilize the activeSource reference so the HLS/DASH useEffect only fires when\n // src or type actually changes, not on every parent re-render that produces new JSX objects.\n const activeSourceRef = useRef<SourceProps | null>(null);\n if (\n rawActiveSource?.src !== activeSourceRef.current?.src ||\n rawActiveSource?.type !== activeSourceRef.current?.type\n ) {\n activeSourceRef.current = rawActiveSource;\n }\n const activeSource = activeSourceRef.current;\n\n const progressPercent = duration ? (currentTime / duration) * 100 : 0;\n const bufferedPercent = duration ? (bufferedTime / duration) * 100 : 0;\n\n const destroyMediaEngines = useCallback(() => {\n if (hlsRef.current) {\n hlsRef.current.destroy();\n hlsRef.current = null;\n }\n\n if (dashRef.current) {\n dashRef.current.reset();\n dashRef.current = null;\n }\n }, []);\n\n const applySubtitleMode = useCallback((mode: string) => {\n const video = videoRef.current;\n if (!video) return;\n\n // Use \"hidden\" instead of \"showing\" — we render cues ourselves for full style control\n let activeTrack: TextTrack | null = null;\n Array.from(video.textTracks).forEach((track) => {\n if (track.kind === \"metadata\") return; // don't touch metadata tracks (storyboard)\n const enabled = mode !== \"off\" && track.language === mode;\n track.mode = enabled ? \"hidden\" : \"disabled\";\n if (enabled) activeTrack = track;\n });\n // Always clear the previous track's cue when switching. Disabling a track\n // stops its \"cuechange\" from firing, so the old caption would otherwise stay\n // frozen on screen. Then seed the new track's current cue immediately so the\n // switch shows the right caption without waiting for the next cue boundary.\n if (!activeTrack) {\n setActiveCue(null);\n return;\n }\n const cues = (activeTrack as TextTrack).activeCues;\n const cue = cues && cues.length > 0 ? (cues[0] as VTTCue) : null;\n setActiveCue(cue ? cue.text.replace(/<[^>]*>/g, \"\") : null);\n }, []);\n\n const showControlsTemporarily = useCallback(() => {\n setControlsVisible(true);\n\n if (hideTimerRef.current) {\n window.clearTimeout(hideTimerRef.current);\n }\n\n const video = videoRef.current;\n\n if (autoHideControls && video && !video.paused) {\n hideTimerRef.current = window.setTimeout(() => {\n setControlsVisible(false);\n }, 2400);\n }\n\n }, [autoHideControls]);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n gsap.fromTo(\n containerRef.current,\n {\n opacity: 0,\n y: 36,\n scale: 0.985,\n filter: \"blur(10px)\",\n },\n {\n opacity: 1,\n y: 0,\n scale: 1,\n filter: \"blur(0px)\",\n duration: 0.85,\n ease: \"power3.out\",\n },\n );\n }, []);\n\n // settingsOpen = mounted in DOM; settingsVisible = used only to trigger GSAP (open/close driven imperatively)\n const openSettings = useCallback(() => {\n setSettingsOpen(true);\n setSettingsTab(\"root\");\n setSettingsVisible(true);\n }, []);\n\n const closeSettings = useCallback(() => {\n const panel = settingsPanelRef.current;\n if (panel) {\n gsap.killTweensOf(panel);\n gsap.to(panel, {\n opacity: 0,\n y: 8,\n scale: 0.97,\n duration: 0.18,\n ease: \"power2.in\",\n onComplete: () => {\n setSettingsOpen(false);\n setSettingsVisible(false);\n },\n });\n } else {\n setSettingsOpen(false);\n setSettingsVisible(false);\n }\n }, []);\n\n // GSAP: animate settings panel open\n useEffect(() => {\n if (!settingsOpen) return;\n const panel = settingsPanelRef.current;\n if (!panel) return;\n gsap.killTweensOf(panel);\n gsap.fromTo(\n panel,\n { opacity: 0, y: 8, scale: 0.97 },\n { opacity: 1, y: 0, scale: 1, duration: 0.2, ease: \"power2.out\" },\n );\n }, [settingsOpen]);\n\n // GSAP: animate settings sub-menu slide-in on tab change\n useEffect(() => {\n const el = settingsContentRef.current;\n if (!el) return;\n gsap.killTweensOf(el);\n gsap.fromTo(\n el,\n { opacity: 0, x: 12 },\n { opacity: 1, x: 0, duration: 0.18, ease: \"power2.out\" },\n );\n }, [settingsTab]);\n\n // GSAP: controls chrome fade + cursor hide + trigger pending age rating\n useEffect(() => {\n const el = chromeRef.current;\n const player = playerRef.current;\n if (!el) return;\n gsap.killTweensOf(el);\n gsap.to(el, {\n opacity: controlsVisible ? 1 : 0,\n duration: 0.2,\n ease: \"power1.inOut\",\n onComplete: () => {\n if (!controlsVisible && ageRatingPendingRef.current) {\n ageRatingPendingRef.current = false;\n showAgeRatingRef.current?.();\n }\n },\n });\n el.style.pointerEvents = controlsVisible ? \"\" : \"none\";\n if (player) {\n player.style.cursor = controlsVisible ? \"\" : \"none\";\n }\n }, [controlsVisible]);\n\n // GSAP: click icon fade\n useEffect(() => {\n const el = clickIconRef.current;\n if (!el) return;\n gsap.killTweensOf(el);\n if (clickIcon) {\n gsap.to(el, { opacity: 1, duration: 0.08, ease: \"power1.in\" });\n } else {\n gsap.to(el, { opacity: 0, duration: 0.45, ease: \"power1.out\" });\n }\n }, [clickIcon]);\n\n // GSAP: progress bar track + thumb + chapter markers on hover/drag state\n useEffect(() => {\n const track = progressTrackRef.current;\n const thumb = progressThumbRef.current;\n const container = progressRef.current;\n const targetH = isDragging ? 7 : isHoveringProgress ? 5 : 3;\n const targetW = isDragging ? 18 : isHoveringProgress ? 14 : 10;\n if (track) {\n gsap.killTweensOf(track);\n gsap.to(track, { height: targetH, duration: 0.15, ease: \"power1.inOut\" });\n }\n if (thumb) {\n gsap.killTweensOf(thumb);\n gsap.to(thumb, { width: targetW, height: targetW, duration: 0.2, ease: \"back.out(1.7)\" });\n }\n if (container) {\n const markers = container.querySelectorAll(\"[data-chapter-marker]\");\n markers.forEach((el) => {\n gsap.killTweensOf(el);\n gsap.to(el, { height: targetH, duration: 0.15, ease: \"power1.inOut\" });\n });\n }\n }, [isDragging, isHoveringProgress]);\n\n // controls visibility handled via GSAP effect above\n\n useEffect(() => {\n if (sourceIndex >= parsed.sources.length) {\n setSourceIndex(initialSourceIndex);\n }\n }, [sourceIndex, parsed.sources.length, initialSourceIndex]);\n\n useEffect(() => {\n if (\n subtitleMode !== \"off\" &&\n !captions.some((subtitle) => subtitle.srclang === subtitleMode)\n ) {\n setSubtitleMode(initialSubtitleMode);\n }\n }, [subtitleMode, captions, initialSubtitleMode]);\n\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const syncTime = () => {\n setCurrentTime(video.currentTime || 0);\n\n if (video.buffered.length > 0) {\n setBufferedTime(video.buffered.end(video.buffered.length - 1));\n }\n };\n\n const syncDuration = () => {\n setDuration(Number.isFinite(video.duration) ? video.duration : 0);\n applySubtitleMode(subtitleMode);\n };\n\n const hideAgeRating = () => {\n const wrap = ageRatingWrapRef.current;\n if (!wrap) return;\n if (ageRatingTlRef.current) ageRatingTlRef.current.kill();\n gsap.to(wrap, { opacity: 0, duration: 0.4, ease: \"power2.inOut\" });\n };\n\n const showAgeRating = () => {\n if (!parsed.ageRating?.data) return;\n const wrap = ageRatingWrapRef.current;\n const icon = ageRatingIconRef.current;\n const text = ageRatingTextRef.current;\n if (!wrap) return;\n\n if (ageRatingTlRef.current) ageRatingTlRef.current.kill();\n\n const HOLD = 12;\n const tl = gsap.timeline({ delay: 0.3 });\n\n // gradient bg fade in\n tl.fromTo(wrap, { opacity: 0 }, { opacity: 1, duration: 0.5, ease: \"power2.out\" });\n\n // icon pop with elastic overshoot\n if (icon) {\n tl.fromTo(\n icon,\n { opacity: 0, scale: 0.7 },\n { opacity: 1, scale: 1, duration: 0.55, ease: \"back.out(1.6)\" },\n \"-=0.2\",\n );\n }\n\n // text slides in from left\n if (text) {\n tl.fromTo(\n text,\n { opacity: 0, x: -10 },\n { opacity: 1, x: 0, duration: 0.4, ease: \"power2.out\" },\n \"-=0.25\",\n );\n }\n\n // hold then fade everything out\n tl.to({}, { duration: HOLD });\n tl.to(wrap, { opacity: 0, duration: 0.7, ease: \"power2.inOut\", onComplete: () => { ageRatingShownRef.current = true; } });\n\n ageRatingTlRef.current = tl;\n };\n\n showAgeRatingRef.current = showAgeRating;\n\n const onPlay = () => {\n setIsPlaying(true);\n // cancel the pause timer — user resumed before the 1-min threshold\n if (ageRatingPauseTimerRef.current) {\n window.clearTimeout(ageRatingPauseTimerRef.current);\n ageRatingPauseTimerRef.current = null;\n }\n // queue age rating to show once controls hide (overlay disappears)\n const shouldShow = !ageRatingShownRef.current || ageRatingQueuedRef.current;\n ageRatingQueuedRef.current = false;\n if (shouldShow) ageRatingPendingRef.current = true;\n setHasPlayed(true);\n showControlsTemporarily();\n };\n\n const onPause = () => {\n setIsPlaying(false);\n setControlsVisible(true);\n // hide any active age rating immediately\n hideAgeRating();\n if (parsed.ageRating?.data) {\n if (ageRatingPauseTimerRef.current) window.clearTimeout(ageRatingPauseTimerRef.current);\n // after 1 min of pause, queue the next show for when play resumes\n ageRatingPauseTimerRef.current = window.setTimeout(() => {\n ageRatingQueuedRef.current = true;\n ageRatingPauseTimerRef.current = null;\n }, 60 * 1000);\n }\n };\n\n const onWaiting = () => { if (video.played.length > 0) setIsLoading(true); };\n const onCanPlay = () => setIsLoading(false);\n const onEnded = () => setControlsVisible(true);\n\n video.addEventListener(\"timeupdate\", syncTime);\n video.addEventListener(\"progress\", syncTime);\n video.addEventListener(\"loadedmetadata\", syncDuration);\n video.addEventListener(\"durationchange\", syncDuration);\n video.addEventListener(\"play\", onPlay);\n video.addEventListener(\"pause\", onPause);\n video.addEventListener(\"waiting\", onWaiting);\n video.addEventListener(\"canplay\", onCanPlay);\n video.addEventListener(\"ended\", onEnded);\n\n return () => {\n video.removeEventListener(\"timeupdate\", syncTime);\n video.removeEventListener(\"progress\", syncTime);\n video.removeEventListener(\"loadedmetadata\", syncDuration);\n video.removeEventListener(\"durationchange\", syncDuration);\n video.removeEventListener(\"play\", onPlay);\n video.removeEventListener(\"pause\", onPause);\n video.removeEventListener(\"waiting\", onWaiting);\n video.removeEventListener(\"canplay\", onCanPlay);\n video.removeEventListener(\"ended\", onEnded);\n if (ageRatingTlRef.current) ageRatingTlRef.current.kill();\n if (ageRatingPauseTimerRef.current) window.clearTimeout(ageRatingPauseTimerRef.current);\n };\n }, [applySubtitleMode, subtitleMode, showControlsTemporarily]);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n video.volume = volume;\n video.muted = isMuted || volume === 0;\n }, [volume, isMuted]);\n\n useEffect(() => {\n applySubtitleMode(subtitleMode);\n if (subtitleMode === \"off\") setActiveCue(null);\n }, [subtitleMode, applySubtitleMode]);\n\n // Apply playback rate\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n video.playbackRate = playbackRate;\n }, [playbackRate]);\n\n // Read active cue from native track and expose it for custom rendering\n const subtitleModeRef = useRef(subtitleMode);\n useEffect(() => {\n subtitleModeRef.current = subtitleMode;\n }, [subtitleMode]);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const onCueChange = () => {\n const mode = subtitleModeRef.current;\n if (mode === \"off\") {\n setActiveCue(null);\n return;\n }\n const track = Array.from(video.textTracks).find(\n (t) => t.language === mode && t.kind !== \"metadata\",\n );\n if (!track || !track.activeCues || track.activeCues.length === 0) {\n setActiveCue(null);\n return;\n }\n const cue = track.activeCues[0] as VTTCue;\n setActiveCue(cue.text.replace(/<[^>]*>/g, \"\"));\n };\n\n const bindTracks = () => {\n Array.from(video.textTracks).forEach((t) => {\n if (t.kind === \"metadata\") return;\n t.removeEventListener(\"cuechange\", onCueChange);\n t.addEventListener(\"cuechange\", onCueChange);\n });\n applySubtitleMode(subtitleModeRef.current);\n };\n\n bindTracks();\n video.textTracks.addEventListener(\"addtrack\", bindTracks);\n return () => {\n video.textTracks.removeEventListener(\"addtrack\", bindTracks);\n Array.from(video.textTracks).forEach((t) =>\n t.removeEventListener(\"cuechange\", onCueChange),\n );\n };\n }, []);\n\n useEffect(() => {\n const video = videoRef.current as WebkitVideoElement | null;\n\n const onFullscreenChange = () => {\n const doc = document as FullscreenCapableDocument;\n const nativeFullscreen = Boolean(\n document.fullscreenElement || doc.webkitFullscreenElement,\n );\n const iosVideoFullscreen = Boolean(video?.webkitDisplayingFullscreen);\n setIsFullscreen(nativeFullscreen || iosVideoFullscreen);\n };\n\n document.addEventListener(\"fullscreenchange\", onFullscreenChange);\n document.addEventListener(\n \"webkitfullscreenchange\",\n onFullscreenChange as EventListener,\n );\n video?.addEventListener(\n \"webkitbeginfullscreen\",\n onFullscreenChange as EventListener,\n );\n video?.addEventListener(\n \"webkitendfullscreen\",\n onFullscreenChange as EventListener,\n );\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n document.removeEventListener(\n \"webkitfullscreenchange\",\n onFullscreenChange as EventListener,\n );\n video?.removeEventListener(\n \"webkitbeginfullscreen\",\n onFullscreenChange as EventListener,\n );\n video?.removeEventListener(\n \"webkitendfullscreen\",\n onFullscreenChange as EventListener,\n );\n };\n }, []);\n\n useEffect(() => {\n const player = playerRef.current;\n if (!player) return;\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n setPlayerHeight(entry.contentRect.height);\n setPlayerWidth(entry.contentRect.width);\n }\n });\n ro.observe(player);\n return () => ro.disconnect();\n }, []);\n\n // Storyboard loading — supports both legacy single VTT and multi-resolution\n useEffect(() => {\n let cancelled = false;\n\n async function loadStoryboard() {\n if (!parsed.storyboard) { setStoryboardCues([]); setActiveStoryboardRes(null); return; }\n\n // Inline frames take priority\n if (parsed.storyboard.frames.length > 0) {\n setStoryboardCues(parsed.storyboard.frames);\n return;\n }\n\n // Multi-resolution path: load lowest resolution immediately\n const resolutions = parsed.storyboard.resolutions;\n if (resolutions && Object.keys(resolutions).length > 0) {\n storyboardCacheRef.current.clear();\n preloadedSpritesRef.current.clear();\n\n // Resolution priority: lowest first for initial load\n const RES_ORDER = [\"180p\", \"240p\", \"360p\", \"480p\", \"default\"];\n const keys = Object.keys(resolutions).sort((a, b) => {\n const ai = RES_ORDER.indexOf(a); const bi = RES_ORDER.indexOf(b);\n return (ai === -1 ? 99 : ai) - (bi === -1 ? 99 : bi);\n });\n\n // Load each resolution and cache it\n const loadRes = async (key: string) => {\n if (cancelled) return;\n const res = resolutions[key];\n if (!res) return;\n let cues: StoryboardFrameProps[] = [];\n if (res.vttText) {\n cues = parseStoryboardVtt(res.vttText, res.spriteUrl);\n } else {\n // Fallback: single-image cue spanning entire video\n cues = [{ start: 0, end: Number.MAX_SAFE_INTEGER, image: res.spriteUrl, w: res.tileW, h: res.tileH }];\n }\n storyboardCacheRef.current.set(key, cues);\n // Preload sprite image\n if (!preloadedSpritesRef.current.has(res.spriteUrl)) {\n preloadedSpritesRef.current.add(res.spriteUrl);\n const img = new window.Image();\n img.src = res.spriteUrl;\n }\n return cues;\n };\n\n // Load lowest res immediately, show it\n const firstKey = keys[0]!;\n const firstCues = await loadRes(firstKey);\n if (!cancelled && firstCues) {\n setStoryboardCues(firstCues);\n setActiveStoryboardRes(firstKey);\n }\n\n // Load remaining resolutions in background\n for (const key of keys.slice(1)) {\n await loadRes(key);\n }\n return;\n }\n\n // Legacy single VTT src\n if (!parsed.storyboard.src) {\n setStoryboardCues([]);\n return;\n }\n try {\n const response = await fetch(parsed.storyboard.src);\n if (!response.ok) throw new Error(\"Storyboard not found\");\n const text = await response.text();\n const cues = parseStoryboardVtt(text, new URL(parsed.storyboard.src, window.location.href).href);\n if (!cancelled) setStoryboardCues(cues);\n } catch {\n if (!cancelled && parsed.storyboard.fallbackImage) {\n setStoryboardCues([{\n start: 0, end: Number.MAX_SAFE_INTEGER,\n image: parsed.storyboard.fallbackImage,\n w: parsed.storyboard.width ?? 160, h: parsed.storyboard.height ?? 90,\n }]);\n }\n }\n }\n\n loadStoryboard();\n return () => { cancelled = true; };\n }, [parsed.storyboard]);\n\n useEffect(() => {\n const video = videoRef.current;\n let cancelled = false;\n\n if (!video || !activeSource) {\n setIsLoading(false);\n return;\n }\n\n destroyMediaEngines();\n\n setIsLoading(true);\n setCurrentTime(0);\n setBufferedTime(0);\n setDuration(0);\n setSelectedQuality(\"auto\");\n setQualities([AUTO_QUALITY]);\n setAudioTracks([]);\n setSelectedAudio(0);\n closeSettings();\n\n video.pause();\n video.removeAttribute(\"src\");\n video.load();\n\n const sourceType = inferSourceType(activeSource);\n\n if (sourceType === \"dash\") {\n void (async () => {\n try {\n const dashModule = await import(\"dashjs\");\n if (cancelled) return;\n\n const dashjs = dashModule as any;\n const dash = dashjs.MediaPlayer().create();\n dashRef.current = dash;\n\n dash.updateSettings({\n streaming: {\n abr: {\n autoSwitchBitrate: {\n video: true,\n },\n },\n },\n });\n\n dash.on(dashjs.MediaPlayer.events.STREAM_INITIALIZED, () => {\n const bitrates = dash.getBitrateInfoListFor(\"video\") ?? [];\n\n setQualities([\n AUTO_QUALITY,\n ...bitrates.map((item: any, index: number) => ({\n id: `dash-${index}`,\n label: item.height\n ? `${item.height}p`\n : `${Math.round((item.bitrate ?? 0) / 1000)} kbps`,\n type: \"dash\" as const,\n index,\n })),\n ]);\n\n setIsLoading(false);\n });\n\n dash.on(dashjs.MediaPlayer.events.ERROR, () => {\n console.error(\"[Silo] MPEG-DASH playback failed\");\n setIsLoading(false);\n });\n\n dash.initialize(video, activeSource.src, false);\n } catch {\n if (!cancelled) {\n console.error(\"[Silo] MPEG-DASH player load failed\");\n setIsLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n destroyMediaEngines();\n };\n }\n\n if (sourceType === \"hls\") {\n void (async () => {\n try {\n const HlsModule = await import(\"hls.js\");\n if (cancelled) return;\n\n const Hls = HlsModule.default;\n\n console.debug(\"[Silo/hls] Hls.isSupported()=\", Hls.isSupported());\n\n if (Hls.isSupported()) {\n const hls = new Hls({\n enableWorker: true,\n // Buffer ~20s ahead (≈1/6 of a 2min video). maxMaxBufferLength caps the\n // absolute ceiling so HLS.js doesn't buffer the entire file on fast connections.\n maxBufferLength: 20,\n maxMaxBufferLength: 30,\n maxBufferSize: 40 * 1000 * 1000,\n // Keep only 10s of back-buffer for seeking — avoids holding GB of 4K data\n backBufferLength: 10,\n maxBufferHole: 0.5,\n highBufferWatchdogPeriod: 5,\n nudgeOffset: 0.2,\n nudgeMaxRetry: 3,\n startLevel: -1,\n abrBandWidthFactor: 0.95,\n abrBandWidthUpFactor: 0.7,\n abrEwmaDefaultEstimate: 5_000_000,\n });\n\n hlsRef.current = hls;\n\n // Track explicit user selections so ABR / HLS internals can't override them\n let pinnedLevel = -1; // -1 = ABR auto; ≥0 = user locked\n let pinnedAudio = -1; // -1 = not set; ≥0 = user locked\n\n console.debug(\"[Silo/hls] loadSource\", activeSource.src);\n hls.loadSource(activeSource.src);\n hls.attachMedia(video);\n\n hls.on(Hls.Events.MANIFEST_PARSED, (_: any, data: any) => {\n const levels = data.levels ?? hls.levels ?? [];\n console.debug(\"[Silo/hls] MANIFEST_PARSED levels=\", levels.length, \"audioTracks=\", hls.audioTracks?.length ?? 0);\n\n const hdrSupported = deviceSupportsHdr();\n const opusSupported = deviceSupportsOpus();\n\n setQualities([\n AUTO_QUALITY,\n ...levels.map((level: any, index: number) => {\n const hdr = isHdrLevel(level);\n const codecStr = level.videoCodec ?? level.attrs?.CODECS ?? \"\";\n const supported = hdr ? hdrSupported : deviceSupportsCodec(codecStr);\n const baseName = level.name ?? (level.height ? `${level.height}p` : `${index + 1}`);\n const label = hdr ? `${baseName} HDR` : baseName;\n return { id: `hls-${index}`, label, type: \"hls\" as const, index, supported, hdr };\n }),\n ]);\n\n const tracks: any[] = hls.audioTracks ?? [];\n console.debug(\"[Silo/hls] audio tracks:\", tracks.map((t: any) => ({ name: t.name, lang: t.lang, url: t.url })));\n if (tracks.length > 1) {\n setAudioTracks(\n tracks.map((t: any, i: number) => {\n const codec = t.attrs?.CODECS ?? t.codecSet ?? \"\";\n const supported = isHdrAudioCodec(codec) ? opusSupported : true;\n return { id: i, label: t.name ?? t.lang ?? `Track ${i + 1}`, supported };\n }),\n );\n // Only set default audio if user hasn't pinned one yet\n if (pinnedAudio === -1) setSelectedAudio(hls.audioTrack ?? 0);\n }\n\n // Restore pinned selections if manifest reloaded (source change)\n if (pinnedLevel >= 0) hls.currentLevel = pinnedLevel;\n if (pinnedAudio >= 0) hls.audioTrack = pinnedAudio;\n\n setIsLoading(false);\n });\n\n hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, (_: any, data: any) => {\n const tracks: any[] = data.audioTracks ?? [];\n console.debug(\"[Silo/hls] AUDIO_TRACKS_UPDATED\", tracks.length);\n const opusSupported = deviceSupportsOpus();\n if (tracks.length > 1) {\n setAudioTracks(\n tracks.map((t: any, i: number) => {\n const codec = t.attrs?.CODECS ?? t.codecSet ?? \"\";\n const supported = isHdrAudioCodec(codec) ? opusSupported : true;\n return { id: i, label: t.name ?? t.lang ?? `Track ${i + 1}`, supported };\n }),\n );\n }\n // Re-apply pinned audio if HLS reset it\n if (pinnedAudio >= 0 && hls.audioTrack !== pinnedAudio) {\n hls.audioTrack = pinnedAudio;\n }\n });\n\n // After the switch completes: lock currentLevel so ABR can't override,\n // and re-apply pinned audio (level switches can reset the audio track).\n hls.on(Hls.Events.LEVEL_SWITCHED, (_: any, data: any) => {\n console.debug(\"[Silo/hls] LEVEL_SWITCHED\", data.level);\n // Lock currentLevel only once we've actually landed on the pinned level.\n // At this point the old buffer is consumed — safe to lock without flush.\n if (pinnedLevel >= 0 && data.level === pinnedLevel) {\n hls.currentLevel = pinnedLevel;\n }\n if (pinnedAudio >= 0 && hls.audioTrack !== pinnedAudio) {\n hls.audioTrack = pinnedAudio;\n }\n });\n\n // Expose pin setters on the hls instance so changeQuality/changeAudio can write them\n (hls as any).__pinLevel = (level: number) => { pinnedLevel = level; };\n (hls as any).__pinAudio = (track: number) => { pinnedAudio = track; };\n\n hls.on(Hls.Events.LEVEL_LOADED, (_: any, data: any) => {\n console.debug(\"[Silo/hls] LEVEL_LOADED level=\", data.level, \"fragments=\", data.details?.fragments?.length);\n });\n\n hls.on(Hls.Events.AUDIO_TRACK_LOADED, (_: any, data: any) => {\n console.debug(\"[Silo/hls] AUDIO_TRACK_LOADED track=\", data.id, \"fragments=\", data.details?.fragments?.length);\n });\n\n hls.on(Hls.Events.FRAG_LOADING, (_: any, data: any) => {\n console.debug(\"[Silo/hls] FRAG_LOADING\", data.frag?.type, data.frag?.url?.slice(-60));\n });\n\n hls.on(Hls.Events.FRAG_LOADED, (_: any, data: any) => {\n console.debug(\"[Silo/hls] FRAG_LOADED\", data.frag?.type, data.frag?.sn);\n });\n\n let mediaErrorAttempts = 0;\n let audioAppendErrors = 0;\n let stalledOnPinnedLevel = 0;\n hls.on(Hls.Events.ERROR, (_: any, data: any) => {\n const fragUrl = (data.frag?.url ?? data.url ?? \"\").slice(-80);\n const fragType = data.frag?.type ?? \"?\";\n console.debug(\"[Silo/hls] ERROR fatal=\", data.fatal, \"type=\", data.type, \"details=\", data.details, \"fragType=\", fragType, \"url=\", fragUrl);\n\n if (!data.fatal) {\n // Audio buffer append loop — after 3 failures disable demuxed audio tracks\n const isAudioBufError =\n fragType === \"audio\" &&\n (data.details === Hls.ErrorDetails.BUFFER_APPEND_ERROR ||\n data.details === Hls.ErrorDetails.BUFFER_APPENDING_ERROR);\n if (isAudioBufError) {\n audioAppendErrors += 1;\n if (audioAppendErrors >= 3) {\n console.warn(\"[Silo/hls] repeated audio buffer errors — disabling separate audio tracks\");\n setAudioTracks([]);\n try { hls.audioTrack = -1; } catch { /* ignore */ }\n audioAppendErrors = 0;\n }\n } else {\n audioAppendErrors = 0;\n }\n\n // bufferStalledError on a user-pinned level means the network can't sustain\n // that quality. After 4 stalls, unpin and step down one level so HLS can\n // recover without the user having to manually change quality.\n if (data.details === Hls.ErrorDetails.BUFFER_STALLED_ERROR && pinnedLevel >= 0) {\n stalledOnPinnedLevel += 1;\n if (stalledOnPinnedLevel >= 4) {\n stalledOnPinnedLevel = 0;\n const nextLevel = Math.max(0, pinnedLevel - 1);\n console.warn(\"[Silo/hls] repeated stalls on pinned level\", pinnedLevel, \"— stepping down to\", nextLevel);\n pinnedLevel = nextLevel;\n hls.currentLevel = nextLevel;\n setSelectedQuality(nextLevel === 0 ? \"auto\" : `hls-${nextLevel}`);\n }\n } else if (data.details !== Hls.ErrorDetails.BUFFER_STALLED_ERROR) {\n stalledOnPinnedLevel = 0;\n }\n\n return;\n }\n\n // fragParsingError on an audio fragment → likely unsupported audio codec in\n // the separate-audio track (e.g. AC-3 on a browser that can't decode it).\n // Drop all audio tracks and retry with video-only; playback should continue.\n if (data.details === Hls.ErrorDetails.FRAG_PARSING_ERROR && fragType === \"audio\") {\n console.warn(\"[Silo/hls] audio frag parse failed — disabling separate audio tracks and retrying\");\n setAudioTracks([]);\n hls.recoverMediaError();\n return;\n }\n\n if (data.type === Hls.ErrorTypes.MEDIA_ERROR && mediaErrorAttempts < 2) {\n mediaErrorAttempts += 1;\n console.debug(\"[Silo/hls] recoverMediaError attempt\", mediaErrorAttempts);\n hls.recoverMediaError();\n return;\n }\n\n console.error(\"[Silo] HLS playback failed\", data.details, \"fragType=\", fragType, \"url=\", fragUrl);\n hls.destroy();\n hlsRef.current = null;\n setIsLoading(false);\n });\n\n video.addEventListener(\"waiting\", () => console.debug(\"[Silo/hls] video:waiting readyState=\", video.readyState, \"played=\", video.played.length));\n video.addEventListener(\"canplay\", () => console.debug(\"[Silo/hls] video:canplay readyState=\", video.readyState));\n video.addEventListener(\"stalled\", () => console.debug(\"[Silo/hls] video:stalled\"));\n video.addEventListener(\"suspend\", () => console.debug(\"[Silo/hls] video:suspend\"));\n\n return;\n }\n\n if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n console.debug(\"[Silo/hls] using native HLS (Safari)\");\n video.src = activeSource.src;\n video.load();\n setIsLoading(false);\n return;\n }\n\n console.error(\"[Silo] HLS not supported in this browser\");\n setIsLoading(false);\n } catch {\n if (!cancelled) {\n console.error(\"[Silo] HLS player load failed\");\n setIsLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n destroyMediaEngines();\n };\n }\n\n video.src = activeSource.src;\n video.load();\n setIsLoading(false);\n\n return () => {\n cancelled = true;\n video.removeAttribute(\"src\");\n video.load();\n };\n }, [activeSource, destroyMediaEngines]);\n\n const togglePlay = useCallback(async () => {\n const video = videoRef.current;\n if (!video) return;\n\n const wasPaused = video.paused;\n\n try {\n if (wasPaused) {\n // Wait for enough data if the browser isn't ready (e.g. after a seek)\n if (video.readyState < HTMLMediaElement.HAVE_FUTURE_DATA) {\n await new Promise<void>((resolve) => {\n const onReady = () => { video.removeEventListener(\"canplay\", onReady); resolve(); };\n video.addEventListener(\"canplay\", onReady);\n });\n }\n await video.play();\n } else {\n video.pause();\n }\n if (clickIconTimerRef.current)\n window.clearTimeout(clickIconTimerRef.current);\n setClickIcon(wasPaused ? \"play\" : \"pause\");\n clickIconTimerRef.current = window.setTimeout(\n () => setClickIcon(null),\n 600,\n );\n } catch {\n // Autoplay policy or seek-in-progress — silently ignore\n }\n }, []);\n\n const seekRelative = useCallback((seconds: number) => {\n const video = videoRef.current;\n if (!video) return;\n\n video.currentTime = Math.max(\n 0,\n Math.min(video.currentTime + seconds, video.duration || 0),\n );\n }, []);\n\n const toggleFullscreen = useCallback(async () => {\n const player = playerRef.current as FullscreenCapableElement | null;\n const video = videoRef.current as WebkitVideoElement | null;\n const doc = document as FullscreenCapableDocument;\n\n if (!player && !video) return;\n\n try {\n const nativeFullscreen = Boolean(\n document.fullscreenElement || doc.webkitFullscreenElement,\n );\n const iosVideoFullscreen = Boolean(video?.webkitDisplayingFullscreen);\n\n if (nativeFullscreen || iosVideoFullscreen) {\n if (document.fullscreenElement && document.exitFullscreen) {\n await document.exitFullscreen();\n return;\n }\n\n if (doc.webkitExitFullscreen) {\n await doc.webkitExitFullscreen();\n return;\n }\n\n if (video?.webkitExitFullscreen) {\n video.webkitExitFullscreen();\n return;\n }\n\n return;\n }\n\n if (player?.requestFullscreen) {\n await player.requestFullscreen();\n return;\n }\n\n if (player?.webkitRequestFullscreen) {\n await player.webkitRequestFullscreen();\n return;\n }\n\n if (video?.webkitEnterFullscreen) {\n video.webkitEnterFullscreen();\n return;\n }\n\n if (video?.requestFullscreen) {\n await video.requestFullscreen();\n return;\n }\n\n throw new Error(\"Fullscreen unavailable\");\n } catch {\n console.error(\"[Silo] Fullscreen toggle failed\");\n }\n }, []);\n\n const changeAudio = useCallback((trackId: number) => {\n setSelectedAudio(trackId);\n closeSettings();\n if (hlsRef.current) {\n // Pin the user's choice so it survives quality switches and manifest reloads\n (hlsRef.current as any).__pinAudio?.(trackId);\n hlsRef.current.audioTrack = trackId;\n }\n }, [closeSettings]);\n\n const changeQuality = useCallback(\n (qualityId: string) => {\n const option = qualities.find((quality) => quality.id === qualityId);\n if (!option) return;\n\n setSelectedQuality(qualityId);\n closeSettings();\n\n if (option.type === \"auto\") {\n if (hlsRef.current) {\n // Clear pin — let ABR decide\n (hlsRef.current as any).__pinLevel?.(-1);\n hlsRef.current.currentLevel = -1;\n }\n\n if (dashRef.current) {\n dashRef.current.updateSettings({\n streaming: {\n abr: {\n autoSwitchBitrate: {\n video: true,\n },\n },\n },\n });\n }\n\n return;\n }\n\n if (option.type === \"hls\" && hlsRef.current && option.index != null) {\n // Pin so LEVEL_SWITCHED handler can lock currentLevel once the switch lands.\n (hlsRef.current as any).__pinLevel?.(option.index);\n // nextLevel: schedules the quality change at the next segment boundary.\n // The existing buffer at the current quality keeps playing uninterrupted —\n // no flush, no freeze. currentLevel is locked in the LEVEL_SWITCHED handler\n // after the switch completes, preventing ABR from overriding afterwards.\n hlsRef.current.nextLevel = option.index;\n return;\n }\n\n if (option.type === \"dash\" && dashRef.current && option.index != null) {\n dashRef.current.updateSettings({\n streaming: {\n abr: {\n autoSwitchBitrate: {\n video: false,\n },\n },\n },\n });\n\n dashRef.current.setQualityFor(\"video\", option.index);\n }\n },\n [qualities, closeSettings],\n );\n\n const seekFromPointer = useCallback(\n (clientX: number) => {\n const video = videoRef.current;\n const progress = progressRef.current;\n if (!video || !progress || !duration) return;\n const rect = progress.getBoundingClientRect();\n const x = Math.max(0, Math.min(clientX - rect.left, rect.width));\n const nextTime = (x / rect.width) * duration;\n video.currentTime = nextTime;\n setCurrentTime(nextTime);\n },\n [duration],\n );\n\n // Adaptive storyboard resolution — upgrade to highest loaded res when hovering progress bar\n const upgradeStoryboardResolution = useCallback((hoverTime: number) => {\n const resolutions = parsed.storyboard?.resolutions;\n if (!resolutions || storyboardCacheRef.current.size === 0) return;\n\n const RES_ORDER = [\"480p\", \"360p\", \"240p\", \"180p\", \"default\"];\n const conn = typeof navigator !== \"undefined\" ? (navigator as any).connection : null;\n // On slow connections cap at 240p for mouse hover\n const maxRes = conn?.effectiveType === \"2g\" ? \"180p\" : conn?.effectiveType === \"3g\" ? \"240p\" : \"480p\";\n const maxIdx = RES_ORDER.indexOf(maxRes);\n\n for (let i = 0; i <= maxIdx; i++) {\n const key = RES_ORDER[i]!;\n if (storyboardCacheRef.current.has(key)) {\n if (activeStoryboardRes !== key) {\n setStoryboardCues(storyboardCacheRef.current.get(key)!);\n setActiveStoryboardRes(key);\n // Preload sprite image at new resolution\n const spriteUrl = resolutions[key]?.spriteUrl;\n if (spriteUrl && !preloadedSpritesRef.current.has(spriteUrl)) {\n preloadedSpritesRef.current.add(spriteUrl);\n const img = new window.Image();\n img.src = spriteUrl;\n }\n }\n break;\n }\n }\n\n // Preload sprites around hover time for the best available resolution\n const bestKey = [...storyboardCacheRef.current.keys()].sort((a, b) => {\n const order = [\"480p\", \"360p\", \"240p\", \"180p\", \"default\"];\n return order.indexOf(a) - order.indexOf(b);\n })[0];\n if (bestKey) {\n const cues = storyboardCacheRef.current.get(bestKey) ?? [];\n // Find 3 cues around hoverTime and preload their sprites\n const nearIdx = cues.findIndex((c) => c.start > hoverTime);\n const window2 = cues.slice(Math.max(0, nearIdx - 2), nearIdx + 3);\n for (const c of window2) {\n if (!preloadedSpritesRef.current.has(c.image)) {\n preloadedSpritesRef.current.add(c.image);\n const img = new window.Image();\n img.src = c.image;\n }\n }\n }\n }, [parsed.storyboard?.resolutions, activeStoryboardRes]);\n\n // Preload storyboard tiles around currentTime (video playhead) at low resolution\n useEffect(() => {\n const resolutions = parsed.storyboard?.resolutions;\n if (!resolutions || storyboardCacheRef.current.size === 0 || !duration) return;\n\n // Use lowest available resolution for background preload around playhead\n const RES_ORDER = [\"180p\", \"240p\", \"360p\", \"480p\", \"default\"];\n const lowestKey = RES_ORDER.find((k) => storyboardCacheRef.current.has(k));\n if (!lowestKey) return;\n\n const cues = storyboardCacheRef.current.get(lowestKey) ?? [];\n const playheadIdx = cues.findIndex((c) => c.start > currentTime);\n // Preload 5 cues ahead and 2 behind the playhead\n const nearby = cues.slice(Math.max(0, playheadIdx - 2), playheadIdx + 6);\n for (const c of nearby) {\n if (!preloadedSpritesRef.current.has(c.image)) {\n preloadedSpritesRef.current.add(c.image);\n const img = new window.Image();\n img.src = c.image;\n }\n }\n }, [Math.floor(currentTime / 10), parsed.storyboard?.resolutions, duration]); // check every 10s\n\n const updatePreview = useCallback(\n (clientX: number) => {\n const progress = progressRef.current;\n if (!progress || !duration || storyboardCues.length === 0) {\n setPreview(null);\n return;\n }\n const rect = progress.getBoundingClientRect();\n const x = Math.max(0, Math.min(clientX - rect.left, rect.width));\n const time = (x / rect.width) * duration;\n\n // Upgrade to higher resolution when mouse is on the progress bar\n upgradeStoryboardResolution(time);\n\n const cue = findStoryboardCue(storyboardCues, time);\n if (!cue) {\n setPreview(null);\n return;\n }\n setPreview({\n cue,\n time,\n left: Math.max(80, Math.min(x, rect.width - 80)),\n });\n },\n [duration, storyboardCues, upgradeStoryboardResolution],\n );\n\n const handleProgressPointerMove = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n updatePreview(event.clientX);\n if (isDragging) seekFromPointer(event.clientX);\n },\n [isDragging, seekFromPointer, updatePreview],\n );\n\n const handleProgressPointerEnter = useCallback(() => {\n setIsHoveringProgress(true);\n }, []);\n\n const handleProgressPointerLeave = useCallback(() => {\n setIsHoveringProgress(false);\n if (!isDragging) {\n setPreview(null);\n // Downgrade back to lowest resolution when mouse leaves the progress bar\n const resolutions = parsed.storyboard?.resolutions;\n if (resolutions && storyboardCacheRef.current.size > 0) {\n const RES_ORDER = [\"180p\", \"240p\", \"360p\", \"480p\", \"default\"];\n const lowestKey = RES_ORDER.find((k) => storyboardCacheRef.current.has(k));\n if (lowestKey && activeStoryboardRes !== lowestKey) {\n setStoryboardCues(storyboardCacheRef.current.get(lowestKey)!);\n setActiveStoryboardRes(lowestKey);\n }\n }\n }\n }, [isDragging, parsed.storyboard?.resolutions, activeStoryboardRes]);\n\n const handleProgressPointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n const progress = progressRef.current;\n if (!progress) return;\n progress.setPointerCapture(event.pointerId);\n dragPointerIdRef.current = event.pointerId;\n setIsDragging(true);\n seekFromPointer(event.clientX);\n updatePreview(event.clientX);\n },\n [seekFromPointer, updatePreview],\n );\n\n const handleProgressPointerUp = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n if (dragPointerIdRef.current === event.pointerId) {\n setIsDragging(false);\n dragPointerIdRef.current = null;\n setPreview(null);\n }\n },\n [],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n const tagName = target.tagName.toLowerCase();\n\n if ([\"input\", \"select\", \"button\"].includes(tagName)) {\n return;\n }\n\n if (event.key === \" \") {\n event.preventDefault();\n togglePlay();\n }\n\n if (event.key === \"ArrowRight\") {\n seekRelative(10);\n }\n\n if (event.key === \"ArrowLeft\") {\n seekRelative(-10);\n }\n\n if (event.key.toLowerCase() === \"f\") {\n toggleFullscreen();\n }\n\n if (event.key.toLowerCase() === \"m\") {\n setIsMuted((value) => !value);\n }\n },\n [seekRelative, toggleFullscreen, togglePlay],\n );\n\n if (!activeSource) {\n return (\n <div className=\"rounded-xl border border-red-200 bg-red-50 p-4 text-sm text-red-700\">\n O componente Video precisa de pelo menos um <code>{\"<Source />\"}</code>.\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={`@container mx-auto w-full max-w-6xl${className ?? \"\"}`}\n >\n <div\n ref={playerRef}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onMouseMove={showControlsTemporarily}\n onMouseLeave={() => {\n closeSettings();\n if (isPlaying && autoHideControls) {\n setControlsVisible(false);\n }\n }}\n onBlur={(e) => {\n // Close menus when focus leaves the player entirely\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n closeSettings();\n }\n }}\n onTouchStart={showControlsTemporarily}\n onTouchMove={showControlsTemporarily}\n className=\"relative w-full overflow-hidden rounded-[14px] bg-black shadow-[0_30px_90px_rgba(15,15,15,0.22)] outline-none ring-1 ring-black/5\"\n style={\n fixedHeight\n ? {\n height:\n typeof fixedHeight === \"number\"\n ? `${fixedHeight}px`\n : fixedHeight,\n }\n : maxHeight\n ? {\n maxHeight:\n typeof maxHeight === \"number\"\n ? `${maxHeight}px`\n : maxHeight,\n aspectRatio: \"16/9\",\n }\n : { aspectRatio: \"16/9\" }\n }\n >\n <video\n ref={videoRef}\n className=\"h-full w-full object-contain\"\n playsInline\n preload=\"metadata\"\n crossOrigin=\"anonymous\"\n >\n {captions.map((subtitle) => (\n <track\n key={`${activeSource.src}-${subtitle.srclang}-${subtitle.src}`}\n kind=\"subtitles\"\n src={subtitle.src}\n srcLang={subtitle.srclang}\n label={subtitle.label}\n default={subtitle.default}\n />\n ))}\n {parsed.storyboard?.src && (\n <track\n kind=\"metadata\"\n label=\"thumbnails\"\n src={parsed.storyboard.src}\n />\n )}\n </video>\n\n {/* Poster overlay — shown only before first play */}\n {poster && !hasPlayed && (\n <img\n src={poster}\n aria-hidden\n className=\"pointer-events-none absolute inset-0 h-full w-full object-contain bg-black\"\n />\n )}\n\n {/* Age rating overlay — driven by GSAP timeline, always mounted */}\n {parsed.ageRating?.data && (() => {\n const ar = parsed.ageRating!;\n const regionKey = resolveAgeRatingRegion(ar.locale, ar.data!);\n if (!regionKey) return null;\n const code = ar.data![regionKey];\n const lookupKey = `${regionKey}:${code}`;\n const info = ar.lookup?.[lookupKey];\n return (\n <div\n ref={ageRatingWrapRef}\n className=\"pointer-events-none absolute inset-0 z-20 flex items-start justify-start\"\n style={{\n opacity: 0,\n background: \"linear-gradient(135deg, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.4) 40%, transparent 65%)\",\n }}\n >\n <div className=\"flex items-center gap-3.5 px-5 pt-5 @sm:px-7 @sm:pt-7\">\n <div ref={ageRatingIconRef} style={{ opacity: 0 }}>\n {info?.imageUrl ? (\n <img src={info.imageUrl} alt={code} className=\"h-14 w-auto object-contain @sm:h-16 drop-shadow-[0_2px_8px_rgba(0,0,0,0.6)]\" />\n ) : (\n <span className=\"flex h-14 min-w-14 items-center justify-center rounded-md border-2 border-white/40 px-2 text-lg font-bold text-white @sm:h-16 @sm:min-w-16 @sm:text-xl drop-shadow-[0_2px_8px_rgba(0,0,0,0.6)]\">\n {code}\n </span>\n )}\n </div>\n {(info?.title || info?.description) && (\n <div ref={ageRatingTextRef} className=\"flex flex-col gap-0.5\" style={{ opacity: 0 }}>\n {info.title && <span className=\"text-sm font-semibold text-white @sm:text-base drop-shadow-[0_1px_4px_rgba(0,0,0,0.8)]\">{info.title}</span>}\n {info.description && <span className=\"text-xs text-white/70 leading-snug max-w-56 @sm:text-sm @sm:max-w-72 drop-shadow-[0_1px_4px_rgba(0,0,0,0.8)]\">{info.description}</span>}\n </div>\n )}\n </div>\n </div>\n );\n })()}\n\n {/* Click feedback / action icon — no background, shows briefly only on action */}\n <div\n ref={clickIconRef}\n className=\"pointer-events-none absolute inset-0 z-10 grid place-items-center\"\n style={{ opacity: 0 }}\n >\n <span className=\"grid size-10 place-items-center text-white drop-shadow-[0_2px_12px_rgba(0,0,0,0.8)] @sm:size-14 @lg:size-16\">\n {clickIcon === \"pause\" ? (\n <Pause className=\"size-7 @sm:size-9 @lg:size-11\" fill=\"white\" />\n ) : (\n <Play\n className=\"ml-0.5 size-7 @sm:size-9 @lg:size-11\"\n fill=\"white\"\n />\n )}\n </span>\n </div>\n\n {isLoading && (\n <div className=\"pointer-events-none absolute inset-0 z-20 grid place-items-center bg-black/10\">\n <div className=\"size-9 animate-spin rounded-full border-2 border-white/25 border-t-white\" />\n </div>\n )}\n\n\n <div\n ref={chromeRef}\n onClick={togglePlay}\n className={`absolute inset-0 z-30 flex flex-col ${\n isFullscreen ? \"justify-between\" : \"justify-end\"\n }`}\n >\n {/* Top gradient — only in fullscreen */}\n {isFullscreen && (\n <div className=\"pointer-events-none absolute inset-x-0 top-0 h-32 bg-linear-to-b from-black/70 to-transparent\" />\n )}\n {/* Bottom gradient */}\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-40 bg-linear-to-t from-black/80 to-transparent\" />\n\n {isFullscreen && (\n <header\n onClick={(e) => e.stopPropagation()}\n className=\"relative z-10 flex items-start px-4 pt-4 text-white @sm:px-7 @sm:pt-7 @lg:px-9 @lg:pt-8\"\n >\n <div>\n {title && (\n <h1\n className=\"text-sm font-bold tracking-wide @sm:text-base @md:text-lg @lg:text-xl\"\n style={{ textShadow: \"0 1px 6px rgba(0,0,0,0.6)\" }}\n >\n {title}\n </h1>\n )}\n\n {description && (\n <p className=\"mt-1 text-xs font-medium text-white/85 @sm:text-sm\">\n {description}\n </p>\n )}\n </div>\n </header>\n )}\n\n <footer\n onClick={(e) => e.stopPropagation()}\n className=\"relative z-10 px-4 pb-4 text-white\"\n >\n {/* Settings panel — nested, one sub-menu at a time */}\n {settingsOpen && (\n <>\n <div\n className=\"fixed inset-0 z-70\"\n onClick={closeSettings}\n />\n <div\n ref={settingsPanelRef}\n className=\"absolute bottom-full right-2 z-70 mb-2 overflow-hidden rounded-2xl bg-[#1c1c1e]/95 shadow-2xl backdrop-blur-xl ring-1 ring-white/10\"\n style={{\n width:\n Math.min(\n 224,\n Math.max(180, (playerWidth || 640) * 0.22),\n ) + \"px\",\n opacity: 0,\n }}\n >\n <div ref={settingsContentRef}>\n {/* Root menu */}\n {settingsTab === \"root\" && (\n <div>\n {(\n [\n {\n id: \"quality\" as SettingsTab,\n label: \"Qualidade\",\n value:\n qualities.find((q) => q.id === selectedQuality)\n ?.label ?? \"Auto\",\n },\n ...(captions.length > 0\n ? [\n {\n id: \"subtitles\" as SettingsTab,\n label: \"Legendas\",\n value:\n subtitleStyle.track === \"off\"\n ? \"Desligado\"\n : (captions.find(\n (s) =>\n s.srclang === subtitleStyle.track,\n )?.label ?? subtitleStyle.track),\n },\n ]\n : []),\n ...(audioTracks.length > 1\n ? [\n {\n id: \"audio\" as SettingsTab,\n label: \"Áudio\",\n value:\n audioTracks.find(\n (t) => t.id === selectedAudio,\n )?.label ?? \"\",\n },\n ]\n : []),\n {\n id: \"playback\" as SettingsTab,\n label: \"Velocidade\",\n value:\n playbackRate === 1\n ? \"Normal\"\n : `${playbackRate}×`,\n },\n ] as { id: SettingsTab; label: string; value: string }[]\n ).map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => setSettingsTab(item.id)}\n className=\"flex w-full items-center justify-between gap-3 px-4 py-3 text-sm transition hover:bg-white/8 first:pt-3.5 last:pb-3.5\"\n >\n <span className=\"text-white/80\">{item.label}</span>\n <span className=\"flex items-center gap-1.5 text-xs text-white/40\">\n {item.value}\n <svg\n className=\"size-3 opacity-50\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M4.5 3l3 3-3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </button>\n ))}\n </div>\n )}\n\n {/* Quality sub-menu */}\n {settingsTab === \"quality\" && (\n <div>\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"root\")}\n className=\"flex w-full items-center gap-2 border-b border-white/8 px-4 py-3 text-xs font-semibold text-white/50 transition hover:text-white\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M7.5 3L4.5 6l3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Qualidade\n </button>\n <div className=\"py-1.5\">\n {[...qualities].reverse().map((quality) => {\n const unavailable = quality.supported === false;\n return (\n <button\n key={quality.id}\n type=\"button\"\n onClick={() => {\n if (unavailable) return;\n changeQuality(quality.id);\n setSettingsTab(\"root\");\n }}\n disabled={unavailable}\n className={`flex w-full items-center gap-3 px-4 py-2.5 text-sm transition ${unavailable ? \"cursor-not-allowed opacity-40\" : \"hover:bg-white/8\"}`}\n >\n <svg\n className={`size-4 shrink-0 ${selectedQuality === quality.id ? \"text-white\" : \"text-transparent\"}`}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3 8l3.5 3.5L13 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"flex-1 text-left\">\n <span\n className={\n selectedQuality === quality.id\n ? \"font-semibold text-white\"\n : \"text-white/55\"\n }\n >\n {quality.label}\n {quality.id === \"auto\" ? \" (ABR)\" : \"\"}\n </span>\n {unavailable && (\n <span className=\"ml-1.5 text-[10px] text-white/30\">Não disponível</span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Subtitles sub-menu */}\n {settingsTab === \"subtitles\" && (\n <div>\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"root\")}\n className=\"flex w-full items-center gap-2 border-b border-white/8 px-4 py-3 text-xs font-semibold text-white/50 transition hover:text-white\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M7.5 3L4.5 6l3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Legendas\n </button>\n <div className=\"py-1.5\">\n {[\n { srclang: \"off\", label: \"Desligado\" },\n ...captions,\n ].map((s) => (\n <button\n key={s.srclang}\n type=\"button\"\n onClick={() => {\n const next =\n s.srclang === \"off\" ? \"off\" : s.srclang;\n setSubtitleMode(next);\n setSubtitleStyle((st) => ({\n ...st,\n track: next,\n }));\n }}\n className=\"flex w-full items-center gap-3 px-4 py-2.5 text-sm transition hover:bg-white/8\"\n >\n <svg\n className={`size-4 shrink-0 ${subtitleStyle.track === s.srclang ? \"text-white\" : \"text-transparent\"}`}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3 8l3.5 3.5L13 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span\n className={\n subtitleStyle.track === s.srclang\n ? \"font-semibold text-white\"\n : \"text-white/55\"\n }\n >\n {s.label}\n </span>\n </button>\n ))}\n </div>\n {subtitleStyle.track !== \"off\" && (\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"subtitles-style\")}\n className=\"flex w-full items-center justify-between gap-3 border-t border-white/8 px-4 py-3 text-sm transition hover:bg-white/8\"\n >\n <span className=\"text-white/60\">Aparência</span>\n <svg\n className=\"size-3 opacity-50\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M4.5 3l3 3-3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Subtitles style sub-menu */}\n {settingsTab === \"subtitles-style\" && (\n <div>\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"subtitles\")}\n className=\"flex w-full items-center gap-2 border-b border-white/8 px-4 py-3 text-xs font-semibold text-white/50 transition hover:text-white\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M7.5 3L4.5 6l3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Aparência\n </button>\n <div className=\"px-4 py-3 flex flex-col gap-3\">\n {/* Size */}\n <div>\n <p className=\"mb-1.5 text-xs font-semibold text-white/40 uppercase tracking-wide\">\n Tamanho\n </p>\n <div className=\"flex gap-1.5\">\n {(\n [\"small\", \"medium\", \"large\", \"xlarge\"] as const\n ).map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() =>\n setSubtitleStyle((st) => ({ ...st, size: s }))\n }\n className={`flex-1 rounded-lg py-1.5 text-xs font-medium transition${subtitleStyle.size === s ? \"bg-white/20 text-white\" : \"text-white/45 hover:bg-white/10\"}`}\n >\n {s === \"small\"\n ? \"P\"\n : s === \"medium\"\n ? \"M\"\n : s === \"large\"\n ? \"G\"\n : \"GG\"}\n </button>\n ))}\n </div>\n </div>\n {/* Color */}\n <div>\n <p className=\"mb-1.5 text-xs font-semibold text-white/40 uppercase tracking-wide\">\n Cor\n </p>\n <div className=\"flex gap-1.5\">\n {(\n [\n [\"white\", \"Branco\", \"#fff\"],\n [\"yellow\", \"Amarelo\", \"#facc15\"],\n [\"cyan\", \"Ciano\", \"#22d3ee\"],\n ] as const\n ).map(([val, label, color]) => (\n <button\n key={val}\n type=\"button\"\n onClick={() =>\n setSubtitleStyle((st) => ({\n ...st,\n color: val,\n }))\n }\n className={`flex-1 rounded-lg py-1.5 text-xs font-medium transition ring-1${subtitleStyle.color === val ? \"ring-white/40\" : \"ring-transparent hover:ring-white/15\"}`}\n style={{ color }}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n {/* Background */}\n <div>\n <p className=\"mb-1.5 text-xs font-semibold text-white/40 uppercase tracking-wide\">\n Fundo\n </p>\n <div className=\"flex gap-1.5\">\n {(\n [\n [\"none\", \"Nenhum\"],\n [\"semi\", \"Semi\"],\n [\"solid\", \"Sólido\"],\n ] as const\n ).map(([val, label]) => (\n <button\n key={val}\n type=\"button\"\n onClick={() =>\n setSubtitleStyle((st) => ({ ...st, bg: val }))\n }\n className={`flex-1 rounded-lg py-1.5 text-xs font-medium transition${subtitleStyle.bg === val ? \"bg-white/20 text-white\" : \"text-white/45 hover:bg-white/10\"}`}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Audio sub-menu */}\n {settingsTab === \"audio\" && (\n <div>\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"root\")}\n className=\"flex w-full items-center gap-2 border-b border-white/8 px-4 py-3 text-xs font-semibold text-white/50 transition hover:text-white\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M7.5 3L4.5 6l3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Áudio\n </button>\n <div className=\"py-1.5\">\n {audioTracks.map((track) => {\n const unavailable = track.supported === false;\n return (\n <button\n key={track.id}\n type=\"button\"\n onClick={() => {\n if (unavailable) return;\n changeAudio(track.id);\n setSettingsTab(\"root\");\n }}\n disabled={unavailable}\n className={`flex w-full items-center gap-3 px-4 py-2.5 text-sm transition ${unavailable ? \"cursor-not-allowed opacity-40\" : \"hover:bg-white/8\"}`}\n >\n <svg\n className={`size-4 shrink-0 ${selectedAudio === track.id ? \"text-white\" : \"text-transparent\"}`}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3 8l3.5 3.5L13 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"flex-1 text-left\">\n <span\n className={\n selectedAudio === track.id\n ? \"font-semibold text-white\"\n : \"text-white/55\"\n }\n >\n {track.label}\n </span>\n {unavailable && (\n <span className=\"ml-1.5 text-[10px] text-white/30\">Não disponível</span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Playback speed sub-menu */}\n {settingsTab === \"playback\" && (\n <div>\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"root\")}\n className=\"flex w-full items-center gap-2 border-b border-white/8 px-4 py-3 text-xs font-semibold text-white/50 transition hover:text-white\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M7.5 3L4.5 6l3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Velocidade\n </button>\n <div className=\"py-1.5\">\n {PLAYBACK_SPEEDS.map((speed) => (\n <button\n key={speed}\n type=\"button\"\n onClick={() => {\n setPlaybackRate(speed);\n closeSettings();\n }}\n className=\"flex w-full items-center gap-3 px-4 py-2.5 text-sm transition hover:bg-white/8\"\n >\n <svg\n className={`size-4 shrink-0 ${playbackRate === speed ? \"text-white\" : \"text-transparent\"}`}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3 8l3.5 3.5L13 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span\n className={\n playbackRate === speed\n ? \"font-semibold text-white\"\n : \"text-white/55\"\n }\n >\n {speed === 1 ? \"Normal\" : `${speed}×`}\n </span>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n </>\n )}\n\n <div\n ref={progressRef}\n onPointerMove={handleProgressPointerMove}\n onPointerEnter={handleProgressPointerEnter}\n onPointerLeave={handleProgressPointerLeave}\n onPointerDown={handleProgressPointerDown}\n onPointerUp={handleProgressPointerUp}\n className=\"relative mb-2 h-8 cursor-pointer overflow-visible\"\n >\n {/* Track */}\n <div\n ref={progressTrackRef}\n className=\"absolute left-0 right-0 top-1/2 -translate-y-1/2 overflow-hidden rounded-full bg-white/18\"\n style={{\n height: \"3px\",\n }}\n >\n <div\n className=\"absolute inset-y-0 left-0 rounded-full bg-white/28\"\n style={{ width: `${bufferedPercent}%` }}\n />\n <div\n className=\"absolute inset-y-0 left-0 rounded-full bg-white\"\n style={{ width: `${progressPercent}%`, transition: \"width 0.05s linear\" }}\n />\n </div>\n {/* Thumb */}\n <div\n ref={progressThumbRef}\n className=\"pointer-events-none absolute rounded-full bg-white shadow-[0_1px_6px_rgba(0,0,0,0.5)]\"\n style={{\n top: \"50%\",\n left: `${progressPercent}%`,\n transform: \"translate(-50%, -50%)\",\n width: \"10px\",\n height: \"10px\",\n }}\n />\n\n {/* Chapter markers */}\n {chapters.length > 0 && duration > 0 && chapters.map((ch, i) => (\n <div\n key={i}\n data-chapter-marker\n className=\"pointer-events-none absolute top-1/2 -translate-y-1/2 w-0.5 rounded-full bg-white/50\"\n style={{ left: `${(ch.startTime / duration) * 100}%`, height: \"3px\" }}\n />\n ))}\n\n {/* Storyboard preview — anchored above the timeline */}\n {preview && (() => {\n const frameW = preview.cue.w ?? 160;\n const frameH = preview.cue.h ?? 90;\n // Fixed width, height follows frame aspect ratio\n const thumbW = 200;\n const thumbH = Math.round(thumbW * (frameH / frameW));\n const scale = thumbW / frameW;\n const isSprite = preview.cue.x != null && preview.cue.y != null;\n return (\n <div\n className=\"pointer-events-none absolute flex flex-col items-center gap-1\"\n style={{\n bottom: \"calc(100% + 6px)\",\n left: preview.left,\n transform: \"translateX(-50%)\",\n zIndex: 80,\n }}\n >\n <div\n className=\"overflow-hidden rounded-lg shadow-2xl ring-1 ring-white/20\"\n style={{ width: thumbW, height: thumbH, flexShrink: 0 }}\n >\n {isSprite ? (\n // Sprite: need full sheet dimensions to compute backgroundSize correctly.\n // Load them once from the image's natural size.\n (() => {\n const imgUrl = preview.cue.image;\n if (storyboardSheetUrlRef.current !== imgUrl) {\n storyboardSheetUrlRef.current = imgUrl;\n const img = new window.Image();\n img.onload = () => setStoryboardSheetSize({ w: img.naturalWidth, h: img.naturalHeight });\n img.src = imgUrl;\n }\n if (!storyboardSheetSize) return null;\n const bsW = storyboardSheetSize.w * scale;\n const bsH = storyboardSheetSize.h * scale;\n return (\n <div\n style={{\n width: thumbW,\n height: thumbH,\n backgroundImage: `url(${imgUrl})`,\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: `-${(preview.cue.x ?? 0) * scale}px -${(preview.cue.y ?? 0) * scale}px`,\n backgroundSize: `${bsW}px ${bsH}px`,\n }}\n />\n );\n })()\n ) : (\n <img\n src={preview.cue.image}\n alt=\"\"\n style={{ width: thumbW, height: thumbH, objectFit: \"cover\", objectPosition: \"center\", display: \"block\" }}\n />\n )}\n </div>\n <div\n className=\"flex items-center gap-1.5 rounded-md px-2 py-0.5 text-[11px] font-semibold text-white/90\"\n style={{ background: \"rgba(0,0,0,0.55)\", backdropFilter: \"blur(6px)\" }}\n >\n <span className=\"tabular-nums\">{formatTime(preview.time)}</span>\n {(() => {\n const ch = [...chapters].reverse().find((c) => c.startTime <= preview.time);\n return ch ? (\n <>\n <span className=\"text-white/40\">·</span>\n <span className=\"max-w-36 truncate\">{ch.title}</span>\n </>\n ) : null;\n })()}\n </div>\n </div>\n );\n })()}\n </div>\n\n <div className=\"flex items-center justify-between gap-2\">\n {/* LEFT group: play/pause | time */}\n <div className=\"flex items-center gap-1.5 @sm:gap-2\">\n <button\n type=\"button\"\n onClick={togglePlay}\n className=\"grid size-8 place-items-center rounded-full text-white transition hover:bg-white/10 @sm:size-9\"\n aria-label={isPlaying ? \"Pause\" : \"Play\"}\n >\n {isPlaying ? (\n <Pause className=\"size-4 @sm:size-5\" fill=\"white\" />\n ) : (\n <Play className=\"ml-0.5 size-4 @sm:size-5\" fill=\"white\" />\n )}\n </button>\n\n <span className=\"text-[11px] font-medium tabular-nums text-white/80\">\n {formatTime(currentTime)}\n <span className=\"text-white/30\">/</span>\n <span className=\"text-white/45\">{formatTime(duration)}</span>\n </span>\n {(() => {\n if (chapters.length === 0) return null;\n const ch = [...chapters].reverse().find((c) => currentTime >= c.startTime);\n return ch ? (\n <span className=\"hidden max-w-40 truncate text-[11px] text-white/50 @sm:block\">\n {ch.title}\n </span>\n ) : null;\n })()}\n </div>\n\n {/* RIGHT group: rating | volume | captions | settings | fullscreen */}\n <div className=\"flex items-center gap-0.5 @sm:gap-1\">\n {/* Inline rating buttons — state is internal so clicks don't re-render the parent */}\n {parsed.rating && (() => {\n const REACTIONS: Array<{ key: \"LOVE\" | \"LIKE\" | \"DISLIKE\"; emoji: string }> = [\n { key: \"LOVE\", emoji: \"❤️\" },\n { key: \"LIKE\", emoji: \"👍\" },\n { key: \"DISLIKE\", emoji: \"👎\" },\n ];\n return (\n <>\n {REACTIONS.map(({ key, emoji }) => {\n const count = ratingCounts[key] ?? 0;\n const active = userReaction === key;\n return (\n <button\n key={key}\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n const next = active ? null : key;\n setUserReaction(next);\n setRatingCounts((prev) => {\n const updated = { ...prev };\n const prev_reaction = userReactionRef.current;\n if (active) updated[key] = Math.max(0, (updated[key] ?? 0) - 1);\n else {\n if (prev_reaction) updated[prev_reaction] = Math.max(0, (updated[prev_reaction] ?? 0) - 1);\n updated[key] = (updated[key] ?? 0) + 1;\n }\n return updated;\n });\n onReactRef.current?.(next);\n }}\n className={`flex items-center gap-0.5 rounded px-1.5 py-1 text-[11px] transition hover:bg-white/10 ${active ? \"opacity-100\" : \"opacity-50 hover:opacity-80\"}`}\n aria-label={key.toLowerCase()}\n aria-pressed={active}\n >\n <span>{emoji}</span>\n {count > 0 && <span className=\"text-white/70 tabular-nums\">{count}</span>}\n </button>\n );\n })}\n <div className=\"mx-0.5 h-4 w-px bg-white/20 @md:mx-1\" />\n </>\n );\n })()}\n\n {/* Volume: mute button always visible, custom slider appears on group hover */}\n <VolumeSlider\n volume={isMuted ? 0 : volume}\n onMuteToggle={() => setIsMuted((v) => !v)}\n onVolumeChange={(v) => { setVolume(v); setIsMuted(v === 0); }}\n isMuted={isMuted}\n />\n\n <div className=\"mx-0.5 h-4 w-px bg-white/20 @md:mx-1\" />\n\n {captions.length > 0 && (\n <button\n type=\"button\"\n onClick={() => {\n const next = subtitleMode === \"off\" ? (captions[0]?.srclang ?? \"off\") : \"off\";\n setSubtitleMode(next);\n setSubtitleStyle((st) => ({ ...st, track: next }));\n }}\n className={`grid size-8 place-items-center rounded transition hover:text-white/80 @sm:size-10 ${subtitleMode !== \"off\" ? \"text-white\" : \"text-white/60\"}`}\n aria-label=\"Captions\"\n >\n <CaptionsIcon className=\"size-4 @sm:size-5\" />\n </button>\n )}\n\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => settingsOpen ? closeSettings() : openSettings()}\n className={`grid size-8 place-items-center rounded transition hover:text-white/80 @sm:size-10 ${settingsOpen ? \"text-white\" : \"text-white/60\"}`}\n aria-label=\"Settings\"\n >\n <Settings className=\"size-4 @sm:size-5\" />\n </button>\n </div>\n\n <button\n type=\"button\"\n onClick={toggleFullscreen}\n className=\"grid size-8 place-items-center text-white/60 transition hover:scale-110 hover:text-white/80 @sm:size-10\"\n aria-label={isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n >\n {isFullscreen ? (\n <Minimize className=\"size-4 @sm:size-5\" />\n ) : (\n <Maximize className=\"size-4 @sm:size-5\" />\n )}\n </button>\n </div>\n </div>\n </footer>\n </div>\n\n\n {/* Subtitles — size scales with player height so it looks right in fullscreen */}\n {activeCue && (\n <div\n className=\"pointer-events-none absolute inset-x-0 z-40 flex justify-center px-4\"\n style={{\n bottom: (() => {\n if (preview) {\n // sit below the storyboard thumbnail + timer (~200px above the progress track)\n const frameW = preview.cue.w ?? 160;\n const frameH = preview.cue.h ?? 90;\n const thumbH = Math.round(200 * (frameH / frameW));\n // storyboard is above the controls bar (~80px), add thumb + timer + gap\n return `${80 + thumbH + 32 + 10}px`;\n }\n if (controlsVisible) return \"5rem\";\n return \"1rem\";\n })(),\n transition: \"bottom 0.2s ease\",\n }}\n >\n <div\n className=\"max-w-[80%] rounded-lg px-4 py-1.5 text-center font-medium leading-snug\"\n style={{\n fontSize: (() => {\n // Base size scales with player height: ~2.8% of height, clamped per size option\n const base = Math.max(12, Math.min(playerHeight * 0.028, 32));\n if (subtitleStyle.size === \"small\") return `${base * 0.75}px`;\n if (subtitleStyle.size === \"large\") return `${base * 1.35}px`;\n if (subtitleStyle.size === \"xlarge\") return `${base * 1.8}px`;\n return `${base}px`; // medium\n })(),\n color:\n subtitleStyle.color === \"yellow\"\n ? \"#facc15\"\n : subtitleStyle.color === \"cyan\"\n ? \"#22d3ee\"\n : \"#ffffff\",\n backgroundColor:\n subtitleStyle.bg === \"none\"\n ? \"transparent\"\n : subtitleStyle.bg === \"solid\"\n ? \"rgba(0,0,0,0.9)\"\n : \"rgba(0,0,0,0.55)\",\n backdropFilter:\n subtitleStyle.bg === \"semi\" ? \"blur(6px)\" : undefined,\n textShadow:\n subtitleStyle.bg === \"none\"\n ? \"0 1px 8px rgba(0,0,0,1), 0 0 16px rgba(0,0,0,0.9)\"\n : \"0 1px 3px rgba(0,0,0,0.5)\",\n }}\n >\n {activeCue}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport const VideoPlayer = Video;\n\nfunction SettingsItem({\n children,\n active,\n onClick,\n}: {\n children: ReactNode;\n active: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`flex w-full items-center gap-2 px-4 py-2.5 text-left text-base font-medium transition hover:bg-white/10${active ? \"text-white\" : \"text-white/55\"}`}\n >\n <span\n className={`size-1.5 rounded-full${active ? \"bg-white\" : \"bg-transparent\"}`}\n />\n {children}\n </button>\n );\n}\n\nfunction VolumeSlider({\n volume,\n isMuted,\n onMuteToggle,\n onVolumeChange,\n}: {\n volume: number;\n isMuted: boolean;\n onMuteToggle: () => void;\n onVolumeChange: (v: number) => void;\n}) {\n const [hovered, setHovered] = useState(false);\n const [dragging, setDragging] = useState(false);\n const trackRef = useRef<HTMLDivElement>(null);\n const sliderWrapRef = useRef<HTMLDivElement>(null);\n const railRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n const expanded = hovered || dragging;\n\n const seek = useCallback((clientX: number) => {\n const track = trackRef.current;\n if (!track) return;\n const rect = track.getBoundingClientRect();\n const v = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n onVolumeChange(v);\n }, [onVolumeChange]);\n\n const onPointerDown = useCallback((e: React.PointerEvent) => {\n e.currentTarget.setPointerCapture(e.pointerId);\n setDragging(true);\n seek(e.clientX);\n }, [seek]);\n\n const onPointerMove = useCallback((e: React.PointerEvent) => {\n if (dragging) seek(e.clientX);\n }, [dragging, seek]);\n\n const onPointerUp = useCallback(() => setDragging(false), []);\n\n // GSAP: animate slider expand/collapse\n useEffect(() => {\n const wrap = sliderWrapRef.current;\n if (!wrap) return;\n gsap.killTweensOf(wrap);\n gsap.to(wrap, {\n width: expanded ? 64 : 0,\n opacity: expanded ? 1 : 0,\n duration: 0.2,\n ease: \"power2.inOut\",\n });\n }, [expanded]);\n\n // GSAP: animate rail height + thumb size on hover/drag\n useEffect(() => {\n const rail = railRef.current;\n const thumb = thumbRef.current;\n const targetRailH = dragging ? 5 : hovered ? 4 : 3;\n const targetThumbSize = dragging ? 14 : hovered ? 11 : 0;\n if (rail) {\n gsap.killTweensOf(rail);\n gsap.to(rail, { height: targetRailH, duration: 0.15, ease: \"power1.inOut\" });\n }\n if (thumb) {\n gsap.killTweensOf(thumb);\n gsap.to(thumb, { width: targetThumbSize, height: targetThumbSize, duration: 0.15, ease: \"power1.inOut\" });\n }\n }, [dragging, hovered]);\n\n const fillPercent = volume * 100;\n\n return (\n <div\n className=\"flex items-center\"\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => { if (!dragging) setHovered(false); }}\n >\n <button\n type=\"button\"\n onClick={onMuteToggle}\n className=\"grid size-8 place-items-center text-white/70 transition hover:text-white @sm:size-9\"\n aria-label={isMuted ? \"Unmute\" : \"Mute\"}\n >\n {isMuted || volume === 0 ? (\n <VolumeX className=\"size-4 @sm:size-5\" />\n ) : (\n <Volume2 className=\"size-4 @sm:size-5\" />\n )}\n </button>\n\n {/* Custom track */}\n <div\n ref={sliderWrapRef}\n style={{\n width: \"0px\",\n opacity: 0,\n overflow: \"hidden\",\n }}\n >\n <div\n ref={trackRef}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n className=\"relative mx-1 flex h-7 cursor-pointer items-center\"\n style={{ width: \"52px\" }}\n >\n {/* Rail */}\n <div\n ref={railRef}\n className=\"absolute inset-x-0 rounded-full bg-white/20\"\n style={{ height: \"3px\" }}\n >\n {/* Fill */}\n <div\n className=\"absolute inset-y-0 left-0 rounded-full bg-white\"\n style={{ width: `${fillPercent}%` }}\n />\n </div>\n {/* Thumb */}\n <div\n ref={thumbRef}\n className=\"pointer-events-none absolute top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-white shadow-md\"\n style={{\n left: `${fillPercent}%`,\n width: \"0px\",\n height: \"0px\",\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n\n// Maps BCP-47 locale prefixes to region keys stored in age_ratings JSON\nconst LOCALE_TO_REGION: Record<string, string> = {\n \"en-US\": \"US\", \"en-CA\": \"CA\",\n \"pt-BR\": \"BR\",\n \"de\": \"EU\", \"fr\": \"EU\", \"es\": \"EU\", \"it\": \"EU\", \"nl\": \"EU\", \"pl\": \"EU\",\n \"de-DE\": \"EU\", \"fr-FR\": \"EU\", \"es-ES\": \"EU\", \"it-IT\": \"EU\",\n \"ja\": \"JP\", \"ja-JP\": \"JP\",\n \"ko\": \"KR\", \"ko-KR\": \"KR\",\n \"en-AU\": \"AU\",\n};\n\nfunction resolveAgeRatingRegion(locale: string | undefined, data: Record<string, string>): string | undefined {\n if (!locale) return Object.keys(data)[0];\n // Exact match first\n if (LOCALE_TO_REGION[locale] && data[LOCALE_TO_REGION[locale]]) return LOCALE_TO_REGION[locale];\n // Language prefix match (e.g. \"pt\" from \"pt-BR\")\n const lang = locale.split(\"-\")[0] ?? \"\";\n const fromLang = LOCALE_TO_REGION[lang];\n if (fromLang && data[fromLang]) return fromLang;\n // Fallback: first key in data\n return Object.keys(data)[0];\n}\n\nfunction parseVideoChildren(children: ReactNode): ParsedVideoChildren {\n const parsed: ParsedVideoChildren = {\n sources: [],\n };\n\n function dn(child: React.ReactElement): string {\n return (child.type as any)?.displayName ?? (child.type as any)?.name ?? \"\";\n }\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n\n const name = dn(child);\n\n if (child.type === Source || name === \"SiloSource\") {\n const element = child as ReactElement<SourceProps>;\n parsed.sources.push(element.props);\n }\n\n if (child.type === Captions || name === \"SiloCaptions\") {\n const element = child as ReactElement<CaptionsProps>;\n if (element.props.data) {\n parsed.captionsData = element.props.data;\n } else if (element.props.src) {\n parsed.captionsSrc = element.props.src;\n }\n }\n\n if (child.type === Chapters || name === \"SiloChapters\") {\n const element = child as ReactElement<ChaptersProps>;\n if (element.props.data) {\n parsed.chaptersData = element.props.data;\n } else if (element.props.src) {\n parsed.chaptersSrc = element.props.src;\n }\n }\n\n if (child.type === VideoThumbnail || name === \"SiloVideoThumbnail\") {\n const element = child as ReactElement<ThumbnailProps>;\n if (element.props.urls) parsed.thumbnailUrls = element.props.urls;\n if (element.props.src) parsed.thumbnailSrc = element.props.src;\n }\n\n if (child.type === AgeRating || name === \"SiloAgeRating\") {\n const element = child as ReactElement<AgeRatingProps>;\n parsed.ageRating = element.props;\n }\n\n if (child.type === Rating || name === \"SiloRating\") {\n const element = child as ReactElement<RatingProps>;\n parsed.rating = element.props;\n }\n\n if (child.type === Storyboard || name === \"SiloStoryboard\") {\n const element = child as ReactElement<StoryboardProps>;\n const frames: StoryboardFrameProps[] = [];\n\n React.Children.forEach(element.props.children, (frameChild) => {\n if (!React.isValidElement(frameChild)) return;\n const fn2 = dn(frameChild);\n if (\n frameChild.type !== StoryboardFrame &&\n fn2 !== \"SiloStoryboardFrame\"\n )\n return;\n\n const frameElement = frameChild as ReactElement<StoryboardFrameProps>;\n frames.push(frameElement.props);\n });\n\n parsed.storyboard = {\n ...(element.props.src !== undefined && { src: element.props.src }),\n ...(element.props.fallbackImage !== undefined && { fallbackImage: element.props.fallbackImage }),\n ...(element.props.width !== undefined && { width: element.props.width }),\n ...(element.props.height !== undefined && { height: element.props.height }),\n ...(element.props.resolutions !== undefined && { resolutions: element.props.resolutions }),\n frames,\n };\n }\n });\n\n return parsed;\n}\n\nfunction inferSourceType(source: SourceProps): VideoSourceType {\n if (source.type) return source.type;\n\n const src = source.src.toLowerCase();\n\n if (src.includes(\".mpd\") || src.includes(\"/dash\")) return \"dash\";\n if (src.includes(\".m3u8\") || src.includes(\"/hls\")) return \"hls\";\n\n return \"file\";\n}\n\nfunction findStoryboardCue(cues: StoryboardFrameProps[], time: number) {\n if (cues.length === 0) return null;\n // Find the last cue whose start is <= time (floor to nearest previous frame)\n let best: StoryboardFrameProps | null = null;\n for (const cue of cues) {\n if (cue.start <= time) best = cue;\n else break;\n }\n return best;\n}\n\nfunction parseStoryboardVtt(\n text: string,\n baseUrl: string,\n): StoryboardFrameProps[] {\n const lines = text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const cues: StoryboardFrameProps[] = [];\n\n for (let index = 0; index < lines.length; index++) {\n const line = lines[index];\n if (!line || !line.includes(\"-->\")) continue;\n\n const parts = line.split(/\\s+-->\\s+/);\n const startRaw = parts[0];\n const endRaw = parts[1];\n const imageLine = lines[index + 1];\n\n if (!startRaw || !endRaw || !imageLine) continue;\n\n const image = parseStoryboardImageLine(imageLine, baseUrl);\n\n cues.push({\n start: parseVttTimestamp(startRaw),\n end: parseVttTimestamp(endRaw),\n ...image,\n });\n }\n\n return cues;\n}\n\nfunction parseStoryboardImageLine(line: string, baseUrl: string) {\n const splitIndex = line.indexOf(\"#xywh=\");\n const imageRaw = splitIndex >= 0 ? line.slice(0, splitIndex) : line;\n const xywhRaw = splitIndex >= 0 ? line.slice(splitIndex + 6) : null;\n const image = new URL(imageRaw, baseUrl).href;\n\n if (!xywhRaw) {\n return { image };\n }\n\n const [x, y, w, h] = xywhRaw.split(\",\").map(Number);\n\n return {\n image,\n ...(x !== undefined && !isNaN(x) && { x }),\n ...(y !== undefined && !isNaN(y) && { y }),\n ...(w !== undefined && !isNaN(w) && { w }),\n ...(h !== undefined && !isNaN(h) && { h }),\n };\n}\n\nfunction parseVttTimestamp(value: string) {\n const normalized = value.replace(\",\", \".\");\n const parts = normalized.split(\":\").map(Number);\n\n if (parts.length === 3) {\n return (parts[0] ?? 0) * 3600 + (parts[1] ?? 0) * 60 + (parts[2] ?? 0);\n }\n\n if (parts.length === 2) {\n return (parts[0] ?? 0) * 60 + (parts[1] ?? 0);\n }\n\n return Number(normalized) || 0;\n}\n\nfunction formatTime(seconds: number) {\n if (!Number.isFinite(seconds)) return \"0:00\";\n\n const safeSeconds = Math.max(0, Math.floor(seconds));\n const hours = Math.floor(safeSeconds / 3600);\n const minutes = Math.floor((safeSeconds % 3600) / 60);\n const secs = safeSeconds % 60;\n\n if (hours > 0) {\n return `${hours}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n }\n\n return `${minutes}:${String(secs).padStart(2, \"0\")}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/VideoPlayer.tsx"],"names":["CaptionsIcon"],"mappings":"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","file":"VideoPlayer.js","sourcesContent":["\"use client\";\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n KeyboardEvent,\n PointerEvent,\n ReactElement,\n ReactNode,\n} from \"react\";\nimport gsap from \"gsap\";\nimport {\n Play,\n Pause,\n Volume2,\n VolumeX,\n Maximize,\n Minimize,\n Captions as CaptionsIcon,\n Settings,\n} from \"lucide-react\";\n\nexport type VideoSourceType = \"dash\" | \"hls\" | \"file\";\n\nexport type SourceProps = {\n id?: string;\n src: string;\n label?: string;\n type?: VideoSourceType;\n default?: boolean;\n};\n\nexport type CaptionsProps = {\n src?: string; // URL that returns JSON: Array<{ src, srclang, label, default? }>\n data?: Array<{ src: string; srclang: string; label: string; default?: boolean }>; // inline captions, bypasses fetch\n};\n\nexport type ThumbnailProps = {\n /** Single URL (legacy). Use urls for adaptive resolution. */\n src?: string;\n /** Map of width label to URL: { \"320w\": \"...\", \"640w\": \"...\", \"1280w\": \"...\", \"1920w\": \"...\" } */\n urls?: Record<string, string>;\n};\n\nexport type StoryboardFrameProps = {\n start: number;\n end: number;\n image: string;\n x?: number;\n y?: number;\n w?: number;\n h?: number;\n};\n\nexport type StoryboardResolution = {\n /** VTT content with sprite URLs already resolved (no temp S3 upload needed) */\n vttText?: string | null;\n spriteUrl: string;\n tileW: number;\n tileH: number;\n cols: number;\n rows?: number | null;\n};\n\nexport type StoryboardProps = {\n /** Legacy: single VTT URL */\n src?: string;\n fallbackImage?: string;\n width?: number;\n height?: number;\n /** Multi-resolution storyboards from post-worker: { \"180p\": {...}, \"480p\": {...} } */\n resolutions?: Record<string, StoryboardResolution>;\n children?: ReactNode;\n};\n\ntype ParsedStoryboard = Omit<StoryboardProps, \"children\"> & {\n frames: StoryboardFrameProps[];\n};\n\ntype ResolvedCaption = {\n src: string;\n srclang: string;\n label: string;\n default?: boolean;\n};\n\nexport type ChaptersProps = {\n src?: string; // URL that returns JSON: Array<{ startTime, title, endTime? }>\n data?: Array<{ startTime: number; title: string; endTime?: number }>;\n};\n\ntype ResolvedChapter = {\n startTime: number;\n title: string;\n endTime?: number;\n};\n\nexport type AgeRatingProps = {\n /** The age_ratings JSON from the file: { US: \"PG-13\", BR: \"14\", EU: \"PEGI 16\" } */\n data?: Record<string, string>;\n /** BCP-47 locale like \"en-US\", \"pt-BR\", \"de-DE\" — picks the right region key */\n locale?: string;\n /** Custom lookup for display info per region+code: { title, description, imageUrl } */\n lookup?: Record<string, { title?: string; description?: string; imageUrl?: string }>;\n};\n\nexport type RatingProps = {\n /** Aggregate counts */\n counts?: { LOVE?: number; LIKE?: number; DISLIKE?: number };\n /** Current user's reaction */\n userReaction?: \"LOVE\" | \"LIKE\" | \"DISLIKE\" | null;\n /** Called when user clicks a reaction button */\n onReact?: (reaction: \"LOVE\" | \"LIKE\" | \"DISLIKE\" | null) => void;\n};\n\ntype ParsedVideoChildren = {\n sources: SourceProps[];\n captionsSrc?: string;\n captionsData?: Array<{ src: string; srclang: string; label: string; default?: boolean }>;\n chaptersSrc?: string;\n chaptersData?: ResolvedChapter[];\n thumbnailSrc?: string;\n thumbnailUrls?: Record<string, string>;\n storyboard?: ParsedStoryboard;\n ageRating?: AgeRatingProps;\n rating?: RatingProps;\n};\n\ntype QualityOption = {\n id: string;\n label: string;\n type: \"auto\" | \"hls\" | \"dash\";\n index?: number;\n supported?: boolean;\n hdr?: boolean;\n};\n\ntype VideoProps = {\n title?: string;\n description?: string;\n children: ReactNode;\n className?: string;\n autoHideControls?: boolean;\n defaultVolume?: number;\n maxHeight?: string | number;\n /** Fixed height — disables aspect-ratio so the player stays at exactly this height regardless of video dimensions */\n fixedHeight?: string | number;\n};\n\ntype WebkitVideoElement = HTMLVideoElement & {\n webkitDisplayingFullscreen?: boolean;\n webkitEnterFullscreen?: () => void;\n webkitExitFullscreen?: () => void;\n};\n\ntype FullscreenCapableElement = HTMLDivElement & {\n webkitRequestFullscreen?: () => Promise<void> | void;\n};\n\ntype FullscreenCapableDocument = Document & {\n webkitFullscreenElement?: Element | null;\n webkitExitFullscreen?: () => Promise<void> | void;\n};\n\nconst AUTO_QUALITY: QualityOption = {\n id: \"auto\",\n label: \"Auto\",\n type: \"auto\",\n supported: true,\n};\n\nfunction deviceSupportsHdr(): boolean {\n if (typeof window === \"undefined\") return false;\n try { return window.matchMedia(\"(dynamic-range: high)\").matches; } catch { return false; }\n}\n\nfunction deviceSupportsOpus(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n if (typeof MediaSource !== \"undefined\" && MediaSource.isTypeSupported) {\n if (MediaSource.isTypeSupported('audio/mp4; codecs=\"opus\"')) return true;\n }\n const a = document.createElement(\"audio\");\n return a.canPlayType('audio/ogg; codecs=\"opus\"') !== \"\" ||\n a.canPlayType('video/mp4; codecs=\"opus\"') !== \"\";\n } catch { return false; }\n}\n\nfunction deviceSupportsVideoCodec(codec: string): boolean {\n if (!codec || typeof window === \"undefined\") return true;\n // H.264/AVC is universally supported — skip MSE check to avoid false negatives\n if (/^avc1/i.test(codec)) return true;\n try {\n if (typeof MediaSource !== \"undefined\" && MediaSource.isTypeSupported) {\n return MediaSource.isTypeSupported(`video/mp4; codecs=\"${codec}\"`);\n }\n return true;\n } catch { return true; }\n}\n\nfunction deviceSupportsAudioCodec(codec: string): boolean {\n if (!codec || typeof window === \"undefined\") return true;\n // AAC is universally supported\n if (/^mp4a/i.test(codec)) return true;\n // Opus: use dedicated check (fMP4 + ogg)\n if (/^opus/i.test(codec)) return deviceSupportsOpus();\n // E-AC3 (Dolby Digital Plus), AC-3 (Dolby Digital), etc — check MSE\n try {\n if (typeof MediaSource !== \"undefined\" && MediaSource.isTypeSupported) {\n return MediaSource.isTypeSupported(`audio/mp4; codecs=\"${codec}\"`);\n }\n // Fallback: HTMLAudioElement\n const a = document.createElement(\"audio\");\n return a.canPlayType(`audio/mp4; codecs=\"${codec}\"`) !== \"\";\n } catch { return true; }\n}\n\nconst LANG_NAMES: Record<string, string> = {\n pt: \"Português\", \"pt-br\": \"Português (Brasil)\", \"pt-pt\": \"Português (Portugal)\",\n en: \"English\", \"en-us\": \"English (US)\", \"en-gb\": \"English (UK)\",\n es: \"Español\", \"es-419\": \"Español (Latino)\", fr: \"Français\",\n de: \"Deutsch\", it: \"Italiano\", ja: \"日本語\", ko: \"한국어\",\n zh: \"中文\", \"zh-cn\": \"普通话\", \"zh-tw\": \"繁體中文\",\n ru: \"Русский\", ar: \"العربية\", hi: \"हिन्दी\",\n nl: \"Nederlands\", pl: \"Polski\", sv: \"Svenska\", tr: \"Türkçe\",\n und: \"Original\",\n};\n\nconst CODEC_LABELS: Record<string, string> = {\n \"truehd\": \"Dolby TrueHD\", \"atmos\": \"Dolby Atmos\",\n \"eac3\": \"Dolby Digital Plus\", \"ec-3\": \"Dolby Digital Plus\", \"e-ac-3\": \"Dolby Digital Plus\",\n \"ac3\": \"Dolby Digital\", \"ac-3\": \"Dolby Digital\",\n \"dts-hd\": \"DTS-HD\", \"dts-hd ma\": \"DTS-HD MA\", \"dtshd\": \"DTS-HD MA\",\n \"dts\": \"DTS\", \"aac\": \"AAC\", \"opus\": \"Opus\",\n \"mp3\": \"MP3\", \"flac\": \"FLAC\", \"alac\": \"ALAC\",\n};\n\nconst CHANNEL_LABELS: Record<number, string> = {\n 1: \"Mono\", 2: \"Estéreo\", 6: \"5.1\", 7: \"6.1\", 8: \"7.1\",\n};\n\nfunction friendlyAudioLabel(rawName: string | undefined, lang: string | undefined, codec: string, channels?: number): string {\n // Build parts: language + format + channels\n const langKey = (lang ?? \"\").toLowerCase();\n const langLabel = LANG_NAMES[langKey] ?? (lang ? lang.toUpperCase() : null);\n\n // Codec-friendly name\n const codecKey = Object.keys(CODEC_LABELS).find((k) => codec.toLowerCase().includes(k));\n const codecLabel = codecKey ? CODEC_LABELS[codecKey] : null;\n\n // Channel label\n const chLabel = channels ? CHANNEL_LABELS[channels] ?? `${channels}ch` : null;\n\n // If raw name looks like a human label (not pure codec/lang codes), clean it up\n const looksHuman = rawName && !/^(und|dts|ac3|eac3|aac|opus|truehd|atmos|\\w{2,3}-\\d+ch|\\w{2})/i.test(rawName) && rawName.length > 1;\n const baseName = looksHuman ? rawName! : (langLabel ?? \"Áudio\");\n\n const suffix = [codecLabel, chLabel].filter(Boolean).join(\" \");\n return suffix ? `${baseName} — ${suffix}` : baseName;\n}\n\nfunction isHdrLevel(level: any): boolean {\n // hls.js exposes videoRange on level after manifest parse\n const range = level?.videoRange ?? level?.video_range ?? \"\";\n return range === \"PQ\" || range === \"HLG\" || range === \"HDR10\" ||\n (typeof level?.name === \"string\" && /hdr/i.test(level.name));\n}\n\n\nconst PLAYBACK_SPEEDS = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2];\n\ntype SettingsTab =\n | \"root\"\n | \"quality\"\n | \"subtitles\"\n | \"subtitles-style\"\n | \"audio\"\n | \"playback\";\n\ntype SubtitleStyle = {\n track: string; // srclang or \"off\"\n size: \"small\" | \"medium\" | \"large\" | \"xlarge\";\n color: \"white\" | \"yellow\" | \"cyan\";\n bg: \"none\" | \"semi\" | \"solid\";\n};\n\nexport function Source(_props: SourceProps) {\n return null;\n}\nSource.displayName = \"SiloSource\";\n\nexport function Captions(_props: CaptionsProps) {\n return null;\n}\nCaptions.displayName = \"SiloCaptions\";\n\nexport function Chapters(_props: ChaptersProps) {\n return null;\n}\nChapters.displayName = \"SiloChapters\";\n\nexport function VideoThumbnail(_props: ThumbnailProps) {\n return null;\n}\nVideoThumbnail.displayName = \"SiloVideoThumbnail\";\n\nexport function Storyboard(_props: StoryboardProps) {\n return null;\n}\nStoryboard.displayName = \"SiloStoryboard\";\n\nexport function StoryboardFrame(_props: StoryboardFrameProps) {\n return null;\n}\nStoryboardFrame.displayName = \"SiloStoryboardFrame\";\n\nexport function AgeRating(_props: AgeRatingProps) {\n return null;\n}\nAgeRating.displayName = \"SiloAgeRating\";\n\nexport function Rating(_props: RatingProps) {\n return null;\n}\nRating.displayName = \"SiloRating\";\n\nexport function Video({\n title,\n description,\n children,\n className,\n autoHideControls = true,\n defaultVolume = 0.72,\n maxHeight,\n fixedHeight,\n}: VideoProps) {\n const parsed = useMemo(() => parseVideoChildren(children), [children]);\n\n const [captions, setCaptions] = useState<ResolvedCaption[]>([]);\n const [chapters, setChapters] = useState<ResolvedChapter[]>([]);\n const [poster, setPoster] = useState<string | undefined>(undefined);\n\n const captionsSourceRef = useRef<string>(\"\");\n\n // Resolve captions — either from inline data or by fetching src URL\n useEffect(() => {\n // Identify the caption \"source key\" — src URL or first srclang from inline data\n const sourceKey = parsed.captionsSrc ?? parsed.captionsData?.[0]?.srclang ?? \"\";\n\n function applyResolved(data: ResolvedCaption[]) {\n const resolved = data.map((c, i) => ({ ...c, default: c.default ?? i === 0 }));\n setCaptions(resolved);\n // Auto-activate only when the caption source changes (new file/language), not on every content update\n if (captionsSourceRef.current !== sourceKey) {\n captionsSourceRef.current = sourceKey;\n const defaultTrack = resolved.find((c) => c.default);\n if (defaultTrack) {\n setSubtitleMode(defaultTrack.srclang);\n setSubtitleStyle((st) => ({ ...st, track: defaultTrack.srclang }));\n }\n }\n }\n\n if (parsed.captionsData) {\n applyResolved(parsed.captionsData);\n return;\n }\n if (!parsed.captionsSrc) { setCaptions([]); return; }\n let cancelled = false;\n fetch(parsed.captionsSrc, { cache: \"no-store\" })\n .then((r) => r.json())\n .then((data: ResolvedCaption[]) => {\n if (!cancelled && Array.isArray(data)) applyResolved(data);\n })\n .catch(() => { if (!cancelled) setCaptions([]); });\n return () => { cancelled = true; };\n }, [parsed.captionsSrc, parsed.captionsData]);\n\n // Resolve chapters — either from inline data or by fetching src URL\n useEffect(() => {\n if (parsed.chaptersData) {\n setChapters(parsed.chaptersData);\n return;\n }\n if (!parsed.chaptersSrc) { setChapters([]); return; }\n let cancelled = false;\n fetch(parsed.chaptersSrc, { cache: \"no-store\" })\n .then((r) => r.json())\n .then((data: ResolvedChapter[]) => {\n if (!cancelled && Array.isArray(data)) setChapters(data);\n })\n .catch(() => { if (!cancelled) setChapters([]); });\n return () => { cancelled = true; };\n }, [parsed.chaptersSrc, parsed.chaptersData]);\n\n const initialSourceIndex = useMemo(() => {\n const index = parsed.sources.findIndex((source) => source.default);\n return index >= 0 ? index : 0;\n }, [parsed.sources]);\n\n const initialSubtitleMode = useMemo(() => {\n const track = captions.find((c) => c.default);\n return track?.srclang ?? \"off\";\n }, [captions]);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const chromeRef = useRef<HTMLDivElement | null>(null);\n const playerRef = useRef<HTMLDivElement | null>(null);\n const showAgeRatingRef = useRef<(() => void) | null>(null);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const progressRef = useRef<HTMLDivElement | null>(null);\n\n const hlsRef = useRef<any>(null);\n const dashRef = useRef<any>(null);\n const hideTimerRef = useRef<number | null>(null);\n\n const [sourceIndex, setSourceIndex] = useState(initialSourceIndex);\n const [qualities, setQualities] = useState<QualityOption[]>([AUTO_QUALITY]);\n const [selectedQuality, setSelectedQuality] = useState(\"auto\");\n const [audioTracks, setAudioTracks] = useState<\n { id: number; label: string; supported?: boolean }[]\n >([]);\n const [selectedAudio, setSelectedAudio] = useState<number>(0);\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [settingsVisible, setSettingsVisible] = useState(false);\n\n const [settingsTab, setSettingsTab] = useState<SettingsTab>(\"root\");\n const [playbackRate, setPlaybackRate] = useState(1);\n const [subtitleStyle, setSubtitleStyle] = useState<SubtitleStyle>({\n track: initialSubtitleMode,\n size: \"medium\",\n color: \"white\",\n bg: \"semi\",\n });\n\n const [subtitleMode, setSubtitleMode] = useState(initialSubtitleMode);\n const [activeCue, setActiveCue] = useState<string | null>(null);\n const [storyboardSheetSize, setStoryboardSheetSize] = useState<{ w: number; h: number } | null>(null);\n const storyboardSheetUrlRef = useRef<string>(\"\");\n\n const [storyboardCues, setStoryboardCues] = useState<StoryboardFrameProps[]>([]);\n // Multi-resolution storyboard state — loaded cues per resolution key\n const storyboardCacheRef = useRef<Map<string, StoryboardFrameProps[]>>(new Map());\n // Which resolution is currently active for preview\n const [activeStoryboardRes, setActiveStoryboardRes] = useState<string | null>(null);\n // Preloaded sprite images (by URL) so they don't flash on first hover\n const preloadedSpritesRef = useRef<Set<string>>(new Set());\n\n // Rating state — internal so clicks don't re-render the parent and restart the video\n const [ratingCounts, setRatingCounts] = useState<{ LOVE: number; LIKE: number; DISLIKE: number }>(\n () => ({ LOVE: parsed.rating?.counts?.LOVE ?? 0, LIKE: parsed.rating?.counts?.LIKE ?? 0, DISLIKE: parsed.rating?.counts?.DISLIKE ?? 0 })\n );\n const [userReaction, setUserReaction] = useState<\"LOVE\" | \"LIKE\" | \"DISLIKE\" | null>(parsed.rating?.userReaction ?? null);\n const userReactionRef = useRef(userReaction);\n userReactionRef.current = userReaction;\n // Sync counts/userReaction when parent provides them for the first time (async load)\n const ratingInitializedRef = useRef(false);\n const incomingCounts = parsed.rating?.counts;\n const incomingUserReaction = parsed.rating?.userReaction;\n useEffect(() => {\n if (ratingInitializedRef.current) return;\n if (!incomingCounts && incomingUserReaction === undefined) return;\n ratingInitializedRef.current = true;\n if (incomingCounts) {\n setRatingCounts({ LOVE: incomingCounts.LOVE ?? 0, LIKE: incomingCounts.LIKE ?? 0, DISLIKE: incomingCounts.DISLIKE ?? 0 });\n }\n if (incomingUserReaction !== undefined) {\n setUserReaction(incomingUserReaction ?? null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [incomingCounts?.LOVE, incomingCounts?.LIKE, incomingCounts?.DISLIKE, incomingUserReaction]);\n // Keep a stable ref to the latest onReact callback so we don't need it in deps\n const onReactRef = useRef<RatingProps[\"onReact\"]>(parsed.rating?.onReact);\n onReactRef.current = parsed.rating?.onReact;\n\n const [preview, setPreview] = useState<{\n cue: StoryboardFrameProps;\n left: number;\n time: number;\n } | null>(null);\n\n const [duration, setDuration] = useState(0);\n const [currentTime, setCurrentTime] = useState(0);\n const [bufferedTime, setBufferedTime] = useState(0);\n\n const [isDragging, setIsDragging] = useState(false);\n const [isHoveringProgress, setIsHoveringProgress] = useState(false);\n const dragPointerIdRef = useRef<number | null>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [hasPlayed, setHasPlayed] = useState(false);\n const ageRatingTlRef = useRef<gsap.core.Timeline | null>(null);\n const ageRatingPauseTimerRef = useRef<number | null>(null);\n const ageRatingWrapRef = useRef<HTMLDivElement | null>(null);\n const ageRatingIconRef = useRef<HTMLDivElement | null>(null);\n const ageRatingTextRef = useRef<HTMLDivElement | null>(null);\n // true after the overlay has been shown and fully faded out at least once\n const ageRatingShownRef = useRef(false);\n // true when 1-min pause threshold fired — show on next play\n const ageRatingQueuedRef = useRef(false);\n // true when age rating should fire as soon as controls hide\n const ageRatingPendingRef = useRef(false);\n const [clickIcon, setClickIcon] = useState<\"play\" | \"pause\" | null>(null);\n const clickIconTimerRef = useRef<number | null>(null);\n const clickIconRef = useRef<HTMLDivElement | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [controlsVisible, setControlsVisible] = useState(true);\n const settingsPanelRef = useRef<HTMLDivElement | null>(null);\n const settingsContentRef = useRef<HTMLDivElement | null>(null);\n const progressTrackRef = useRef<HTMLDivElement | null>(null);\n const progressThumbRef = useRef<HTMLDivElement | null>(null);\n const [volume, setVolume] = useState(defaultVolume);\n const [isMuted, setIsMuted] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [playerHeight, setPlayerHeight] = useState(0);\n const [playerWidth, setPlayerWidth] = useState(0);\n\n // Thumbnail: pick best available URL based on player width and network quality\n useEffect(() => {\n const urls = parsed.thumbnailUrls;\n if (!urls || Object.keys(urls).length === 0) {\n setPoster(parsed.thumbnailSrc ?? undefined);\n return;\n }\n const sorted = Object.entries(urls)\n .map(([label, url]) => ({ px: parseInt(label.replace(\"w\", \"\"), 10) || 0, url }))\n .filter((e) => e.px > 0)\n .sort((a, b) => a.px - b.px);\n if (sorted.length === 0) { setPoster(parsed.thumbnailSrc ?? undefined); return; }\n const dpr = typeof window !== \"undefined\" ? window.devicePixelRatio ?? 1 : 1;\n const conn = typeof navigator !== \"undefined\" ? (navigator as any).connection : null;\n const connFactor = conn?.effectiveType === \"4g\" ? 1 : conn?.effectiveType === \"3g\" ? 0.5 : 0.25;\n const targetPx = (playerWidth || 640) * dpr * (conn ? connFactor : 1);\n const best = sorted.find((e) => e.px >= targetPx) ?? sorted[sorted.length - 1]!;\n setPoster(best.url);\n }, [parsed.thumbnailUrls, parsed.thumbnailSrc, playerWidth]);\n\n const rawActiveSource = parsed.sources[sourceIndex] ?? parsed.sources[0] ?? null;\n // Stabilize the activeSource reference so the HLS/DASH useEffect only fires when\n // src or type actually changes, not on every parent re-render that produces new JSX objects.\n const activeSourceRef = useRef<SourceProps | null>(null);\n if (\n rawActiveSource?.src !== activeSourceRef.current?.src ||\n rawActiveSource?.type !== activeSourceRef.current?.type\n ) {\n activeSourceRef.current = rawActiveSource;\n }\n const activeSource = activeSourceRef.current;\n\n const progressPercent = duration ? (currentTime / duration) * 100 : 0;\n const bufferedPercent = duration ? (bufferedTime / duration) * 100 : 0;\n\n const destroyMediaEngines = useCallback(() => {\n if (hlsRef.current) {\n hlsRef.current.destroy();\n hlsRef.current = null;\n }\n\n if (dashRef.current) {\n dashRef.current.reset();\n dashRef.current = null;\n }\n }, []);\n\n const applySubtitleMode = useCallback((mode: string) => {\n const video = videoRef.current;\n if (!video) return;\n\n // Use \"hidden\" instead of \"showing\" — we render cues ourselves for full style control\n let activeTrack: TextTrack | null = null;\n Array.from(video.textTracks).forEach((track) => {\n if (track.kind === \"metadata\") return; // don't touch metadata tracks (storyboard)\n const enabled = mode !== \"off\" && track.language === mode;\n track.mode = enabled ? \"hidden\" : \"disabled\";\n if (enabled) activeTrack = track;\n });\n // Always clear the previous track's cue when switching. Disabling a track\n // stops its \"cuechange\" from firing, so the old caption would otherwise stay\n // frozen on screen. Then seed the new track's current cue immediately so the\n // switch shows the right caption without waiting for the next cue boundary.\n if (!activeTrack) {\n setActiveCue(null);\n return;\n }\n const cues = (activeTrack as TextTrack).activeCues;\n const cue = cues && cues.length > 0 ? (cues[0] as VTTCue) : null;\n setActiveCue(cue ? cue.text.replace(/<[^>]*>/g, \"\") : null);\n }, []);\n\n const showControlsTemporarily = useCallback(() => {\n setControlsVisible(true);\n\n if (hideTimerRef.current) {\n window.clearTimeout(hideTimerRef.current);\n }\n\n const video = videoRef.current;\n\n if (autoHideControls && video && !video.paused) {\n hideTimerRef.current = window.setTimeout(() => {\n setControlsVisible(false);\n }, 2400);\n }\n\n }, [autoHideControls]);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n gsap.fromTo(\n containerRef.current,\n {\n opacity: 0,\n y: 36,\n scale: 0.985,\n filter: \"blur(10px)\",\n },\n {\n opacity: 1,\n y: 0,\n scale: 1,\n filter: \"blur(0px)\",\n duration: 0.85,\n ease: \"power3.out\",\n },\n );\n }, []);\n\n // settingsOpen = mounted in DOM; settingsVisible = used only to trigger GSAP (open/close driven imperatively)\n const openSettings = useCallback(() => {\n setSettingsOpen(true);\n setSettingsTab(\"root\");\n setSettingsVisible(true);\n }, []);\n\n const closeSettings = useCallback(() => {\n const panel = settingsPanelRef.current;\n if (panel) {\n gsap.killTweensOf(panel);\n gsap.to(panel, {\n opacity: 0,\n y: 8,\n scale: 0.97,\n duration: 0.18,\n ease: \"power2.in\",\n onComplete: () => {\n setSettingsOpen(false);\n setSettingsVisible(false);\n },\n });\n } else {\n setSettingsOpen(false);\n setSettingsVisible(false);\n }\n }, []);\n\n // GSAP: animate settings panel open\n useEffect(() => {\n if (!settingsOpen) return;\n const panel = settingsPanelRef.current;\n if (!panel) return;\n gsap.killTweensOf(panel);\n gsap.fromTo(\n panel,\n { opacity: 0, y: 8, scale: 0.97 },\n { opacity: 1, y: 0, scale: 1, duration: 0.2, ease: \"power2.out\" },\n );\n }, [settingsOpen]);\n\n // GSAP: animate settings sub-menu slide-in on tab change\n useEffect(() => {\n const el = settingsContentRef.current;\n if (!el) return;\n gsap.killTweensOf(el);\n gsap.fromTo(\n el,\n { opacity: 0, x: 12 },\n { opacity: 1, x: 0, duration: 0.18, ease: \"power2.out\" },\n );\n }, [settingsTab]);\n\n // GSAP: controls chrome fade + cursor hide + trigger pending age rating\n useEffect(() => {\n const el = chromeRef.current;\n const player = playerRef.current;\n if (!el) return;\n gsap.killTweensOf(el);\n gsap.to(el, {\n opacity: controlsVisible ? 1 : 0,\n duration: 0.2,\n ease: \"power1.inOut\",\n onComplete: () => {\n if (!controlsVisible && ageRatingPendingRef.current) {\n ageRatingPendingRef.current = false;\n showAgeRatingRef.current?.();\n }\n },\n });\n el.style.pointerEvents = controlsVisible ? \"\" : \"none\";\n if (player) {\n player.style.cursor = controlsVisible ? \"\" : \"none\";\n }\n }, [controlsVisible]);\n\n // GSAP: click icon fade\n useEffect(() => {\n const el = clickIconRef.current;\n if (!el) return;\n gsap.killTweensOf(el);\n if (clickIcon) {\n gsap.to(el, { opacity: 1, duration: 0.08, ease: \"power1.in\" });\n } else {\n gsap.to(el, { opacity: 0, duration: 0.45, ease: \"power1.out\" });\n }\n }, [clickIcon]);\n\n // GSAP: progress bar track + thumb + chapter markers on hover/drag state\n useEffect(() => {\n const track = progressTrackRef.current;\n const thumb = progressThumbRef.current;\n const container = progressRef.current;\n const targetH = isDragging ? 7 : isHoveringProgress ? 5 : 3;\n const targetW = isDragging ? 18 : isHoveringProgress ? 14 : 10;\n if (track) {\n gsap.killTweensOf(track);\n gsap.to(track, { height: targetH, duration: 0.15, ease: \"power1.inOut\" });\n }\n if (thumb) {\n gsap.killTweensOf(thumb);\n gsap.to(thumb, { width: targetW, height: targetW, duration: 0.2, ease: \"back.out(1.7)\" });\n }\n if (container) {\n const markers = container.querySelectorAll(\"[data-chapter-marker]\");\n markers.forEach((el) => {\n gsap.killTweensOf(el);\n gsap.to(el, { height: targetH, duration: 0.15, ease: \"power1.inOut\" });\n });\n }\n }, [isDragging, isHoveringProgress]);\n\n // controls visibility handled via GSAP effect above\n\n useEffect(() => {\n if (sourceIndex >= parsed.sources.length) {\n setSourceIndex(initialSourceIndex);\n }\n }, [sourceIndex, parsed.sources.length, initialSourceIndex]);\n\n useEffect(() => {\n if (\n subtitleMode !== \"off\" &&\n !captions.some((subtitle) => subtitle.srclang === subtitleMode)\n ) {\n setSubtitleMode(initialSubtitleMode);\n }\n }, [subtitleMode, captions, initialSubtitleMode]);\n\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const syncTime = () => {\n setCurrentTime(video.currentTime || 0);\n\n if (video.buffered.length > 0) {\n setBufferedTime(video.buffered.end(video.buffered.length - 1));\n }\n };\n\n const syncDuration = () => {\n setDuration(Number.isFinite(video.duration) ? video.duration : 0);\n applySubtitleMode(subtitleMode);\n };\n\n const hideAgeRating = () => {\n const wrap = ageRatingWrapRef.current;\n if (!wrap) return;\n if (ageRatingTlRef.current) ageRatingTlRef.current.kill();\n gsap.to(wrap, { opacity: 0, duration: 0.4, ease: \"power2.inOut\" });\n };\n\n const showAgeRating = () => {\n if (!parsed.ageRating?.data) return;\n const wrap = ageRatingWrapRef.current;\n const icon = ageRatingIconRef.current;\n const text = ageRatingTextRef.current;\n if (!wrap) return;\n\n if (ageRatingTlRef.current) ageRatingTlRef.current.kill();\n\n const HOLD = 12;\n const tl = gsap.timeline({ delay: 0.3 });\n\n // gradient bg fade in\n tl.fromTo(wrap, { opacity: 0 }, { opacity: 1, duration: 0.5, ease: \"power2.out\" });\n\n // icon pop with elastic overshoot\n if (icon) {\n tl.fromTo(\n icon,\n { opacity: 0, scale: 0.7 },\n { opacity: 1, scale: 1, duration: 0.55, ease: \"back.out(1.6)\" },\n \"-=0.2\",\n );\n }\n\n // text slides in from left\n if (text) {\n tl.fromTo(\n text,\n { opacity: 0, x: -10 },\n { opacity: 1, x: 0, duration: 0.4, ease: \"power2.out\" },\n \"-=0.25\",\n );\n }\n\n // hold then fade everything out\n tl.to({}, { duration: HOLD });\n tl.to(wrap, { opacity: 0, duration: 0.7, ease: \"power2.inOut\", onComplete: () => { ageRatingShownRef.current = true; } });\n\n ageRatingTlRef.current = tl;\n };\n\n showAgeRatingRef.current = showAgeRating;\n\n const onPlay = () => {\n setIsPlaying(true);\n // cancel the pause timer — user resumed before the 1-min threshold\n if (ageRatingPauseTimerRef.current) {\n window.clearTimeout(ageRatingPauseTimerRef.current);\n ageRatingPauseTimerRef.current = null;\n }\n // queue age rating to show once controls hide (overlay disappears)\n const shouldShow = !ageRatingShownRef.current || ageRatingQueuedRef.current;\n ageRatingQueuedRef.current = false;\n if (shouldShow) ageRatingPendingRef.current = true;\n setHasPlayed(true);\n showControlsTemporarily();\n };\n\n const onPause = () => {\n setIsPlaying(false);\n setControlsVisible(true);\n // hide any active age rating immediately\n hideAgeRating();\n if (parsed.ageRating?.data) {\n if (ageRatingPauseTimerRef.current) window.clearTimeout(ageRatingPauseTimerRef.current);\n // after 1 min of pause, queue the next show for when play resumes\n ageRatingPauseTimerRef.current = window.setTimeout(() => {\n ageRatingQueuedRef.current = true;\n ageRatingPauseTimerRef.current = null;\n }, 60 * 1000);\n }\n };\n\n const onWaiting = () => { if (video.played.length > 0) setIsLoading(true); };\n const onCanPlay = () => setIsLoading(false);\n const onEnded = () => setControlsVisible(true);\n\n video.addEventListener(\"timeupdate\", syncTime);\n video.addEventListener(\"progress\", syncTime);\n video.addEventListener(\"loadedmetadata\", syncDuration);\n video.addEventListener(\"durationchange\", syncDuration);\n video.addEventListener(\"play\", onPlay);\n video.addEventListener(\"pause\", onPause);\n video.addEventListener(\"waiting\", onWaiting);\n video.addEventListener(\"canplay\", onCanPlay);\n video.addEventListener(\"ended\", onEnded);\n\n return () => {\n video.removeEventListener(\"timeupdate\", syncTime);\n video.removeEventListener(\"progress\", syncTime);\n video.removeEventListener(\"loadedmetadata\", syncDuration);\n video.removeEventListener(\"durationchange\", syncDuration);\n video.removeEventListener(\"play\", onPlay);\n video.removeEventListener(\"pause\", onPause);\n video.removeEventListener(\"waiting\", onWaiting);\n video.removeEventListener(\"canplay\", onCanPlay);\n video.removeEventListener(\"ended\", onEnded);\n if (ageRatingTlRef.current) ageRatingTlRef.current.kill();\n if (ageRatingPauseTimerRef.current) window.clearTimeout(ageRatingPauseTimerRef.current);\n };\n }, [applySubtitleMode, subtitleMode, showControlsTemporarily]);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n video.volume = volume;\n video.muted = isMuted || volume === 0;\n }, [volume, isMuted]);\n\n useEffect(() => {\n applySubtitleMode(subtitleMode);\n if (subtitleMode === \"off\") setActiveCue(null);\n }, [subtitleMode, applySubtitleMode]);\n\n // Apply playback rate\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n video.playbackRate = playbackRate;\n }, [playbackRate]);\n\n // Read active cue from native track and expose it for custom rendering\n const subtitleModeRef = useRef(subtitleMode);\n useEffect(() => {\n subtitleModeRef.current = subtitleMode;\n }, [subtitleMode]);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const onCueChange = () => {\n const mode = subtitleModeRef.current;\n if (mode === \"off\") {\n setActiveCue(null);\n return;\n }\n const track = Array.from(video.textTracks).find(\n (t) => t.language === mode && t.kind !== \"metadata\",\n );\n if (!track || !track.activeCues || track.activeCues.length === 0) {\n setActiveCue(null);\n return;\n }\n const cue = track.activeCues[0] as VTTCue;\n setActiveCue(cue.text.replace(/<[^>]*>/g, \"\"));\n };\n\n const bindTracks = () => {\n Array.from(video.textTracks).forEach((t) => {\n if (t.kind === \"metadata\") return;\n t.removeEventListener(\"cuechange\", onCueChange);\n t.addEventListener(\"cuechange\", onCueChange);\n });\n applySubtitleMode(subtitleModeRef.current);\n };\n\n bindTracks();\n video.textTracks.addEventListener(\"addtrack\", bindTracks);\n return () => {\n video.textTracks.removeEventListener(\"addtrack\", bindTracks);\n Array.from(video.textTracks).forEach((t) =>\n t.removeEventListener(\"cuechange\", onCueChange),\n );\n };\n }, []);\n\n useEffect(() => {\n const video = videoRef.current as WebkitVideoElement | null;\n\n const onFullscreenChange = () => {\n const doc = document as FullscreenCapableDocument;\n const nativeFullscreen = Boolean(\n document.fullscreenElement || doc.webkitFullscreenElement,\n );\n const iosVideoFullscreen = Boolean(video?.webkitDisplayingFullscreen);\n setIsFullscreen(nativeFullscreen || iosVideoFullscreen);\n };\n\n document.addEventListener(\"fullscreenchange\", onFullscreenChange);\n document.addEventListener(\n \"webkitfullscreenchange\",\n onFullscreenChange as EventListener,\n );\n video?.addEventListener(\n \"webkitbeginfullscreen\",\n onFullscreenChange as EventListener,\n );\n video?.addEventListener(\n \"webkitendfullscreen\",\n onFullscreenChange as EventListener,\n );\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n document.removeEventListener(\n \"webkitfullscreenchange\",\n onFullscreenChange as EventListener,\n );\n video?.removeEventListener(\n \"webkitbeginfullscreen\",\n onFullscreenChange as EventListener,\n );\n video?.removeEventListener(\n \"webkitendfullscreen\",\n onFullscreenChange as EventListener,\n );\n };\n }, []);\n\n useEffect(() => {\n const player = playerRef.current;\n if (!player) return;\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n setPlayerHeight(entry.contentRect.height);\n setPlayerWidth(entry.contentRect.width);\n }\n });\n ro.observe(player);\n return () => ro.disconnect();\n }, []);\n\n // Storyboard loading — supports both legacy single VTT and multi-resolution\n useEffect(() => {\n let cancelled = false;\n\n async function loadStoryboard() {\n if (!parsed.storyboard) { setStoryboardCues([]); setActiveStoryboardRes(null); return; }\n\n // Inline frames take priority\n if (parsed.storyboard.frames.length > 0) {\n setStoryboardCues(parsed.storyboard.frames);\n return;\n }\n\n // Multi-resolution path: load lowest resolution immediately\n const resolutions = parsed.storyboard.resolutions;\n if (resolutions && Object.keys(resolutions).length > 0) {\n storyboardCacheRef.current.clear();\n preloadedSpritesRef.current.clear();\n\n // Resolution priority: lowest first for initial load\n const RES_ORDER = [\"180p\", \"240p\", \"360p\", \"480p\", \"default\"];\n const keys = Object.keys(resolutions).sort((a, b) => {\n const ai = RES_ORDER.indexOf(a); const bi = RES_ORDER.indexOf(b);\n return (ai === -1 ? 99 : ai) - (bi === -1 ? 99 : bi);\n });\n\n // Load each resolution and cache it\n const loadRes = async (key: string) => {\n if (cancelled) return;\n const res = resolutions[key];\n if (!res) return;\n let cues: StoryboardFrameProps[] = [];\n if (res.vttText) {\n cues = parseStoryboardVtt(res.vttText, res.spriteUrl);\n } else {\n // Fallback: single-image cue spanning entire video\n cues = [{ start: 0, end: Number.MAX_SAFE_INTEGER, image: res.spriteUrl, w: res.tileW, h: res.tileH }];\n }\n storyboardCacheRef.current.set(key, cues);\n // Preload sprite image\n if (!preloadedSpritesRef.current.has(res.spriteUrl)) {\n preloadedSpritesRef.current.add(res.spriteUrl);\n const img = new window.Image();\n img.src = res.spriteUrl;\n }\n return cues;\n };\n\n // Load lowest res immediately, show it\n const firstKey = keys[0]!;\n const firstCues = await loadRes(firstKey);\n if (!cancelled && firstCues) {\n setStoryboardCues(firstCues);\n setActiveStoryboardRes(firstKey);\n }\n\n // Load remaining resolutions in background\n for (const key of keys.slice(1)) {\n await loadRes(key);\n }\n return;\n }\n\n // Legacy single VTT src\n if (!parsed.storyboard.src) {\n setStoryboardCues([]);\n return;\n }\n try {\n const response = await fetch(parsed.storyboard.src);\n if (!response.ok) throw new Error(\"Storyboard not found\");\n const text = await response.text();\n const cues = parseStoryboardVtt(text, new URL(parsed.storyboard.src, window.location.href).href);\n if (!cancelled) setStoryboardCues(cues);\n } catch {\n if (!cancelled && parsed.storyboard.fallbackImage) {\n setStoryboardCues([{\n start: 0, end: Number.MAX_SAFE_INTEGER,\n image: parsed.storyboard.fallbackImage,\n w: parsed.storyboard.width ?? 160, h: parsed.storyboard.height ?? 90,\n }]);\n }\n }\n }\n\n loadStoryboard();\n return () => { cancelled = true; };\n }, [parsed.storyboard]);\n\n useEffect(() => {\n const video = videoRef.current;\n let cancelled = false;\n\n if (!video || !activeSource) {\n setIsLoading(false);\n return;\n }\n\n destroyMediaEngines();\n\n setIsLoading(true);\n setCurrentTime(0);\n setBufferedTime(0);\n setDuration(0);\n setSelectedQuality(\"auto\");\n setQualities([AUTO_QUALITY]);\n setAudioTracks([]);\n setSelectedAudio(0);\n closeSettings();\n\n video.pause();\n video.removeAttribute(\"src\");\n video.load();\n\n const sourceType = inferSourceType(activeSource);\n\n if (sourceType === \"dash\") {\n void (async () => {\n try {\n const dashModule = await import(\"dashjs\");\n if (cancelled) return;\n\n const dashjs = dashModule as any;\n const dash = dashjs.MediaPlayer().create();\n dashRef.current = dash;\n\n dash.updateSettings({\n streaming: {\n abr: {\n autoSwitchBitrate: {\n video: true,\n },\n },\n },\n });\n\n dash.on(dashjs.MediaPlayer.events.STREAM_INITIALIZED, () => {\n const bitrates = dash.getBitrateInfoListFor(\"video\") ?? [];\n\n setQualities([\n AUTO_QUALITY,\n ...bitrates.map((item: any, index: number) => ({\n id: `dash-${index}`,\n label: item.height\n ? `${item.height}p`\n : `${Math.round((item.bitrate ?? 0) / 1000)} kbps`,\n type: \"dash\" as const,\n index,\n })),\n ]);\n\n setIsLoading(false);\n });\n\n dash.on(dashjs.MediaPlayer.events.ERROR, () => {\n console.error(\"[Silo] MPEG-DASH playback failed\");\n setIsLoading(false);\n });\n\n dash.initialize(video, activeSource.src, false);\n } catch {\n if (!cancelled) {\n console.error(\"[Silo] MPEG-DASH player load failed\");\n setIsLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n destroyMediaEngines();\n };\n }\n\n if (sourceType === \"hls\") {\n void (async () => {\n try {\n const HlsModule = await import(\"hls.js\");\n if (cancelled) return;\n\n const Hls = HlsModule.default;\n\n console.debug(\"[Silo/hls] Hls.isSupported()=\", Hls.isSupported());\n\n if (Hls.isSupported()) {\n const hls = new Hls({\n enableWorker: true,\n // Buffer ~20s ahead (≈1/6 of a 2min video). maxMaxBufferLength caps the\n // absolute ceiling so HLS.js doesn't buffer the entire file on fast connections.\n maxBufferLength: 20,\n maxMaxBufferLength: 30,\n maxBufferSize: 40 * 1000 * 1000,\n // Keep only 10s of back-buffer for seeking — avoids holding GB of 4K data\n backBufferLength: 10,\n maxBufferHole: 0.5,\n highBufferWatchdogPeriod: 5,\n nudgeOffset: 0.2,\n nudgeMaxRetry: 3,\n startLevel: -1,\n abrBandWidthFactor: 0.95,\n abrBandWidthUpFactor: 0.7,\n abrEwmaDefaultEstimate: 5_000_000,\n });\n\n hlsRef.current = hls;\n\n // Track explicit user selections so ABR / HLS internals can't override them\n let pinnedLevel = -1; // -1 = ABR auto; ≥0 = user locked\n let pinnedAudio = -1; // -1 = not set; ≥0 = user locked\n\n console.debug(\"[Silo/hls] loadSource\", activeSource.src);\n hls.loadSource(activeSource.src);\n hls.attachMedia(video);\n\n hls.on(Hls.Events.MANIFEST_PARSED, (_: any, data: any) => {\n const levels = data.levels ?? hls.levels ?? [];\n console.debug(\"[Silo/hls] MANIFEST_PARSED levels=\", levels.length, \"audioTracks=\", hls.audioTracks?.length ?? 0);\n\n const hdrSupported = deviceSupportsHdr();\n const opusSupported = deviceSupportsOpus();\n\n setQualities([\n AUTO_QUALITY,\n ...levels.map((level: any, index: number) => {\n const hdr = isHdrLevel(level);\n const rawCodecs = (level.attrs?.CODECS ?? \"\").split(\",\").map((c: string) => c.trim());\n const videoCodec = level.videoCodec\n ?? rawCodecs.find((c: string) => /^avc1|^hvc1|^hev1|^av01|^vp09/i.test(c))\n ?? rawCodecs[0] ?? \"\";\n const audioCodec = level.audioCodec\n ?? rawCodecs.find((c: string) => /^mp4a|^opus|^ec-3|^ac-3/i.test(c))\n ?? \"\";\n const videoOk = deviceSupportsVideoCodec(videoCodec);\n const audioOk = deviceSupportsAudioCodec(audioCodec);\n const supported = (hdr ? hdrSupported : true) && videoOk && audioOk;\n const baseName = level.name ?? (level.height ? `${level.height}p` : `${index + 1}`);\n const label = (hdr && hdrSupported) ? `${baseName} HDR` : baseName;\n return { id: `hls-${index}`, label, type: \"hls\" as const, index, supported, hdr };\n }),\n ]);\n\n const tracks: any[] = hls.audioTracks ?? [];\n console.debug(\"[Silo/hls] audio tracks:\", tracks.map((t: any) => ({ name: t.name, lang: t.lang, url: t.url })));\n if (tracks.length > 1) {\n setAudioTracks(\n tracks.map((t: any, i: number) => {\n const codec = (t.attrs?.CODECS ?? t.codecSet ?? \"\").split(\",\")[0]?.trim() ?? \"\";\n const supported = deviceSupportsAudioCodec(codec);\n const label = friendlyAudioLabel(t.name, t.lang, codec, t.channels ?? t.attrs?.CHANNELS);\n return { id: i, label, supported };\n }),\n );\n // Only set default audio if user hasn't pinned one yet\n if (pinnedAudio === -1) setSelectedAudio(hls.audioTrack ?? 0);\n }\n\n // Restore pinned selections if manifest reloaded (source change)\n if (pinnedLevel >= 0) hls.currentLevel = pinnedLevel;\n if (pinnedAudio >= 0) hls.audioTrack = pinnedAudio;\n\n setIsLoading(false);\n });\n\n hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, (_: any, data: any) => {\n const tracks: any[] = data.audioTracks ?? [];\n console.debug(\"[Silo/hls] AUDIO_TRACKS_UPDATED\", tracks.length);\n if (tracks.length > 1) {\n setAudioTracks(\n tracks.map((t: any, i: number) => {\n const codec = (t.attrs?.CODECS ?? t.codecSet ?? \"\").split(\",\")[0]?.trim() ?? \"\";\n const supported = deviceSupportsAudioCodec(codec);\n const label = friendlyAudioLabel(t.name, t.lang, codec, t.channels ?? t.attrs?.CHANNELS);\n return { id: i, label, supported };\n }),\n );\n }\n // Re-apply pinned audio if HLS reset it\n if (pinnedAudio >= 0 && hls.audioTrack !== pinnedAudio) {\n hls.audioTrack = pinnedAudio;\n }\n });\n\n // After the switch completes: lock currentLevel so ABR can't override,\n // and re-apply pinned audio (level switches can reset the audio track).\n hls.on(Hls.Events.LEVEL_SWITCHED, (_: any, data: any) => {\n console.debug(\"[Silo/hls] LEVEL_SWITCHED\", data.level);\n // Lock currentLevel only once we've actually landed on the pinned level.\n // At this point the old buffer is consumed — safe to lock without flush.\n if (pinnedLevel >= 0 && data.level === pinnedLevel) {\n hls.currentLevel = pinnedLevel;\n }\n if (pinnedAudio >= 0 && hls.audioTrack !== pinnedAudio) {\n hls.audioTrack = pinnedAudio;\n }\n });\n\n // Expose pin setters on the hls instance so changeQuality/changeAudio can write them\n (hls as any).__pinLevel = (level: number) => { pinnedLevel = level; };\n (hls as any).__pinAudio = (track: number) => { pinnedAudio = track; };\n\n hls.on(Hls.Events.LEVEL_LOADED, (_: any, data: any) => {\n console.debug(\"[Silo/hls] LEVEL_LOADED level=\", data.level, \"fragments=\", data.details?.fragments?.length);\n });\n\n hls.on(Hls.Events.AUDIO_TRACK_LOADED, (_: any, data: any) => {\n console.debug(\"[Silo/hls] AUDIO_TRACK_LOADED track=\", data.id, \"fragments=\", data.details?.fragments?.length);\n });\n\n hls.on(Hls.Events.FRAG_LOADING, (_: any, data: any) => {\n console.debug(\"[Silo/hls] FRAG_LOADING\", data.frag?.type, data.frag?.url?.slice(-60));\n });\n\n hls.on(Hls.Events.FRAG_LOADED, (_: any, data: any) => {\n console.debug(\"[Silo/hls] FRAG_LOADED\", data.frag?.type, data.frag?.sn);\n });\n\n let mediaErrorAttempts = 0;\n let audioAppendErrors = 0;\n let stalledOnPinnedLevel = 0;\n hls.on(Hls.Events.ERROR, (_: any, data: any) => {\n const fragUrl = (data.frag?.url ?? data.url ?? \"\").slice(-80);\n const fragType = data.frag?.type ?? \"?\";\n console.debug(\"[Silo/hls] ERROR fatal=\", data.fatal, \"type=\", data.type, \"details=\", data.details, \"fragType=\", fragType, \"url=\", fragUrl);\n\n if (!data.fatal) {\n // Audio buffer append loop — after 3 failures disable demuxed audio tracks\n const isAudioBufError =\n fragType === \"audio\" &&\n (data.details === Hls.ErrorDetails.BUFFER_APPEND_ERROR ||\n data.details === Hls.ErrorDetails.BUFFER_APPENDING_ERROR);\n if (isAudioBufError) {\n audioAppendErrors += 1;\n if (audioAppendErrors >= 3) {\n console.warn(\"[Silo/hls] repeated audio buffer errors — disabling separate audio tracks\");\n setAudioTracks([]);\n try { hls.audioTrack = -1; } catch { /* ignore */ }\n audioAppendErrors = 0;\n }\n } else {\n audioAppendErrors = 0;\n }\n\n // bufferStalledError on a user-pinned level means the network can't sustain\n // that quality. After 4 stalls, unpin and step down one level so HLS can\n // recover without the user having to manually change quality.\n if (data.details === Hls.ErrorDetails.BUFFER_STALLED_ERROR && pinnedLevel >= 0) {\n stalledOnPinnedLevel += 1;\n if (stalledOnPinnedLevel >= 4) {\n stalledOnPinnedLevel = 0;\n const nextLevel = Math.max(0, pinnedLevel - 1);\n console.warn(\"[Silo/hls] repeated stalls on pinned level\", pinnedLevel, \"— stepping down to\", nextLevel);\n pinnedLevel = nextLevel;\n hls.currentLevel = nextLevel;\n setSelectedQuality(nextLevel === 0 ? \"auto\" : `hls-${nextLevel}`);\n }\n } else if (data.details !== Hls.ErrorDetails.BUFFER_STALLED_ERROR) {\n stalledOnPinnedLevel = 0;\n }\n\n return;\n }\n\n // fragParsingError on an audio fragment → likely unsupported audio codec in\n // the separate-audio track (e.g. AC-3 on a browser that can't decode it).\n // Drop all audio tracks and retry with video-only; playback should continue.\n if (data.details === Hls.ErrorDetails.FRAG_PARSING_ERROR && fragType === \"audio\") {\n console.warn(\"[Silo/hls] audio frag parse failed — disabling separate audio tracks and retrying\");\n setAudioTracks([]);\n hls.recoverMediaError();\n return;\n }\n\n if (data.type === Hls.ErrorTypes.MEDIA_ERROR && mediaErrorAttempts < 2) {\n mediaErrorAttempts += 1;\n console.debug(\"[Silo/hls] recoverMediaError attempt\", mediaErrorAttempts);\n hls.recoverMediaError();\n return;\n }\n\n console.error(\"[Silo] HLS playback failed\", data.details, \"fragType=\", fragType, \"url=\", fragUrl);\n hls.destroy();\n hlsRef.current = null;\n setIsLoading(false);\n });\n\n video.addEventListener(\"waiting\", () => console.debug(\"[Silo/hls] video:waiting readyState=\", video.readyState, \"played=\", video.played.length));\n video.addEventListener(\"canplay\", () => console.debug(\"[Silo/hls] video:canplay readyState=\", video.readyState));\n video.addEventListener(\"stalled\", () => console.debug(\"[Silo/hls] video:stalled\"));\n video.addEventListener(\"suspend\", () => console.debug(\"[Silo/hls] video:suspend\"));\n\n return;\n }\n\n if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n console.debug(\"[Silo/hls] using native HLS (Safari)\");\n video.src = activeSource.src;\n video.load();\n setIsLoading(false);\n return;\n }\n\n console.error(\"[Silo] HLS not supported in this browser\");\n setIsLoading(false);\n } catch {\n if (!cancelled) {\n console.error(\"[Silo] HLS player load failed\");\n setIsLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n destroyMediaEngines();\n };\n }\n\n video.src = activeSource.src;\n video.load();\n setIsLoading(false);\n\n return () => {\n cancelled = true;\n video.removeAttribute(\"src\");\n video.load();\n };\n }, [activeSource, destroyMediaEngines]);\n\n const togglePlay = useCallback(async () => {\n const video = videoRef.current;\n if (!video) return;\n\n const wasPaused = video.paused;\n\n try {\n if (wasPaused) {\n // Wait for enough data if the browser isn't ready (e.g. after a seek)\n if (video.readyState < HTMLMediaElement.HAVE_FUTURE_DATA) {\n await new Promise<void>((resolve) => {\n const onReady = () => { video.removeEventListener(\"canplay\", onReady); resolve(); };\n video.addEventListener(\"canplay\", onReady);\n });\n }\n await video.play();\n } else {\n video.pause();\n }\n if (clickIconTimerRef.current)\n window.clearTimeout(clickIconTimerRef.current);\n setClickIcon(wasPaused ? \"play\" : \"pause\");\n clickIconTimerRef.current = window.setTimeout(\n () => setClickIcon(null),\n 600,\n );\n } catch {\n // Autoplay policy or seek-in-progress — silently ignore\n }\n }, []);\n\n const seekRelative = useCallback((seconds: number) => {\n const video = videoRef.current;\n if (!video) return;\n\n video.currentTime = Math.max(\n 0,\n Math.min(video.currentTime + seconds, video.duration || 0),\n );\n }, []);\n\n const toggleFullscreen = useCallback(async () => {\n const player = playerRef.current as FullscreenCapableElement | null;\n const video = videoRef.current as WebkitVideoElement | null;\n const doc = document as FullscreenCapableDocument;\n\n if (!player && !video) return;\n\n try {\n const nativeFullscreen = Boolean(\n document.fullscreenElement || doc.webkitFullscreenElement,\n );\n const iosVideoFullscreen = Boolean(video?.webkitDisplayingFullscreen);\n\n if (nativeFullscreen || iosVideoFullscreen) {\n if (document.fullscreenElement && document.exitFullscreen) {\n await document.exitFullscreen();\n return;\n }\n\n if (doc.webkitExitFullscreen) {\n await doc.webkitExitFullscreen();\n return;\n }\n\n if (video?.webkitExitFullscreen) {\n video.webkitExitFullscreen();\n return;\n }\n\n return;\n }\n\n if (player?.requestFullscreen) {\n await player.requestFullscreen();\n return;\n }\n\n if (player?.webkitRequestFullscreen) {\n await player.webkitRequestFullscreen();\n return;\n }\n\n if (video?.webkitEnterFullscreen) {\n video.webkitEnterFullscreen();\n return;\n }\n\n if (video?.requestFullscreen) {\n await video.requestFullscreen();\n return;\n }\n\n throw new Error(\"Fullscreen unavailable\");\n } catch {\n console.error(\"[Silo] Fullscreen toggle failed\");\n }\n }, []);\n\n const changeAudio = useCallback((trackId: number) => {\n setSelectedAudio(trackId);\n closeSettings();\n if (hlsRef.current) {\n // Pin the user's choice so it survives quality switches and manifest reloads\n (hlsRef.current as any).__pinAudio?.(trackId);\n hlsRef.current.audioTrack = trackId;\n }\n }, [closeSettings]);\n\n const changeQuality = useCallback(\n (qualityId: string) => {\n const option = qualities.find((quality) => quality.id === qualityId);\n if (!option) return;\n\n setSelectedQuality(qualityId);\n closeSettings();\n\n if (option.type === \"auto\") {\n if (hlsRef.current) {\n // Clear pin — let ABR decide\n (hlsRef.current as any).__pinLevel?.(-1);\n hlsRef.current.currentLevel = -1;\n }\n\n if (dashRef.current) {\n dashRef.current.updateSettings({\n streaming: {\n abr: {\n autoSwitchBitrate: {\n video: true,\n },\n },\n },\n });\n }\n\n return;\n }\n\n if (option.type === \"hls\" && hlsRef.current && option.index != null) {\n // Pin so LEVEL_SWITCHED handler can lock currentLevel once the switch lands.\n (hlsRef.current as any).__pinLevel?.(option.index);\n // nextLevel: schedules the quality change at the next segment boundary.\n // The existing buffer at the current quality keeps playing uninterrupted —\n // no flush, no freeze. currentLevel is locked in the LEVEL_SWITCHED handler\n // after the switch completes, preventing ABR from overriding afterwards.\n hlsRef.current.nextLevel = option.index;\n return;\n }\n\n if (option.type === \"dash\" && dashRef.current && option.index != null) {\n dashRef.current.updateSettings({\n streaming: {\n abr: {\n autoSwitchBitrate: {\n video: false,\n },\n },\n },\n });\n\n dashRef.current.setQualityFor(\"video\", option.index);\n }\n },\n [qualities, closeSettings],\n );\n\n const seekFromPointer = useCallback(\n (clientX: number) => {\n const video = videoRef.current;\n const progress = progressRef.current;\n if (!video || !progress || !duration) return;\n const rect = progress.getBoundingClientRect();\n const x = Math.max(0, Math.min(clientX - rect.left, rect.width));\n const nextTime = (x / rect.width) * duration;\n video.currentTime = nextTime;\n setCurrentTime(nextTime);\n },\n [duration],\n );\n\n // Adaptive storyboard resolution — upgrade to highest loaded res when hovering progress bar\n const upgradeStoryboardResolution = useCallback((hoverTime: number) => {\n const resolutions = parsed.storyboard?.resolutions;\n if (!resolutions || storyboardCacheRef.current.size === 0) return;\n\n const RES_ORDER = [\"480p\", \"360p\", \"240p\", \"180p\", \"default\"];\n const conn = typeof navigator !== \"undefined\" ? (navigator as any).connection : null;\n // On slow connections cap at 240p for mouse hover\n const maxRes = conn?.effectiveType === \"2g\" ? \"180p\" : conn?.effectiveType === \"3g\" ? \"240p\" : \"480p\";\n const maxIdx = RES_ORDER.indexOf(maxRes);\n\n for (let i = 0; i <= maxIdx; i++) {\n const key = RES_ORDER[i]!;\n if (storyboardCacheRef.current.has(key)) {\n if (activeStoryboardRes !== key) {\n setStoryboardCues(storyboardCacheRef.current.get(key)!);\n setActiveStoryboardRes(key);\n // Preload sprite image at new resolution\n const spriteUrl = resolutions[key]?.spriteUrl;\n if (spriteUrl && !preloadedSpritesRef.current.has(spriteUrl)) {\n preloadedSpritesRef.current.add(spriteUrl);\n const img = new window.Image();\n img.src = spriteUrl;\n }\n }\n break;\n }\n }\n\n // Preload sprites around hover time for the best available resolution\n const bestKey = [...storyboardCacheRef.current.keys()].sort((a, b) => {\n const order = [\"480p\", \"360p\", \"240p\", \"180p\", \"default\"];\n return order.indexOf(a) - order.indexOf(b);\n })[0];\n if (bestKey) {\n const cues = storyboardCacheRef.current.get(bestKey) ?? [];\n // Find 3 cues around hoverTime and preload their sprites\n const nearIdx = cues.findIndex((c) => c.start > hoverTime);\n const window2 = cues.slice(Math.max(0, nearIdx - 2), nearIdx + 3);\n for (const c of window2) {\n if (!preloadedSpritesRef.current.has(c.image)) {\n preloadedSpritesRef.current.add(c.image);\n const img = new window.Image();\n img.src = c.image;\n }\n }\n }\n }, [parsed.storyboard?.resolutions, activeStoryboardRes]);\n\n // Preload storyboard tiles around currentTime (video playhead) at low resolution\n useEffect(() => {\n const resolutions = parsed.storyboard?.resolutions;\n if (!resolutions || storyboardCacheRef.current.size === 0 || !duration) return;\n\n // Use lowest available resolution for background preload around playhead\n const RES_ORDER = [\"180p\", \"240p\", \"360p\", \"480p\", \"default\"];\n const lowestKey = RES_ORDER.find((k) => storyboardCacheRef.current.has(k));\n if (!lowestKey) return;\n\n const cues = storyboardCacheRef.current.get(lowestKey) ?? [];\n const playheadIdx = cues.findIndex((c) => c.start > currentTime);\n // Preload 5 cues ahead and 2 behind the playhead\n const nearby = cues.slice(Math.max(0, playheadIdx - 2), playheadIdx + 6);\n for (const c of nearby) {\n if (!preloadedSpritesRef.current.has(c.image)) {\n preloadedSpritesRef.current.add(c.image);\n const img = new window.Image();\n img.src = c.image;\n }\n }\n }, [Math.floor(currentTime / 10), parsed.storyboard?.resolutions, duration]); // check every 10s\n\n const updatePreview = useCallback(\n (clientX: number) => {\n const progress = progressRef.current;\n if (!progress || !duration || storyboardCues.length === 0) {\n setPreview(null);\n return;\n }\n const rect = progress.getBoundingClientRect();\n const x = Math.max(0, Math.min(clientX - rect.left, rect.width));\n const time = (x / rect.width) * duration;\n\n // Upgrade to higher resolution when mouse is on the progress bar\n upgradeStoryboardResolution(time);\n\n const cue = findStoryboardCue(storyboardCues, time);\n if (!cue) {\n setPreview(null);\n return;\n }\n setPreview({\n cue,\n time,\n left: Math.max(80, Math.min(x, rect.width - 80)),\n });\n },\n [duration, storyboardCues, upgradeStoryboardResolution],\n );\n\n const handleProgressPointerMove = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n updatePreview(event.clientX);\n if (isDragging) seekFromPointer(event.clientX);\n },\n [isDragging, seekFromPointer, updatePreview],\n );\n\n const handleProgressPointerEnter = useCallback(() => {\n setIsHoveringProgress(true);\n }, []);\n\n const handleProgressPointerLeave = useCallback(() => {\n setIsHoveringProgress(false);\n if (!isDragging) {\n setPreview(null);\n // Downgrade back to lowest resolution when mouse leaves the progress bar\n const resolutions = parsed.storyboard?.resolutions;\n if (resolutions && storyboardCacheRef.current.size > 0) {\n const RES_ORDER = [\"180p\", \"240p\", \"360p\", \"480p\", \"default\"];\n const lowestKey = RES_ORDER.find((k) => storyboardCacheRef.current.has(k));\n if (lowestKey && activeStoryboardRes !== lowestKey) {\n setStoryboardCues(storyboardCacheRef.current.get(lowestKey)!);\n setActiveStoryboardRes(lowestKey);\n }\n }\n }\n }, [isDragging, parsed.storyboard?.resolutions, activeStoryboardRes]);\n\n const handleProgressPointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n const progress = progressRef.current;\n if (!progress) return;\n progress.setPointerCapture(event.pointerId);\n dragPointerIdRef.current = event.pointerId;\n setIsDragging(true);\n seekFromPointer(event.clientX);\n updatePreview(event.clientX);\n },\n [seekFromPointer, updatePreview],\n );\n\n const handleProgressPointerUp = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n if (dragPointerIdRef.current === event.pointerId) {\n setIsDragging(false);\n dragPointerIdRef.current = null;\n setPreview(null);\n }\n },\n [],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n const tagName = target.tagName.toLowerCase();\n\n if ([\"input\", \"select\", \"button\"].includes(tagName)) {\n return;\n }\n\n if (event.key === \" \") {\n event.preventDefault();\n togglePlay();\n }\n\n if (event.key === \"ArrowRight\") {\n seekRelative(10);\n }\n\n if (event.key === \"ArrowLeft\") {\n seekRelative(-10);\n }\n\n if (event.key.toLowerCase() === \"f\") {\n toggleFullscreen();\n }\n\n if (event.key.toLowerCase() === \"m\") {\n setIsMuted((value) => !value);\n }\n },\n [seekRelative, toggleFullscreen, togglePlay],\n );\n\n if (!activeSource) {\n return (\n <div className=\"rounded-xl border border-red-200 bg-red-50 p-4 text-sm text-red-700\">\n O componente Video precisa de pelo menos um <code>{\"<Source />\"}</code>.\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={`@container mx-auto w-full max-w-6xl${className ?? \"\"}`}\n >\n <div\n ref={playerRef}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onMouseMove={showControlsTemporarily}\n onMouseLeave={() => {\n closeSettings();\n if (isPlaying && autoHideControls) {\n setControlsVisible(false);\n }\n }}\n onBlur={(e) => {\n // Close menus when focus leaves the player entirely\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n closeSettings();\n }\n }}\n onTouchStart={showControlsTemporarily}\n onTouchMove={showControlsTemporarily}\n className=\"relative w-full overflow-hidden rounded-[14px] bg-black shadow-[0_30px_90px_rgba(15,15,15,0.22)] outline-none ring-1 ring-black/5\"\n style={\n fixedHeight\n ? {\n height:\n typeof fixedHeight === \"number\"\n ? `${fixedHeight}px`\n : fixedHeight,\n }\n : maxHeight\n ? {\n maxHeight:\n typeof maxHeight === \"number\"\n ? `${maxHeight}px`\n : maxHeight,\n aspectRatio: \"16/9\",\n }\n : { aspectRatio: \"16/9\" }\n }\n >\n <video\n ref={videoRef}\n className=\"h-full w-full object-contain\"\n playsInline\n preload=\"metadata\"\n crossOrigin=\"anonymous\"\n >\n {captions.map((subtitle) => (\n <track\n key={`${activeSource.src}-${subtitle.srclang}-${subtitle.src}`}\n kind=\"subtitles\"\n src={subtitle.src}\n srcLang={subtitle.srclang}\n label={subtitle.label}\n default={subtitle.default}\n />\n ))}\n {parsed.storyboard?.src && (\n <track\n kind=\"metadata\"\n label=\"thumbnails\"\n src={parsed.storyboard.src}\n />\n )}\n </video>\n\n {/* Poster overlay — shown only before first play */}\n {poster && !hasPlayed && (\n <img\n src={poster}\n aria-hidden\n className=\"pointer-events-none absolute inset-0 h-full w-full object-contain bg-black\"\n />\n )}\n\n {/* Age rating overlay — driven by GSAP timeline, always mounted */}\n {parsed.ageRating?.data && (() => {\n const ar = parsed.ageRating!;\n const regionKey = resolveAgeRatingRegion(ar.locale, ar.data!);\n if (!regionKey) return null;\n const code = ar.data![regionKey];\n const lookupKey = `${regionKey}:${code}`;\n const info = ar.lookup?.[lookupKey];\n return (\n <div\n ref={ageRatingWrapRef}\n className=\"pointer-events-none absolute inset-0 z-20 flex items-start justify-start\"\n style={{\n opacity: 0,\n background: \"linear-gradient(135deg, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.4) 40%, transparent 65%)\",\n }}\n >\n <div className=\"flex items-center gap-3.5 px-5 pt-5 @sm:px-7 @sm:pt-7\">\n <div ref={ageRatingIconRef} style={{ opacity: 0 }}>\n {info?.imageUrl ? (\n <img src={info.imageUrl} alt={code} className=\"h-14 w-auto object-contain @sm:h-16 drop-shadow-[0_2px_8px_rgba(0,0,0,0.6)]\" />\n ) : (\n <span className=\"flex h-14 min-w-14 items-center justify-center rounded-md border-2 border-white/40 px-2 text-lg font-bold text-white @sm:h-16 @sm:min-w-16 @sm:text-xl drop-shadow-[0_2px_8px_rgba(0,0,0,0.6)]\">\n {code}\n </span>\n )}\n </div>\n {(info?.title || info?.description) && (\n <div ref={ageRatingTextRef} className=\"flex flex-col gap-0.5\" style={{ opacity: 0 }}>\n {info.title && <span className=\"text-sm font-semibold text-white @sm:text-base drop-shadow-[0_1px_4px_rgba(0,0,0,0.8)]\">{info.title}</span>}\n {info.description && <span className=\"text-xs text-white/70 leading-snug max-w-56 @sm:text-sm @sm:max-w-72 drop-shadow-[0_1px_4px_rgba(0,0,0,0.8)]\">{info.description}</span>}\n </div>\n )}\n </div>\n </div>\n );\n })()}\n\n {/* Click feedback / action icon — no background, shows briefly only on action */}\n <div\n ref={clickIconRef}\n className=\"pointer-events-none absolute inset-0 z-10 grid place-items-center\"\n style={{ opacity: 0 }}\n >\n <span className=\"grid size-10 place-items-center text-white drop-shadow-[0_2px_12px_rgba(0,0,0,0.8)] @sm:size-14 @lg:size-16\">\n {clickIcon === \"pause\" ? (\n <Pause className=\"size-7 @sm:size-9 @lg:size-11\" fill=\"white\" />\n ) : (\n <Play\n className=\"ml-0.5 size-7 @sm:size-9 @lg:size-11\"\n fill=\"white\"\n />\n )}\n </span>\n </div>\n\n {isLoading && (\n <div className=\"pointer-events-none absolute inset-0 z-20 grid place-items-center bg-black/10\">\n <div className=\"size-9 animate-spin rounded-full border-2 border-white/25 border-t-white\" />\n </div>\n )}\n\n\n <div\n ref={chromeRef}\n onClick={togglePlay}\n className={`absolute inset-0 z-30 flex flex-col ${\n isFullscreen ? \"justify-between\" : \"justify-end\"\n }`}\n >\n {/* Top gradient — only in fullscreen */}\n {isFullscreen && (\n <div className=\"pointer-events-none absolute inset-x-0 top-0 h-32 bg-linear-to-b from-black/70 to-transparent\" />\n )}\n {/* Bottom gradient */}\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-40 bg-linear-to-t from-black/80 to-transparent\" />\n\n {isFullscreen && (\n <header\n onClick={(e) => e.stopPropagation()}\n className=\"relative z-10 flex items-start px-4 pt-4 text-white @sm:px-7 @sm:pt-7 @lg:px-9 @lg:pt-8\"\n >\n <div>\n {title && (\n <h1\n className=\"text-sm font-bold tracking-wide @sm:text-base @md:text-lg @lg:text-xl\"\n style={{ textShadow: \"0 1px 6px rgba(0,0,0,0.6)\" }}\n >\n {title}\n </h1>\n )}\n\n {description && (\n <p className=\"mt-1 text-xs font-medium text-white/85 @sm:text-sm\">\n {description}\n </p>\n )}\n </div>\n </header>\n )}\n\n <footer\n onClick={(e) => e.stopPropagation()}\n className=\"relative z-10 px-4 pb-4 text-white\"\n >\n {/* Settings panel — nested, one sub-menu at a time */}\n {settingsOpen && (\n <>\n <div\n className=\"fixed inset-0 z-70\"\n onClick={closeSettings}\n />\n <div\n ref={settingsPanelRef}\n className=\"absolute bottom-full right-2 z-70 mb-2 overflow-hidden rounded-2xl bg-[#1c1c1e]/95 shadow-2xl backdrop-blur-xl ring-1 ring-white/10\"\n style={{\n width:\n Math.min(\n 224,\n Math.max(180, (playerWidth || 640) * 0.22),\n ) + \"px\",\n opacity: 0,\n }}\n >\n <div ref={settingsContentRef}>\n {/* Root menu */}\n {settingsTab === \"root\" && (\n <div>\n {(\n [\n {\n id: \"quality\" as SettingsTab,\n label: \"Qualidade\",\n value:\n qualities.find((q) => q.id === selectedQuality)\n ?.label ?? \"Auto\",\n },\n ...(captions.length > 0\n ? [\n {\n id: \"subtitles\" as SettingsTab,\n label: \"Legendas\",\n value:\n subtitleStyle.track === \"off\"\n ? \"Desligado\"\n : (captions.find(\n (s) =>\n s.srclang === subtitleStyle.track,\n )?.label ?? subtitleStyle.track),\n },\n ]\n : []),\n ...(audioTracks.length > 1\n ? [\n {\n id: \"audio\" as SettingsTab,\n label: \"Áudio\",\n value:\n audioTracks.find(\n (t) => t.id === selectedAudio,\n )?.label ?? \"\",\n },\n ]\n : []),\n {\n id: \"playback\" as SettingsTab,\n label: \"Velocidade\",\n value:\n playbackRate === 1\n ? \"Normal\"\n : `${playbackRate}×`,\n },\n ] as { id: SettingsTab; label: string; value: string }[]\n ).map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => setSettingsTab(item.id)}\n className=\"flex w-full items-center justify-between gap-3 px-4 py-3 text-sm transition hover:bg-white/8 first:pt-3.5 last:pb-3.5\"\n >\n <span className=\"text-white/80\">{item.label}</span>\n <span className=\"flex items-center gap-1.5 text-xs text-white/40\">\n {item.value}\n <svg\n className=\"size-3 opacity-50\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M4.5 3l3 3-3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </button>\n ))}\n </div>\n )}\n\n {/* Quality sub-menu */}\n {settingsTab === \"quality\" && (\n <div>\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"root\")}\n className=\"flex w-full items-center gap-2 border-b border-white/8 px-4 py-3 text-xs font-semibold text-white/50 transition hover:text-white\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M7.5 3L4.5 6l3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Qualidade\n </button>\n <div className=\"py-1.5\">\n {[...qualities].reverse().map((quality) => {\n const unavailable = quality.supported === false;\n return (\n <button\n key={quality.id}\n type=\"button\"\n onClick={() => {\n if (unavailable) return;\n changeQuality(quality.id);\n setSettingsTab(\"root\");\n }}\n disabled={unavailable}\n className={`flex w-full items-center gap-3 px-4 py-2.5 text-sm transition ${unavailable ? \"cursor-not-allowed opacity-40\" : \"hover:bg-white/8\"}`}\n >\n <svg\n className={`size-4 shrink-0 ${selectedQuality === quality.id ? \"text-white\" : \"text-transparent\"}`}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3 8l3.5 3.5L13 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"flex-1 text-left\">\n <span\n className={\n selectedQuality === quality.id\n ? \"font-semibold text-white\"\n : \"text-white/55\"\n }\n >\n {quality.label}\n {quality.id === \"auto\" ? \" (ABR)\" : \"\"}\n </span>\n {unavailable && (\n <span className=\"ml-1.5 text-[10px] text-white/30\">Não disponível</span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Subtitles sub-menu */}\n {settingsTab === \"subtitles\" && (\n <div>\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"root\")}\n className=\"flex w-full items-center gap-2 border-b border-white/8 px-4 py-3 text-xs font-semibold text-white/50 transition hover:text-white\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M7.5 3L4.5 6l3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Legendas\n </button>\n <div className=\"py-1.5\">\n {[\n { srclang: \"off\", label: \"Desligado\" },\n ...captions,\n ].map((s) => (\n <button\n key={s.srclang}\n type=\"button\"\n onClick={() => {\n const next =\n s.srclang === \"off\" ? \"off\" : s.srclang;\n setSubtitleMode(next);\n setSubtitleStyle((st) => ({\n ...st,\n track: next,\n }));\n }}\n className=\"flex w-full items-center gap-3 px-4 py-2.5 text-sm transition hover:bg-white/8\"\n >\n <svg\n className={`size-4 shrink-0 ${subtitleStyle.track === s.srclang ? \"text-white\" : \"text-transparent\"}`}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3 8l3.5 3.5L13 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span\n className={\n subtitleStyle.track === s.srclang\n ? \"font-semibold text-white\"\n : \"text-white/55\"\n }\n >\n {s.label}\n </span>\n </button>\n ))}\n </div>\n {subtitleStyle.track !== \"off\" && (\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"subtitles-style\")}\n className=\"flex w-full items-center justify-between gap-3 border-t border-white/8 px-4 py-3 text-sm transition hover:bg-white/8\"\n >\n <span className=\"text-white/60\">Aparência</span>\n <svg\n className=\"size-3 opacity-50\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M4.5 3l3 3-3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Subtitles style sub-menu */}\n {settingsTab === \"subtitles-style\" && (\n <div>\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"subtitles\")}\n className=\"flex w-full items-center gap-2 border-b border-white/8 px-4 py-3 text-xs font-semibold text-white/50 transition hover:text-white\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M7.5 3L4.5 6l3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Aparência\n </button>\n <div className=\"px-4 py-3 flex flex-col gap-3\">\n {/* Size */}\n <div>\n <p className=\"mb-1.5 text-xs font-semibold text-white/40 uppercase tracking-wide\">\n Tamanho\n </p>\n <div className=\"flex gap-1.5\">\n {(\n [\"small\", \"medium\", \"large\", \"xlarge\"] as const\n ).map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() =>\n setSubtitleStyle((st) => ({ ...st, size: s }))\n }\n className={`flex-1 rounded-lg py-1.5 text-xs font-medium transition${subtitleStyle.size === s ? \"bg-white/20 text-white\" : \"text-white/45 hover:bg-white/10\"}`}\n >\n {s === \"small\"\n ? \"P\"\n : s === \"medium\"\n ? \"M\"\n : s === \"large\"\n ? \"G\"\n : \"GG\"}\n </button>\n ))}\n </div>\n </div>\n {/* Color */}\n <div>\n <p className=\"mb-1.5 text-xs font-semibold text-white/40 uppercase tracking-wide\">\n Cor\n </p>\n <div className=\"flex gap-1.5\">\n {(\n [\n [\"white\", \"Branco\", \"#fff\"],\n [\"yellow\", \"Amarelo\", \"#facc15\"],\n [\"cyan\", \"Ciano\", \"#22d3ee\"],\n ] as const\n ).map(([val, label, color]) => (\n <button\n key={val}\n type=\"button\"\n onClick={() =>\n setSubtitleStyle((st) => ({\n ...st,\n color: val,\n }))\n }\n className={`flex-1 rounded-lg py-1.5 text-xs font-medium transition ring-1${subtitleStyle.color === val ? \"ring-white/40\" : \"ring-transparent hover:ring-white/15\"}`}\n style={{ color }}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n {/* Background */}\n <div>\n <p className=\"mb-1.5 text-xs font-semibold text-white/40 uppercase tracking-wide\">\n Fundo\n </p>\n <div className=\"flex gap-1.5\">\n {(\n [\n [\"none\", \"Nenhum\"],\n [\"semi\", \"Semi\"],\n [\"solid\", \"Sólido\"],\n ] as const\n ).map(([val, label]) => (\n <button\n key={val}\n type=\"button\"\n onClick={() =>\n setSubtitleStyle((st) => ({ ...st, bg: val }))\n }\n className={`flex-1 rounded-lg py-1.5 text-xs font-medium transition${subtitleStyle.bg === val ? \"bg-white/20 text-white\" : \"text-white/45 hover:bg-white/10\"}`}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Audio sub-menu */}\n {settingsTab === \"audio\" && (\n <div>\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"root\")}\n className=\"flex w-full items-center gap-2 border-b border-white/8 px-4 py-3 text-xs font-semibold text-white/50 transition hover:text-white\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M7.5 3L4.5 6l3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Áudio\n </button>\n <div className=\"py-1.5\">\n {audioTracks.map((track) => {\n const unavailable = track.supported === false;\n return (\n <button\n key={track.id}\n type=\"button\"\n onClick={() => {\n if (unavailable) return;\n changeAudio(track.id);\n setSettingsTab(\"root\");\n }}\n disabled={unavailable}\n className={`flex w-full items-center gap-3 px-4 py-2.5 text-sm transition ${unavailable ? \"cursor-not-allowed opacity-40\" : \"hover:bg-white/8\"}`}\n >\n <svg\n className={`size-4 shrink-0 ${selectedAudio === track.id ? \"text-white\" : \"text-transparent\"}`}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3 8l3.5 3.5L13 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"flex-1 text-left\">\n <span\n className={\n selectedAudio === track.id\n ? \"font-semibold text-white\"\n : \"text-white/55\"\n }\n >\n {track.label}\n </span>\n {unavailable && (\n <span className=\"ml-1.5 text-[10px] text-white/30\">Não disponível</span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Playback speed sub-menu */}\n {settingsTab === \"playback\" && (\n <div>\n <button\n type=\"button\"\n onClick={() => setSettingsTab(\"root\")}\n className=\"flex w-full items-center gap-2 border-b border-white/8 px-4 py-3 text-xs font-semibold text-white/50 transition hover:text-white\"\n >\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M7.5 3L4.5 6l3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Velocidade\n </button>\n <div className=\"py-1.5\">\n {PLAYBACK_SPEEDS.map((speed) => (\n <button\n key={speed}\n type=\"button\"\n onClick={() => {\n setPlaybackRate(speed);\n closeSettings();\n }}\n className=\"flex w-full items-center gap-3 px-4 py-2.5 text-sm transition hover:bg-white/8\"\n >\n <svg\n className={`size-4 shrink-0 ${playbackRate === speed ? \"text-white\" : \"text-transparent\"}`}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3 8l3.5 3.5L13 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span\n className={\n playbackRate === speed\n ? \"font-semibold text-white\"\n : \"text-white/55\"\n }\n >\n {speed === 1 ? \"Normal\" : `${speed}×`}\n </span>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n </>\n )}\n\n <div\n ref={progressRef}\n onPointerMove={handleProgressPointerMove}\n onPointerEnter={handleProgressPointerEnter}\n onPointerLeave={handleProgressPointerLeave}\n onPointerDown={handleProgressPointerDown}\n onPointerUp={handleProgressPointerUp}\n className=\"relative mb-2 h-8 cursor-pointer overflow-visible\"\n >\n {/* Track */}\n <div\n ref={progressTrackRef}\n className=\"absolute left-0 right-0 top-1/2 -translate-y-1/2 overflow-hidden rounded-full bg-white/18\"\n style={{\n height: \"3px\",\n }}\n >\n <div\n className=\"absolute inset-y-0 left-0 rounded-full bg-white/28\"\n style={{ width: `${bufferedPercent}%` }}\n />\n <div\n className=\"absolute inset-y-0 left-0 rounded-full bg-white\"\n style={{ width: `${progressPercent}%`, transition: \"width 0.05s linear\" }}\n />\n </div>\n {/* Thumb */}\n <div\n ref={progressThumbRef}\n className=\"pointer-events-none absolute rounded-full bg-white shadow-[0_1px_6px_rgba(0,0,0,0.5)]\"\n style={{\n top: \"50%\",\n left: `${progressPercent}%`,\n transform: \"translate(-50%, -50%)\",\n width: \"10px\",\n height: \"10px\",\n }}\n />\n\n {/* Chapter markers */}\n {chapters.length > 0 && duration > 0 && chapters.map((ch, i) => (\n <div\n key={i}\n data-chapter-marker\n className=\"pointer-events-none absolute top-1/2 -translate-y-1/2 w-0.5 rounded-full bg-white/50\"\n style={{ left: `${(ch.startTime / duration) * 100}%`, height: \"3px\" }}\n />\n ))}\n\n {/* Storyboard preview — anchored above the timeline */}\n {preview && (() => {\n const frameW = preview.cue.w ?? 160;\n const frameH = preview.cue.h ?? 90;\n // Fixed width, height follows frame aspect ratio\n const thumbW = 200;\n const thumbH = Math.round(thumbW * (frameH / frameW));\n const scale = thumbW / frameW;\n const isSprite = preview.cue.x != null && preview.cue.y != null;\n return (\n <div\n className=\"pointer-events-none absolute flex flex-col items-center gap-1\"\n style={{\n bottom: \"calc(100% + 6px)\",\n left: preview.left,\n transform: \"translateX(-50%)\",\n zIndex: 80,\n }}\n >\n <div\n className=\"overflow-hidden rounded-lg shadow-2xl ring-1 ring-white/20\"\n style={{ width: thumbW, height: thumbH, flexShrink: 0 }}\n >\n {isSprite ? (\n // Sprite: need full sheet dimensions to compute backgroundSize correctly.\n // Load them once from the image's natural size.\n (() => {\n const imgUrl = preview.cue.image;\n if (storyboardSheetUrlRef.current !== imgUrl) {\n storyboardSheetUrlRef.current = imgUrl;\n const img = new window.Image();\n img.onload = () => setStoryboardSheetSize({ w: img.naturalWidth, h: img.naturalHeight });\n img.src = imgUrl;\n }\n if (!storyboardSheetSize) return null;\n const bsW = storyboardSheetSize.w * scale;\n const bsH = storyboardSheetSize.h * scale;\n return (\n <div\n style={{\n width: thumbW,\n height: thumbH,\n backgroundImage: `url(${imgUrl})`,\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: `-${(preview.cue.x ?? 0) * scale}px -${(preview.cue.y ?? 0) * scale}px`,\n backgroundSize: `${bsW}px ${bsH}px`,\n }}\n />\n );\n })()\n ) : (\n <img\n src={preview.cue.image}\n alt=\"\"\n style={{ width: thumbW, height: thumbH, objectFit: \"cover\", objectPosition: \"center\", display: \"block\" }}\n />\n )}\n </div>\n <div\n className=\"flex items-center gap-1.5 rounded-md px-2 py-0.5 text-[11px] font-semibold text-white/90\"\n style={{ background: \"rgba(0,0,0,0.55)\", backdropFilter: \"blur(6px)\" }}\n >\n <span className=\"tabular-nums\">{formatTime(preview.time)}</span>\n {(() => {\n const ch = [...chapters].reverse().find((c) => c.startTime <= preview.time);\n return ch ? (\n <>\n <span className=\"text-white/40\">·</span>\n <span className=\"max-w-36 truncate\">{ch.title}</span>\n </>\n ) : null;\n })()}\n </div>\n </div>\n );\n })()}\n </div>\n\n <div className=\"flex items-center justify-between gap-2\">\n {/* LEFT group: play/pause | time */}\n <div className=\"flex items-center gap-1.5 @sm:gap-2\">\n <button\n type=\"button\"\n onClick={togglePlay}\n className=\"grid size-8 place-items-center rounded-full text-white transition hover:bg-white/10 @sm:size-9\"\n aria-label={isPlaying ? \"Pause\" : \"Play\"}\n >\n {isPlaying ? (\n <Pause className=\"size-4 @sm:size-5\" fill=\"white\" />\n ) : (\n <Play className=\"ml-0.5 size-4 @sm:size-5\" fill=\"white\" />\n )}\n </button>\n\n <span className=\"text-[11px] font-medium tabular-nums text-white/80\">\n {formatTime(currentTime)}\n <span className=\"text-white/30\">/</span>\n <span className=\"text-white/45\">{formatTime(duration)}</span>\n </span>\n {(() => {\n if (chapters.length === 0) return null;\n const ch = [...chapters].reverse().find((c) => currentTime >= c.startTime);\n return ch ? (\n <span className=\"hidden max-w-40 truncate text-[11px] text-white/50 @sm:block\">\n {ch.title}\n </span>\n ) : null;\n })()}\n </div>\n\n {/* RIGHT group: rating | volume | captions | settings | fullscreen */}\n <div className=\"flex items-center gap-0.5 @sm:gap-1\">\n {/* Inline rating buttons — state is internal so clicks don't re-render the parent */}\n {parsed.rating && (() => {\n const REACTIONS: Array<{ key: \"LOVE\" | \"LIKE\" | \"DISLIKE\"; emoji: string }> = [\n { key: \"LOVE\", emoji: \"❤️\" },\n { key: \"LIKE\", emoji: \"👍\" },\n { key: \"DISLIKE\", emoji: \"👎\" },\n ];\n return (\n <>\n {REACTIONS.map(({ key, emoji }) => {\n const count = ratingCounts[key] ?? 0;\n const active = userReaction === key;\n return (\n <button\n key={key}\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n const next = active ? null : key;\n setUserReaction(next);\n setRatingCounts((prev) => {\n const updated = { ...prev };\n const prev_reaction = userReactionRef.current;\n if (active) updated[key] = Math.max(0, (updated[key] ?? 0) - 1);\n else {\n if (prev_reaction) updated[prev_reaction] = Math.max(0, (updated[prev_reaction] ?? 0) - 1);\n updated[key] = (updated[key] ?? 0) + 1;\n }\n return updated;\n });\n onReactRef.current?.(next);\n }}\n className={`flex items-center gap-0.5 rounded px-1.5 py-1 text-[11px] transition hover:bg-white/10 ${active ? \"opacity-100\" : \"opacity-50 hover:opacity-80\"}`}\n aria-label={key.toLowerCase()}\n aria-pressed={active}\n >\n <span>{emoji}</span>\n {count > 0 && <span className=\"text-white/70 tabular-nums\">{count}</span>}\n </button>\n );\n })}\n <div className=\"mx-0.5 h-4 w-px bg-white/20 @md:mx-1\" />\n </>\n );\n })()}\n\n {/* Volume: mute button always visible, custom slider appears on group hover */}\n <VolumeSlider\n volume={isMuted ? 0 : volume}\n onMuteToggle={() => setIsMuted((v) => !v)}\n onVolumeChange={(v) => { setVolume(v); setIsMuted(v === 0); }}\n isMuted={isMuted}\n />\n\n <div className=\"mx-0.5 h-4 w-px bg-white/20 @md:mx-1\" />\n\n {captions.length > 0 && (\n <button\n type=\"button\"\n onClick={() => {\n const next = subtitleMode === \"off\" ? (captions[0]?.srclang ?? \"off\") : \"off\";\n setSubtitleMode(next);\n setSubtitleStyle((st) => ({ ...st, track: next }));\n }}\n className={`grid size-8 place-items-center rounded transition hover:text-white/80 @sm:size-10 ${subtitleMode !== \"off\" ? \"text-white\" : \"text-white/60\"}`}\n aria-label=\"Captions\"\n >\n <CaptionsIcon className=\"size-4 @sm:size-5\" />\n </button>\n )}\n\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => settingsOpen ? closeSettings() : openSettings()}\n className={`grid size-8 place-items-center rounded transition hover:text-white/80 @sm:size-10 ${settingsOpen ? \"text-white\" : \"text-white/60\"}`}\n aria-label=\"Settings\"\n >\n <Settings className=\"size-4 @sm:size-5\" />\n </button>\n </div>\n\n <button\n type=\"button\"\n onClick={toggleFullscreen}\n className=\"grid size-8 place-items-center text-white/60 transition hover:scale-110 hover:text-white/80 @sm:size-10\"\n aria-label={isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n >\n {isFullscreen ? (\n <Minimize className=\"size-4 @sm:size-5\" />\n ) : (\n <Maximize className=\"size-4 @sm:size-5\" />\n )}\n </button>\n </div>\n </div>\n </footer>\n </div>\n\n\n {/* Subtitles — size scales with player height so it looks right in fullscreen */}\n {activeCue && (\n <div\n className=\"pointer-events-none absolute inset-x-0 z-40 flex justify-center px-4\"\n style={{\n bottom: (() => {\n if (preview) {\n // sit below the storyboard thumbnail + timer (~200px above the progress track)\n const frameW = preview.cue.w ?? 160;\n const frameH = preview.cue.h ?? 90;\n const thumbH = Math.round(200 * (frameH / frameW));\n // storyboard is above the controls bar (~80px), add thumb + timer + gap\n return `${80 + thumbH + 32 + 10}px`;\n }\n if (controlsVisible) return \"5rem\";\n return \"1rem\";\n })(),\n transition: \"bottom 0.2s ease\",\n }}\n >\n <div\n className=\"max-w-[80%] rounded-lg px-4 py-1.5 text-center font-medium leading-snug\"\n style={{\n fontSize: (() => {\n // Base size scales with player height: ~2.8% of height, clamped per size option\n const base = Math.max(12, Math.min(playerHeight * 0.028, 32));\n if (subtitleStyle.size === \"small\") return `${base * 0.75}px`;\n if (subtitleStyle.size === \"large\") return `${base * 1.35}px`;\n if (subtitleStyle.size === \"xlarge\") return `${base * 1.8}px`;\n return `${base}px`; // medium\n })(),\n color:\n subtitleStyle.color === \"yellow\"\n ? \"#facc15\"\n : subtitleStyle.color === \"cyan\"\n ? \"#22d3ee\"\n : \"#ffffff\",\n backgroundColor:\n subtitleStyle.bg === \"none\"\n ? \"transparent\"\n : subtitleStyle.bg === \"solid\"\n ? \"rgba(0,0,0,0.9)\"\n : \"rgba(0,0,0,0.55)\",\n backdropFilter:\n subtitleStyle.bg === \"semi\" ? \"blur(6px)\" : undefined,\n textShadow:\n subtitleStyle.bg === \"none\"\n ? \"0 1px 8px rgba(0,0,0,1), 0 0 16px rgba(0,0,0,0.9)\"\n : \"0 1px 3px rgba(0,0,0,0.5)\",\n }}\n >\n {activeCue}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport const VideoPlayer = Video;\n\nfunction SettingsItem({\n children,\n active,\n onClick,\n}: {\n children: ReactNode;\n active: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`flex w-full items-center gap-2 px-4 py-2.5 text-left text-base font-medium transition hover:bg-white/10${active ? \"text-white\" : \"text-white/55\"}`}\n >\n <span\n className={`size-1.5 rounded-full${active ? \"bg-white\" : \"bg-transparent\"}`}\n />\n {children}\n </button>\n );\n}\n\nfunction VolumeSlider({\n volume,\n isMuted,\n onMuteToggle,\n onVolumeChange,\n}: {\n volume: number;\n isMuted: boolean;\n onMuteToggle: () => void;\n onVolumeChange: (v: number) => void;\n}) {\n const [hovered, setHovered] = useState(false);\n const [dragging, setDragging] = useState(false);\n const trackRef = useRef<HTMLDivElement>(null);\n const sliderWrapRef = useRef<HTMLDivElement>(null);\n const railRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n const expanded = hovered || dragging;\n\n const seek = useCallback((clientX: number) => {\n const track = trackRef.current;\n if (!track) return;\n const rect = track.getBoundingClientRect();\n const v = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n onVolumeChange(v);\n }, [onVolumeChange]);\n\n const onPointerDown = useCallback((e: React.PointerEvent) => {\n e.currentTarget.setPointerCapture(e.pointerId);\n setDragging(true);\n seek(e.clientX);\n }, [seek]);\n\n const onPointerMove = useCallback((e: React.PointerEvent) => {\n if (dragging) seek(e.clientX);\n }, [dragging, seek]);\n\n const onPointerUp = useCallback(() => setDragging(false), []);\n\n // GSAP: animate slider expand/collapse\n useEffect(() => {\n const wrap = sliderWrapRef.current;\n if (!wrap) return;\n gsap.killTweensOf(wrap);\n gsap.to(wrap, {\n width: expanded ? 64 : 0,\n opacity: expanded ? 1 : 0,\n duration: 0.2,\n ease: \"power2.inOut\",\n });\n }, [expanded]);\n\n // GSAP: animate rail height + thumb size on hover/drag\n useEffect(() => {\n const rail = railRef.current;\n const thumb = thumbRef.current;\n const targetRailH = dragging ? 5 : hovered ? 4 : 3;\n const targetThumbSize = dragging ? 14 : hovered ? 11 : 0;\n if (rail) {\n gsap.killTweensOf(rail);\n gsap.to(rail, { height: targetRailH, duration: 0.15, ease: \"power1.inOut\" });\n }\n if (thumb) {\n gsap.killTweensOf(thumb);\n gsap.to(thumb, { width: targetThumbSize, height: targetThumbSize, duration: 0.15, ease: \"power1.inOut\" });\n }\n }, [dragging, hovered]);\n\n const fillPercent = volume * 100;\n\n return (\n <div\n className=\"flex items-center\"\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => { if (!dragging) setHovered(false); }}\n >\n <button\n type=\"button\"\n onClick={onMuteToggle}\n className=\"grid size-8 place-items-center text-white/70 transition hover:text-white @sm:size-9\"\n aria-label={isMuted ? \"Unmute\" : \"Mute\"}\n >\n {isMuted || volume === 0 ? (\n <VolumeX className=\"size-4 @sm:size-5\" />\n ) : (\n <Volume2 className=\"size-4 @sm:size-5\" />\n )}\n </button>\n\n {/* Custom track */}\n <div\n ref={sliderWrapRef}\n style={{\n width: \"0px\",\n opacity: 0,\n overflow: \"hidden\",\n }}\n >\n <div\n ref={trackRef}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n className=\"relative mx-1 flex h-7 cursor-pointer items-center\"\n style={{ width: \"52px\" }}\n >\n {/* Rail */}\n <div\n ref={railRef}\n className=\"absolute inset-x-0 rounded-full bg-white/20\"\n style={{ height: \"3px\" }}\n >\n {/* Fill */}\n <div\n className=\"absolute inset-y-0 left-0 rounded-full bg-white\"\n style={{ width: `${fillPercent}%` }}\n />\n </div>\n {/* Thumb */}\n <div\n ref={thumbRef}\n className=\"pointer-events-none absolute top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-white shadow-md\"\n style={{\n left: `${fillPercent}%`,\n width: \"0px\",\n height: \"0px\",\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n\n// Maps BCP-47 locale prefixes to region keys stored in age_ratings JSON\nconst LOCALE_TO_REGION: Record<string, string> = {\n \"en-US\": \"US\", \"en-CA\": \"CA\",\n \"pt-BR\": \"BR\",\n \"de\": \"EU\", \"fr\": \"EU\", \"es\": \"EU\", \"it\": \"EU\", \"nl\": \"EU\", \"pl\": \"EU\",\n \"de-DE\": \"EU\", \"fr-FR\": \"EU\", \"es-ES\": \"EU\", \"it-IT\": \"EU\",\n \"ja\": \"JP\", \"ja-JP\": \"JP\",\n \"ko\": \"KR\", \"ko-KR\": \"KR\",\n \"en-AU\": \"AU\",\n};\n\nfunction resolveAgeRatingRegion(locale: string | undefined, data: Record<string, string>): string | undefined {\n if (!locale) return Object.keys(data)[0];\n // Exact match first\n if (LOCALE_TO_REGION[locale] && data[LOCALE_TO_REGION[locale]]) return LOCALE_TO_REGION[locale];\n // Language prefix match (e.g. \"pt\" from \"pt-BR\")\n const lang = locale.split(\"-\")[0] ?? \"\";\n const fromLang = LOCALE_TO_REGION[lang];\n if (fromLang && data[fromLang]) return fromLang;\n // Fallback: first key in data\n return Object.keys(data)[0];\n}\n\nfunction parseVideoChildren(children: ReactNode): ParsedVideoChildren {\n const parsed: ParsedVideoChildren = {\n sources: [],\n };\n\n function dn(child: React.ReactElement): string {\n return (child.type as any)?.displayName ?? (child.type as any)?.name ?? \"\";\n }\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n\n const name = dn(child);\n\n if (child.type === Source || name === \"SiloSource\") {\n const element = child as ReactElement<SourceProps>;\n parsed.sources.push(element.props);\n }\n\n if (child.type === Captions || name === \"SiloCaptions\") {\n const element = child as ReactElement<CaptionsProps>;\n if (element.props.data) {\n parsed.captionsData = element.props.data;\n } else if (element.props.src) {\n parsed.captionsSrc = element.props.src;\n }\n }\n\n if (child.type === Chapters || name === \"SiloChapters\") {\n const element = child as ReactElement<ChaptersProps>;\n if (element.props.data) {\n parsed.chaptersData = element.props.data;\n } else if (element.props.src) {\n parsed.chaptersSrc = element.props.src;\n }\n }\n\n if (child.type === VideoThumbnail || name === \"SiloVideoThumbnail\") {\n const element = child as ReactElement<ThumbnailProps>;\n if (element.props.urls) parsed.thumbnailUrls = element.props.urls;\n if (element.props.src) parsed.thumbnailSrc = element.props.src;\n }\n\n if (child.type === AgeRating || name === \"SiloAgeRating\") {\n const element = child as ReactElement<AgeRatingProps>;\n parsed.ageRating = element.props;\n }\n\n if (child.type === Rating || name === \"SiloRating\") {\n const element = child as ReactElement<RatingProps>;\n parsed.rating = element.props;\n }\n\n if (child.type === Storyboard || name === \"SiloStoryboard\") {\n const element = child as ReactElement<StoryboardProps>;\n const frames: StoryboardFrameProps[] = [];\n\n React.Children.forEach(element.props.children, (frameChild) => {\n if (!React.isValidElement(frameChild)) return;\n const fn2 = dn(frameChild);\n if (\n frameChild.type !== StoryboardFrame &&\n fn2 !== \"SiloStoryboardFrame\"\n )\n return;\n\n const frameElement = frameChild as ReactElement<StoryboardFrameProps>;\n frames.push(frameElement.props);\n });\n\n parsed.storyboard = {\n ...(element.props.src !== undefined && { src: element.props.src }),\n ...(element.props.fallbackImage !== undefined && { fallbackImage: element.props.fallbackImage }),\n ...(element.props.width !== undefined && { width: element.props.width }),\n ...(element.props.height !== undefined && { height: element.props.height }),\n ...(element.props.resolutions !== undefined && { resolutions: element.props.resolutions }),\n frames,\n };\n }\n });\n\n return parsed;\n}\n\nfunction inferSourceType(source: SourceProps): VideoSourceType {\n if (source.type) return source.type;\n\n const src = source.src.toLowerCase();\n\n if (src.includes(\".mpd\") || src.includes(\"/dash\")) return \"dash\";\n if (src.includes(\".m3u8\") || src.includes(\"/hls\")) return \"hls\";\n\n return \"file\";\n}\n\nfunction findStoryboardCue(cues: StoryboardFrameProps[], time: number) {\n if (cues.length === 0) return null;\n // Find the last cue whose start is <= time (floor to nearest previous frame)\n let best: StoryboardFrameProps | null = null;\n for (const cue of cues) {\n if (cue.start <= time) best = cue;\n else break;\n }\n return best;\n}\n\nfunction parseStoryboardVtt(\n text: string,\n baseUrl: string,\n): StoryboardFrameProps[] {\n const lines = text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const cues: StoryboardFrameProps[] = [];\n\n for (let index = 0; index < lines.length; index++) {\n const line = lines[index];\n if (!line || !line.includes(\"-->\")) continue;\n\n const parts = line.split(/\\s+-->\\s+/);\n const startRaw = parts[0];\n const endRaw = parts[1];\n const imageLine = lines[index + 1];\n\n if (!startRaw || !endRaw || !imageLine) continue;\n\n const image = parseStoryboardImageLine(imageLine, baseUrl);\n\n cues.push({\n start: parseVttTimestamp(startRaw),\n end: parseVttTimestamp(endRaw),\n ...image,\n });\n }\n\n return cues;\n}\n\nfunction parseStoryboardImageLine(line: string, baseUrl: string) {\n const splitIndex = line.indexOf(\"#xywh=\");\n const imageRaw = splitIndex >= 0 ? line.slice(0, splitIndex) : line;\n const xywhRaw = splitIndex >= 0 ? line.slice(splitIndex + 6) : null;\n const image = new URL(imageRaw, baseUrl).href;\n\n if (!xywhRaw) {\n return { image };\n }\n\n const [x, y, w, h] = xywhRaw.split(\",\").map(Number);\n\n return {\n image,\n ...(x !== undefined && !isNaN(x) && { x }),\n ...(y !== undefined && !isNaN(y) && { y }),\n ...(w !== undefined && !isNaN(w) && { w }),\n ...(h !== undefined && !isNaN(h) && { h }),\n };\n}\n\nfunction parseVttTimestamp(value: string) {\n const normalized = value.replace(\",\", \".\");\n const parts = normalized.split(\":\").map(Number);\n\n if (parts.length === 3) {\n return (parts[0] ?? 0) * 3600 + (parts[1] ?? 0) * 60 + (parts[2] ?? 0);\n }\n\n if (parts.length === 2) {\n return (parts[0] ?? 0) * 60 + (parts[1] ?? 0);\n }\n\n return Number(normalized) || 0;\n}\n\nfunction formatTime(seconds: number) {\n if (!Number.isFinite(seconds)) return \"0:00\";\n\n const safeSeconds = Math.max(0, Math.floor(seconds));\n const hours = Math.floor(safeSeconds / 3600);\n const minutes = Math.floor((safeSeconds % 3600) / 60);\n const secs = safeSeconds % 60;\n\n if (hours > 0) {\n return `${hours}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n }\n\n return `${minutes}:${String(secs).padStart(2, \"0\")}`;\n}\n"]}