@livepeer-frameworks/player-react 0.1.0 → 0.1.2

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.
Files changed (187) hide show
  1. package/README.md +7 -9
  2. package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js +359 -0
  3. package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  4. package/dist/cjs/assets/logomark.svg.js +8 -0
  5. package/dist/cjs/assets/logomark.svg.js.map +1 -0
  6. package/dist/cjs/components/DevModePanel.js +826 -0
  7. package/dist/cjs/components/DevModePanel.js.map +1 -0
  8. package/dist/cjs/components/DvdLogo.js +200 -0
  9. package/dist/cjs/components/DvdLogo.js.map +1 -0
  10. package/dist/cjs/components/Icons.js +439 -0
  11. package/dist/cjs/components/Icons.js.map +1 -0
  12. package/dist/cjs/components/IdleScreen.js +587 -0
  13. package/dist/cjs/components/IdleScreen.js.map +1 -0
  14. package/dist/cjs/components/LoadingScreen.js +523 -0
  15. package/dist/cjs/components/LoadingScreen.js.map +1 -0
  16. package/dist/cjs/components/Player.js +420 -0
  17. package/dist/cjs/components/Player.js.map +1 -0
  18. package/dist/cjs/components/PlayerControls.js +798 -0
  19. package/dist/cjs/components/PlayerControls.js.map +1 -0
  20. package/dist/cjs/components/PlayerErrorBoundary.js +80 -0
  21. package/dist/cjs/components/PlayerErrorBoundary.js.map +1 -0
  22. package/dist/cjs/components/SeekBar.js +253 -0
  23. package/dist/cjs/components/SeekBar.js.map +1 -0
  24. package/dist/cjs/components/SkipIndicator.js +92 -0
  25. package/dist/cjs/components/SkipIndicator.js.map +1 -0
  26. package/dist/cjs/components/SpeedIndicator.js +43 -0
  27. package/dist/cjs/components/SpeedIndicator.js.map +1 -0
  28. package/dist/cjs/components/StatsPanel.js +202 -0
  29. package/dist/cjs/components/StatsPanel.js.map +1 -0
  30. package/dist/cjs/components/StreamStateOverlay.js +229 -0
  31. package/dist/cjs/components/StreamStateOverlay.js.map +1 -0
  32. package/dist/cjs/components/ThumbnailOverlay.js +86 -0
  33. package/dist/cjs/components/ThumbnailOverlay.js.map +1 -0
  34. package/dist/cjs/components/TitleOverlay.js +32 -0
  35. package/dist/cjs/components/TitleOverlay.js.map +1 -0
  36. package/dist/cjs/context/PlayerContext.js +46 -0
  37. package/dist/cjs/context/PlayerContext.js.map +1 -0
  38. package/dist/cjs/hooks/useMetaTrack.js +165 -0
  39. package/dist/cjs/hooks/useMetaTrack.js.map +1 -0
  40. package/dist/cjs/hooks/usePlaybackQuality.js +131 -0
  41. package/dist/cjs/hooks/usePlaybackQuality.js.map +1 -0
  42. package/dist/cjs/hooks/usePlayerController.js +518 -0
  43. package/dist/cjs/hooks/usePlayerController.js.map +1 -0
  44. package/dist/cjs/hooks/usePlayerSelection.js +90 -0
  45. package/dist/cjs/hooks/usePlayerSelection.js.map +1 -0
  46. package/dist/cjs/hooks/useStreamState.js +360 -0
  47. package/dist/cjs/hooks/useStreamState.js.map +1 -0
  48. package/dist/cjs/hooks/useTelemetry.js +120 -0
  49. package/dist/cjs/hooks/useTelemetry.js.map +1 -0
  50. package/dist/cjs/hooks/useViewerEndpoints.js +222 -0
  51. package/dist/cjs/hooks/useViewerEndpoints.js.map +1 -0
  52. package/dist/cjs/index.js +97 -1
  53. package/dist/cjs/index.js.map +1 -1
  54. package/dist/cjs/ui/badge.js +34 -0
  55. package/dist/cjs/ui/badge.js.map +1 -0
  56. package/dist/cjs/ui/button.js +74 -0
  57. package/dist/cjs/ui/button.js.map +1 -0
  58. package/dist/cjs/ui/context-menu.js +163 -0
  59. package/dist/cjs/ui/context-menu.js.map +1 -0
  60. package/dist/cjs/ui/slider.js +60 -0
  61. package/dist/cjs/ui/slider.js.map +1 -0
  62. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +329 -0
  63. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  64. package/dist/esm/assets/logomark.svg.js +4 -0
  65. package/dist/esm/assets/logomark.svg.js.map +1 -0
  66. package/dist/esm/components/DevModePanel.js +822 -0
  67. package/dist/esm/components/DevModePanel.js.map +1 -0
  68. package/dist/esm/components/DvdLogo.js +196 -0
  69. package/dist/esm/components/DvdLogo.js.map +1 -0
  70. package/dist/esm/components/Icons.js +421 -0
  71. package/dist/esm/components/Icons.js.map +1 -0
  72. package/dist/esm/components/IdleScreen.js +582 -0
  73. package/dist/esm/components/IdleScreen.js.map +1 -0
  74. package/dist/esm/components/LoadingScreen.js +519 -0
  75. package/dist/esm/components/LoadingScreen.js.map +1 -0
  76. package/dist/esm/components/Player.js +416 -0
  77. package/dist/esm/components/Player.js.map +1 -0
  78. package/dist/esm/components/PlayerControls.js +794 -0
  79. package/dist/esm/components/PlayerControls.js.map +1 -0
  80. package/dist/esm/components/PlayerErrorBoundary.js +76 -0
  81. package/dist/esm/components/PlayerErrorBoundary.js.map +1 -0
  82. package/dist/esm/components/SeekBar.js +249 -0
  83. package/dist/esm/components/SeekBar.js.map +1 -0
  84. package/dist/esm/components/SkipIndicator.js +88 -0
  85. package/dist/esm/components/SkipIndicator.js.map +1 -0
  86. package/dist/esm/components/SpeedIndicator.js +39 -0
  87. package/dist/esm/components/SpeedIndicator.js.map +1 -0
  88. package/dist/esm/components/StatsPanel.js +198 -0
  89. package/dist/esm/components/StatsPanel.js.map +1 -0
  90. package/dist/esm/components/StreamStateOverlay.js +224 -0
  91. package/dist/esm/components/StreamStateOverlay.js.map +1 -0
  92. package/dist/esm/components/ThumbnailOverlay.js +82 -0
  93. package/dist/esm/components/ThumbnailOverlay.js.map +1 -0
  94. package/dist/esm/components/TitleOverlay.js +28 -0
  95. package/dist/esm/components/TitleOverlay.js.map +1 -0
  96. package/dist/esm/context/PlayerContext.js +41 -0
  97. package/dist/esm/context/PlayerContext.js.map +1 -0
  98. package/dist/esm/hooks/useMetaTrack.js +163 -0
  99. package/dist/esm/hooks/useMetaTrack.js.map +1 -0
  100. package/dist/esm/hooks/usePlaybackQuality.js +129 -0
  101. package/dist/esm/hooks/usePlaybackQuality.js.map +1 -0
  102. package/dist/esm/hooks/usePlayerController.js +516 -0
  103. package/dist/esm/hooks/usePlayerController.js.map +1 -0
  104. package/dist/esm/hooks/usePlayerSelection.js +88 -0
  105. package/dist/esm/hooks/usePlayerSelection.js.map +1 -0
  106. package/dist/esm/hooks/useStreamState.js +358 -0
  107. package/dist/esm/hooks/useStreamState.js.map +1 -0
  108. package/dist/esm/hooks/useTelemetry.js +118 -0
  109. package/dist/esm/hooks/useTelemetry.js.map +1 -0
  110. package/dist/esm/hooks/useViewerEndpoints.js +220 -0
  111. package/dist/esm/hooks/useViewerEndpoints.js.map +1 -0
  112. package/dist/esm/index.js +23 -1
  113. package/dist/esm/index.js.map +1 -1
  114. package/dist/esm/ui/badge.js +31 -0
  115. package/dist/esm/ui/badge.js.map +1 -0
  116. package/dist/esm/ui/button.js +52 -0
  117. package/dist/esm/ui/button.js.map +1 -0
  118. package/dist/esm/ui/context-menu.js +132 -0
  119. package/dist/esm/ui/context-menu.js.map +1 -0
  120. package/dist/esm/ui/slider.js +38 -0
  121. package/dist/esm/ui/slider.js.map +1 -0
  122. package/dist/types/components/DvdLogo.d.ts +1 -1
  123. package/dist/types/components/Icons.d.ts +1 -1
  124. package/dist/types/components/Player.d.ts +1 -1
  125. package/dist/types/components/PlayerErrorBoundary.d.ts +2 -1
  126. package/dist/types/components/StreamStateOverlay.d.ts +2 -2
  127. package/dist/types/components/SubtitleRenderer.d.ts +2 -2
  128. package/dist/types/context/PlayerContext.d.ts +2 -2
  129. package/dist/types/context/index.d.ts +2 -2
  130. package/dist/types/hooks/useMetaTrack.d.ts +3 -3
  131. package/dist/types/hooks/usePlaybackQuality.d.ts +2 -2
  132. package/dist/types/hooks/usePlayerController.d.ts +26 -3
  133. package/dist/types/hooks/usePlayerSelection.d.ts +1 -1
  134. package/dist/types/hooks/useStreamState.d.ts +1 -1
  135. package/dist/types/hooks/useTelemetry.d.ts +1 -1
  136. package/dist/types/hooks/useViewerEndpoints.d.ts +3 -3
  137. package/dist/types/index.d.ts +28 -28
  138. package/dist/types/types.d.ts +3 -3
  139. package/dist/types/ui/select.d.ts +1 -1
  140. package/package.json +22 -14
  141. package/src/components/DevModePanel.tsx +244 -143
  142. package/src/components/DvdLogo.tsx +1 -1
  143. package/src/components/Icons.tsx +105 -25
  144. package/src/components/IdleScreen.tsx +262 -128
  145. package/src/components/LoadingScreen.tsx +169 -151
  146. package/src/components/LogoOverlay.tsx +3 -6
  147. package/src/components/Player.tsx +126 -59
  148. package/src/components/PlayerControls.tsx +384 -272
  149. package/src/components/PlayerErrorBoundary.tsx +7 -13
  150. package/src/components/SeekBar.tsx +96 -88
  151. package/src/components/SkipIndicator.tsx +2 -12
  152. package/src/components/SpeedIndicator.tsx +2 -11
  153. package/src/components/StatsPanel.tsx +31 -22
  154. package/src/components/StreamStateOverlay.tsx +105 -49
  155. package/src/components/SubtitleRenderer.tsx +29 -29
  156. package/src/components/ThumbnailOverlay.tsx +5 -6
  157. package/src/components/TitleOverlay.tsx +2 -8
  158. package/src/context/PlayerContext.tsx +4 -8
  159. package/src/context/index.ts +3 -3
  160. package/src/hooks/useMetaTrack.ts +27 -27
  161. package/src/hooks/usePlaybackQuality.ts +3 -3
  162. package/src/hooks/usePlayerController.ts +246 -138
  163. package/src/hooks/usePlayerSelection.ts +6 -6
  164. package/src/hooks/useStreamState.ts +51 -56
  165. package/src/hooks/useTelemetry.ts +18 -3
  166. package/src/hooks/useViewerEndpoints.ts +34 -23
  167. package/src/index.tsx +36 -28
  168. package/src/types.ts +8 -8
  169. package/src/ui/badge.tsx +6 -5
  170. package/src/ui/button.tsx +9 -8
  171. package/src/ui/context-menu.tsx +42 -61
  172. package/src/ui/select.tsx +13 -7
  173. package/src/ui/slider.tsx +18 -29
  174. package/dist/types/components/players/DashJsPlayer.d.ts +0 -18
  175. package/dist/types/components/players/HlsJsPlayer.d.ts +0 -18
  176. package/dist/types/components/players/MewsWsPlayer/index.d.ts +0 -18
  177. package/dist/types/components/players/MistPlayer.d.ts +0 -20
  178. package/dist/types/components/players/MistWebRTCPlayer/index.d.ts +0 -20
  179. package/dist/types/components/players/NativePlayer.d.ts +0 -19
  180. package/dist/types/components/players/VideoJsPlayer.d.ts +0 -18
  181. package/src/components/players/DashJsPlayer.tsx +0 -56
  182. package/src/components/players/HlsJsPlayer.tsx +0 -56
  183. package/src/components/players/MewsWsPlayer/index.tsx +0 -56
  184. package/src/components/players/MistPlayer.tsx +0 -60
  185. package/src/components/players/MistWebRTCPlayer/index.tsx +0 -59
  186. package/src/components/players/NativePlayer.tsx +0 -58
  187. package/src/components/players/VideoJsPlayer.tsx +0 -56
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayerControls.js","sources":["../../../../src/components/PlayerControls.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState, useRef, useCallback } from \"react\";\nimport { usePlayerContextOptional } from \"../context/PlayerContext\";\nimport {\n cn,\n // Seeking utilities from core\n SPEED_PRESETS,\n isMediaStreamSource,\n supportsPlaybackRate as coreSupportsPlaybackRate,\n calculateSeekableRange,\n canSeekStream,\n calculateLiveThresholds,\n calculateIsNearLive,\n isLiveContent,\n // Time formatting from core\n formatTimeDisplay,\n} from \"@livepeer-frameworks/player-core\";\nimport { Slider } from \"../ui/slider\";\nimport SeekBar from \"./SeekBar\";\nimport {\n FullscreenToggleIcon,\n PlayPauseIcon,\n SeekToLiveIcon,\n SkipBackIcon,\n SkipForwardIcon,\n VolumeIcon,\n SettingsIcon,\n} from \"./Icons\";\nimport type { MistStreamInfo, PlaybackMode } from \"../types\";\n\ninterface PlayerControlsProps {\n currentTime: number;\n duration: number;\n isVisible?: boolean;\n className?: string;\n onSeek?: (time: number) => void;\n showStatsButton?: boolean;\n isStatsOpen?: boolean;\n onStatsToggle?: () => void;\n /** Live MistServer stream info - drives control visibility based on server metadata */\n mistStreamInfo?: MistStreamInfo;\n /** Disable all controls (e.g., while player is initializing) */\n disabled?: boolean;\n /** Current playback mode */\n playbackMode?: PlaybackMode;\n /** Callback when playback mode changes */\n onModeChange?: (mode: PlaybackMode) => void;\n /** Current source protocol type (e.g., 'whep', 'ws/video/mp4', 'html5/application/vnd.apple.mpegurl') */\n sourceType?: string;\n /** Content-type based live flag (for mode selector visibility, separate from seek bar isLive) */\n isContentLive?: boolean;\n /** Video element - passed from parent hook */\n videoElement?: HTMLVideoElement | null;\n /** Available quality levels - passed from parent hook */\n qualities?: Array<{\n id: string;\n label: string;\n bitrate?: number;\n width?: number;\n height?: number;\n isAuto?: boolean;\n active?: boolean;\n }>;\n /** Callback to select quality */\n onSelectQuality?: (id: string) => void;\n /** Is player muted */\n isMuted?: boolean;\n /** Current volume (0-1) */\n volume?: number;\n /** Callback for volume change */\n onVolumeChange?: (volume: number) => void;\n /** Toggle mute callback */\n onToggleMute?: () => void;\n /** Is playing */\n isPlaying?: boolean;\n /** Toggle play/pause callback */\n onTogglePlay?: () => void;\n /** Toggle fullscreen callback */\n onToggleFullscreen?: () => void;\n /** Is fullscreen */\n isFullscreen?: boolean;\n /** Is loop enabled */\n isLoopEnabled?: boolean;\n /** Toggle loop callback */\n onToggleLoop?: () => void;\n /** Jump to live edge callback */\n onJumpToLive?: () => void;\n}\n\nconst PlayerControls: React.FC<PlayerControlsProps> = ({\n currentTime,\n duration,\n isVisible = true,\n className: _className,\n onSeek,\n mistStreamInfo,\n disabled = false,\n playbackMode = \"auto\",\n onModeChange,\n sourceType,\n isContentLive,\n videoElement: propVideoElement,\n qualities: propQualities = [],\n onSelectQuality,\n isMuted: propIsMuted,\n volume: propVolume,\n onVolumeChange,\n onToggleMute,\n isPlaying: propIsPlaying,\n onTogglePlay,\n onToggleFullscreen,\n isFullscreen: propIsFullscreen,\n isLoopEnabled: _propIsLoopEnabled,\n onToggleLoop: _onToggleLoop,\n onJumpToLive,\n}) => {\n // Context fallback - prefer props passed from parent over context\n // Context provides UsePlayerControllerReturn which has state.videoElement and controller\n const ctx = usePlayerContextOptional();\n const contextVideo = ctx?.state?.videoElement;\n const player = ctx?.controller;\n\n // Robust video element detection - prefer prop, then context, then DOM query\n const [video, setVideo] = useState<HTMLVideoElement | null>(null);\n const videoCheckIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const findVideoElement = useCallback((): HTMLVideoElement | null => {\n if (propVideoElement) return propVideoElement;\n if (contextVideo) return contextVideo;\n if (player?.getVideoElement?.()) return player.getVideoElement();\n const domVideo =\n (document.querySelector(\".fw-player-video\") as HTMLVideoElement | null) ??\n (document.querySelector('[data-player-container=\"true\"] video') as HTMLVideoElement | null) ??\n (document.querySelector(\".fw-player-container video\") as HTMLVideoElement | null);\n return domVideo;\n }, [propVideoElement, contextVideo, player]);\n\n useEffect(() => {\n const updateVideo = () => {\n const v = findVideoElement();\n if (v && v !== video) {\n setVideo(v);\n }\n };\n updateVideo();\n if (!video) {\n videoCheckIntervalRef.current = setInterval(() => {\n const v = findVideoElement();\n if (v) {\n setVideo(v);\n if (videoCheckIntervalRef.current) {\n clearInterval(videoCheckIntervalRef.current);\n videoCheckIntervalRef.current = null;\n }\n }\n }, 100);\n setTimeout(() => {\n if (videoCheckIntervalRef.current) {\n clearInterval(videoCheckIntervalRef.current);\n videoCheckIntervalRef.current = null;\n }\n }, 5000);\n }\n return () => {\n if (videoCheckIntervalRef.current) {\n clearInterval(videoCheckIntervalRef.current);\n videoCheckIntervalRef.current = null;\n }\n };\n }, [contextVideo, player, findVideoElement, video]);\n\n const mistTracks = mistStreamInfo?.meta?.tracks;\n\n // Quality selection priority:\n // 1. Player-provided qualities (HLS.js/DASH.js levels with correct numeric indices)\n // 2. Mist track metadata (for players that don't provide quality API)\n // This fixes a critical bug where Mist track IDs (e.g., \"a1\", \"v0\") were passed to\n // HLS/DASH players which expect numeric indices (e.g., \"0\", \"1\", \"2\")\n // Quality levels - prefer props, then player API, then Mist tracks\n const qualities = useMemo(() => {\n // Priority 1: Props from parent (usePlayerController hook)\n if (propQualities && propQualities.length > 0) {\n return propQualities;\n }\n\n // Priority 2: Player's quality API\n const playerQualities = player?.getQualities?.();\n if (playerQualities && playerQualities.length > 0) {\n return playerQualities;\n }\n\n // Fallback to Mist track metadata for players without quality API\n if (mistTracks) {\n return Object.entries(mistTracks)\n .filter(([, t]) => t.type === \"video\")\n .map(([id, t]) => ({\n id,\n label: t.height ? `${t.height}p` : t.codec,\n width: t.width,\n height: t.height,\n bitrate: t.bps,\n }))\n .sort((a, b) => (b.height || 0) - (a.height || 0));\n }\n return [];\n }, [propQualities, player, mistTracks]);\n\n const textTracks = player?.getTextTracks?.() ?? [];\n\n // Internal state - used as fallback when props not provided\n const [internalIsPlaying, setInternalIsPlaying] = useState(false);\n const [internalIsMuted, setInternalIsMuted] = useState(false);\n const [internalIsFullscreen, setInternalIsFullscreen] = useState(false);\n const [hasAudio, setHasAudio] = useState(true);\n const [buffered, setBuffered] = useState<TimeRanges | undefined>(undefined);\n const [internalVolume, setInternalVolume] = useState<number>(() => {\n if (!video) return 100;\n return Math.round(video.volume * 100);\n });\n const [playbackRate, setPlaybackRate] = useState<number>(() => video?.playbackRate ?? 1);\n\n // Derived state - prefer props over internal state\n const isPlaying = propIsPlaying ?? internalIsPlaying;\n const isMuted = propIsMuted ?? internalIsMuted;\n const isFullscreen = propIsFullscreen ?? internalIsFullscreen;\n const actualVolume = propVolume !== undefined ? Math.round(propVolume * 100) : internalVolume;\n // Show 0 when muted, actual volume otherwise\n const volumeValue = isMuted ? 0 : actualVolume;\n const [qualityValue, setQualityValue] = useState<string>(\"auto\");\n const [captionValue, setCaptionValue] = useState<string>(\"none\");\n const [isSettingsOpen, setIsSettingsOpen] = useState(false);\n // Hysteresis state for Live badge - prevents flip-flopping\n const [isNearLiveState, setIsNearLiveState] = useState(true);\n\n // Close settings menu when clicking outside\n useEffect(() => {\n if (!isSettingsOpen) return;\n\n const handleWindowClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (target && !target.closest(\".fw-settings-menu\")) {\n setIsSettingsOpen(false);\n }\n };\n\n // Use setTimeout to avoid immediate close from the same click that opened it\n const timeoutId = setTimeout(() => {\n window.addEventListener(\"click\", handleWindowClick);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n window.removeEventListener(\"click\", handleWindowClick);\n };\n }, [isSettingsOpen]);\n\n // Core utility-based calculations\n const deriveBufferWindowMs = useCallback(\n (tracks?: Record<string, { firstms?: number; lastms?: number }>) => {\n if (!tracks) return undefined;\n const list = Object.values(tracks);\n if (list.length === 0) return undefined;\n const firstmsValues = list.map((t) => t.firstms).filter((v): v is number => v !== undefined);\n const lastmsValues = list.map((t) => t.lastms).filter((v): v is number => v !== undefined);\n if (firstmsValues.length === 0 || lastmsValues.length === 0) return undefined;\n const firstms = Math.max(...firstmsValues);\n const lastms = Math.min(...lastmsValues);\n const window = lastms - firstms;\n if (!Number.isFinite(window) || window <= 0) return undefined;\n return window;\n },\n []\n );\n\n const bufferWindowMs =\n mistStreamInfo?.meta?.buffer_window ??\n deriveBufferWindowMs(\n mistStreamInfo?.meta?.tracks as\n | Record<string, { firstms?: number; lastms?: number }>\n | undefined\n );\n\n const isLive = useMemo(\n () => isLiveContent(isContentLive, mistStreamInfo, duration),\n [isContentLive, mistStreamInfo, duration]\n );\n\n const isWebRTC = useMemo(() => isMediaStreamSource(video), [video]);\n\n const supportsPlaybackRate = useMemo(() => coreSupportsPlaybackRate(video), [video]);\n\n // Seekable range using core calculation (allow controller override)\n const allowMediaStreamDvr =\n isMediaStreamSource(video) &&\n bufferWindowMs !== undefined &&\n bufferWindowMs > 0 &&\n sourceType !== \"whep\" &&\n sourceType !== \"webrtc\";\n const { seekableStart: calcSeekableStart, liveEdge: calcLiveEdge } = useMemo(\n () =>\n calculateSeekableRange({\n isLive,\n video,\n mistStreamInfo,\n currentTime,\n duration,\n allowMediaStreamDvr,\n }),\n [isLive, video, mistStreamInfo, currentTime, duration, allowMediaStreamDvr]\n );\n const controllerSeekableStart = player?.getSeekableStart?.();\n const controllerLiveEdge = player?.getLiveEdge?.();\n const useControllerRange =\n Number.isFinite(controllerSeekableStart) &&\n Number.isFinite(controllerLiveEdge) &&\n (controllerLiveEdge as number) >= (controllerSeekableStart as number) &&\n ((controllerLiveEdge as number) > 0 || (controllerSeekableStart as number) > 0);\n const seekableStart = useControllerRange\n ? (controllerSeekableStart as number)\n : calcSeekableStart;\n const liveEdge = useControllerRange ? (controllerLiveEdge as number) : calcLiveEdge;\n\n const hasDvrWindow =\n isLive &&\n Number.isFinite(liveEdge) &&\n Number.isFinite(seekableStart) &&\n liveEdge > seekableStart;\n const commitOnRelease = isLive;\n\n // Live thresholds with buffer window scaling\n const liveThresholds = useMemo(\n () => calculateLiveThresholds(sourceType, isWebRTC, bufferWindowMs),\n [sourceType, isWebRTC, bufferWindowMs]\n );\n\n // Can seek - prefer PlayerController's computed value (includes player-specific canSeek)\n // Fall back to utility function when controller not available\n const baseCanSeek = useMemo(() => {\n // PlayerController already computes canSeek with player-specific logic\n if (player && typeof (player as any).canSeekStream === \"function\") {\n return (player as any).canSeekStream();\n }\n // Fallback when no controller\n return canSeekStream({\n video,\n isLive,\n duration,\n bufferWindowMs,\n });\n }, [video, isLive, duration, bufferWindowMs, player]);\n const canSeek = baseCanSeek && (!isLive || hasDvrWindow);\n\n // Hysteresis for live badge - using core calculation\n useEffect(() => {\n if (!isLive) {\n setIsNearLiveState(true);\n return;\n }\n const newState = calculateIsNearLive(currentTime, liveEdge, liveThresholds, isNearLiveState);\n if (newState !== isNearLiveState) {\n setIsNearLiveState(newState);\n }\n }, [isLive, liveEdge, currentTime, liveThresholds, isNearLiveState]);\n\n // Track if we've already seeked to live on initial playback\n const hasSeekToLiveRef = useRef(false);\n\n // Sync internal state from video element (only when props not provided)\n useEffect(() => {\n if (!video) return;\n const updatePlayingState = () => setInternalIsPlaying(!video.paused);\n const updateMutedState = () => {\n const muted = video.muted || video.volume === 0;\n setInternalIsMuted(muted);\n setInternalVolume(Math.round(video.volume * 100));\n };\n const updateFullscreenState = () => {\n if (typeof document !== \"undefined\") setInternalIsFullscreen(!!document.fullscreenElement);\n };\n const updatePlaybackRate = () => setPlaybackRate(video.playbackRate);\n\n updatePlayingState();\n updateMutedState();\n updateFullscreenState();\n updatePlaybackRate();\n\n video.addEventListener(\"play\", updatePlayingState);\n video.addEventListener(\"pause\", updatePlayingState);\n video.addEventListener(\"playing\", updatePlayingState);\n video.addEventListener(\"volumechange\", updateMutedState);\n video.addEventListener(\"ratechange\", updatePlaybackRate);\n if (typeof document !== \"undefined\")\n document.addEventListener(\"fullscreenchange\", updateFullscreenState);\n\n return () => {\n video.removeEventListener(\"play\", updatePlayingState);\n video.removeEventListener(\"pause\", updatePlayingState);\n video.removeEventListener(\"playing\", updatePlayingState);\n video.removeEventListener(\"volumechange\", updateMutedState);\n video.removeEventListener(\"ratechange\", updatePlaybackRate);\n if (typeof document !== \"undefined\")\n document.removeEventListener(\"fullscreenchange\", updateFullscreenState);\n };\n }, [video, isLive]);\n\n // Reset the seek-to-live flag when video element changes (new stream)\n useEffect(() => {\n hasSeekToLiveRef.current = false;\n }, [video]);\n\n useEffect(() => {\n const activeTrack = textTracks.find((track) => track.active);\n setCaptionValue(activeTrack ? activeTrack.id : \"none\");\n }, [textTracks]);\n\n // Track buffered ranges for SeekBar\n useEffect(() => {\n if (!video) return;\n const updateBuffered = () => {\n const next = player?.getBufferedRanges?.() ?? video.buffered;\n setBuffered(next);\n };\n updateBuffered();\n video.addEventListener(\"progress\", updateBuffered);\n video.addEventListener(\"loadeddata\", updateBuffered);\n return () => {\n video.removeEventListener(\"progress\", updateBuffered);\n video.removeEventListener(\"loadeddata\", updateBuffered);\n };\n }, [video]);\n\n useEffect(() => {\n if (!video) {\n setHasAudio(true);\n return;\n }\n const checkAudio = () => {\n if (video.srcObject instanceof MediaStream) {\n const audioTracks = video.srcObject.getAudioTracks();\n setHasAudio(audioTracks.length > 0);\n return;\n }\n const videoAny = video as any;\n if (videoAny.audioTracks && videoAny.audioTracks.length !== undefined) {\n setHasAudio(videoAny.audioTracks.length > 0);\n return;\n }\n setHasAudio(true);\n };\n checkAudio();\n video.addEventListener(\"loadedmetadata\", checkAudio);\n return () => video.removeEventListener(\"loadedmetadata\", checkAudio);\n }, [video]);\n\n const handlePlayPause = () => {\n if (disabled) return;\n // Prefer prop callback from usePlayerController\n if (onTogglePlay) {\n onTogglePlay();\n return;\n }\n // Fallback: direct video/player manipulation\n if (!video && !player) return;\n const isPaused = player?.isPaused?.() ?? video?.paused ?? true;\n if (isPaused) {\n if (player?.play) player.play().catch(() => {});\n else if (video) video.play().catch(() => {});\n } else {\n if (player?.pause) player.pause();\n else if (video) video.pause();\n }\n };\n\n const handleSkipBack = () => {\n const newTime = Math.max(0, currentTime - 10);\n if (onSeek) {\n onSeek(newTime);\n return;\n }\n const v = findVideoElement();\n if (v) v.currentTime = newTime;\n };\n\n const handleSkipForward = () => {\n const maxTime = Number.isFinite(duration) ? duration : currentTime + 10;\n const newTime = Math.min(maxTime, currentTime + 10);\n if (onSeek) {\n onSeek(newTime);\n return;\n }\n const v = findVideoElement();\n if (v) v.currentTime = newTime;\n };\n\n const handleMute = () => {\n if (disabled) return;\n // Prefer prop callback from usePlayerController\n if (onToggleMute) {\n onToggleMute();\n return;\n }\n // Fallback: direct video/player manipulation\n const v = video ?? (document.querySelector(\".fw-player-video\") as HTMLVideoElement | null);\n if (!v) return;\n const nextMuted = !(player?.isMuted?.() ?? v.muted);\n player?.setMuted?.(nextMuted);\n v.muted = nextMuted;\n setInternalIsMuted(nextMuted);\n if (nextMuted) setInternalVolume(0);\n else setInternalVolume(Math.round(v.volume * 100));\n };\n\n const handleVolumeChange = useCallback(\n (value: number[]) => {\n if (disabled) return;\n const next = Math.max(0, Math.min(100, value[0] ?? 0));\n // Prefer prop callback from usePlayerController\n if (onVolumeChange) {\n onVolumeChange(next / 100);\n return;\n }\n // Fallback: direct video manipulation\n const v = video ?? (document.querySelector(\".fw-player-video\") as HTMLVideoElement | null);\n if (!v) return;\n v.volume = next / 100;\n v.muted = next === 0;\n setInternalVolume(next);\n setInternalIsMuted(next === 0);\n },\n [disabled, onVolumeChange, video]\n );\n\n const handleFullscreen = () => {\n if (disabled) return;\n // Prefer prop callback from usePlayerController\n if (onToggleFullscreen) {\n onToggleFullscreen();\n return;\n }\n // Fallback: direct DOM manipulation\n if (typeof document === \"undefined\") return;\n const container = document.querySelector(\n '[data-player-container=\"true\"]'\n ) as HTMLElement | null;\n if (!container) return;\n if (document.fullscreenElement) document.exitFullscreen().catch(() => {});\n else container.requestFullscreen().catch(() => {});\n };\n\n const handleGoLive = () => {\n if (disabled) return;\n if (onJumpToLive) {\n onJumpToLive();\n return;\n }\n player?.jumpToLive?.();\n };\n\n const handleSpeedChange = (value: string) => {\n if (disabled) return;\n const rate = Number(value);\n setPlaybackRate(rate);\n // Use player API if available, fall back to direct video element\n if (player?.setPlaybackRate) {\n player.setPlaybackRate(rate);\n } else {\n const v = findVideoElement();\n if (v) v.playbackRate = rate;\n }\n };\n\n const handleQualityChange = (value: string) => {\n if (disabled) return;\n setQualityValue(value);\n // Prefer prop callback from usePlayerController\n if (onSelectQuality) {\n onSelectQuality(value);\n return;\n }\n // Fallback: direct player manipulation\n player?.selectQuality?.(value);\n };\n\n const handleCaptionChange = (value: string) => {\n if (disabled) return;\n setCaptionValue(value);\n if (value === \"none\") player?.selectTextTrack?.(null);\n else player?.selectTextTrack?.(value);\n };\n\n // Time display - using core formatTimeDisplay\n const timeDisplay = useMemo(\n () =>\n formatTimeDisplay({\n isLive,\n currentTime,\n duration,\n liveEdge,\n seekableStart,\n unixoffset: mistStreamInfo?.unixoffset,\n }),\n [isLive, currentTime, duration, liveEdge, seekableStart, mistStreamInfo?.unixoffset]\n );\n\n const [isVolumeHovered, setIsVolumeHovered] = useState(false);\n const [isVolumeFocused, setIsVolumeFocused] = useState(false);\n const isVolumeExpanded = isVolumeHovered || isVolumeFocused;\n const volumeGroupRef = useRef<HTMLDivElement>(null);\n\n // Non-passive wheel listener for volume control\n useEffect(() => {\n const el = volumeGroupRef.current;\n if (!el) return;\n const handler = (e: WheelEvent) => {\n if (disabled || !hasAudio) return;\n e.preventDefault();\n const delta = e.deltaY < 0 ? 5 : -5;\n handleVolumeChange([actualVolume + delta]);\n };\n el.addEventListener(\"wheel\", handler, { passive: false });\n return () => el.removeEventListener(\"wheel\", handler);\n }, [disabled, hasAudio, actualVolume, handleVolumeChange]);\n\n return (\n <div\n className={cn(\n \"fw-player-surface fw-controls-wrapper\",\n isVisible ? \"fw-controls-wrapper--visible\" : \"fw-controls-wrapper--hidden\"\n )}\n >\n {/* Bottom Row: Controls with SeekBar on top */}\n <div className=\"fw-control-bar pointer-events-auto\" onClick={(e) => e.stopPropagation()}>\n {/* SeekBar - sits directly on top of control buttons */}\n {canSeek && (\n <div className=\"fw-seek-wrapper\">\n <SeekBar\n currentTime={currentTime}\n duration={duration}\n buffered={buffered}\n disabled={disabled}\n isLive={isLive}\n seekableStart={seekableStart}\n liveEdge={liveEdge}\n commitOnRelease={commitOnRelease}\n onSeek={(time) => {\n if (onSeek) {\n onSeek(time);\n } else if (video) {\n video.currentTime = time;\n }\n }}\n />\n </div>\n )}\n\n {/* Control buttons row */}\n <div className=\"fw-controls-row\">\n {/* Left: Controls & Time */}\n <div className=\"fw-controls-left\">\n <div className=\"fw-control-group\">\n <button\n type=\"button\"\n className=\"fw-btn-flush\"\n aria-label={isPlaying ? \"Pause\" : \"Play\"}\n onClick={handlePlayPause}\n >\n <PlayPauseIcon isPlaying={isPlaying} size={18} />\n </button>\n {canSeek && (\n <>\n <button\n type=\"button\"\n className=\"fw-btn-flush hidden sm:flex\"\n aria-label=\"Skip back 10 seconds\"\n onClick={handleSkipBack}\n >\n <SkipBackIcon size={16} />\n </button>\n <button\n type=\"button\"\n className=\"fw-btn-flush hidden sm:flex\"\n aria-label=\"Skip forward 10 seconds\"\n onClick={handleSkipForward}\n >\n <SkipForwardIcon size={16} />\n </button>\n </>\n )}\n </div>\n\n {/* Volume pill - cohesive hover element (slab style) */}\n <div\n ref={volumeGroupRef}\n className={cn(\n \"fw-volume-group\",\n isVolumeExpanded && \"fw-volume-group--expanded\",\n !hasAudio && \"fw-volume-group--disabled\"\n )}\n onMouseEnter={() => hasAudio && setIsVolumeHovered(true)}\n onMouseLeave={() => {\n setIsVolumeHovered(false);\n setIsVolumeFocused(false);\n }}\n onFocusCapture={() => hasAudio && setIsVolumeFocused(true)}\n onBlurCapture={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) setIsVolumeFocused(false);\n }}\n onClick={(e) => {\n // Click on the pill (not slider) toggles mute\n if (hasAudio && e.target === e.currentTarget) {\n handleMute();\n }\n }}\n >\n {/* Volume icon - part of the pill */}\n <button\n type=\"button\"\n className=\"fw-volume-btn\"\n aria-label={!hasAudio ? \"No audio\" : isMuted ? \"Unmute\" : \"Mute\"}\n onClick={hasAudio ? handleMute : undefined}\n disabled={!hasAudio}\n >\n <VolumeIcon isMuted={isMuted || !hasAudio} size={16} />\n </button>\n {/* Slider - expands within the pill */}\n <div\n className={cn(\n \"fw-volume-slider-wrapper\",\n isVolumeExpanded\n ? \"fw-volume-slider-wrapper--expanded\"\n : \"fw-volume-slider-wrapper--collapsed\"\n )}\n >\n <Slider\n orientation=\"horizontal\"\n aria-label=\"Volume\"\n max={100}\n step={1}\n value={[volumeValue]}\n onValueChange={handleVolumeChange}\n className=\"w-full\"\n disabled={!hasAudio}\n />\n </div>\n </div>\n\n <div className=\"fw-control-group\">\n <span className=\"fw-time-display\">{timeDisplay}</span>\n </div>\n\n {isLive && (\n <div className=\"fw-control-group\">\n <button\n type=\"button\"\n onClick={handleGoLive}\n disabled={!hasDvrWindow || isNearLiveState}\n className={cn(\n \"fw-live-badge\",\n !hasDvrWindow || isNearLiveState\n ? \"fw-live-badge--active\"\n : \"fw-live-badge--behind\"\n )}\n title={\n !hasDvrWindow ? \"Live only\" : isNearLiveState ? \"At live edge\" : \"Jump to live\"\n }\n >\n LIVE\n {!isNearLiveState && hasDvrWindow && <SeekToLiveIcon size={10} />}\n </button>\n </div>\n )}\n </div>\n\n {/* Right Group: Settings, Fullscreen */}\n <div className=\"fw-controls-right\">\n <div className=\"fw-control-group relative\">\n <button\n type=\"button\"\n className={cn(\"fw-btn-flush group\", isSettingsOpen && \"fw-btn-flush--active\")}\n aria-label=\"Settings\"\n title=\"Settings\"\n onClick={() => setIsSettingsOpen(!isSettingsOpen)}\n >\n <SettingsIcon size={16} className=\"transition-transform group-hover:rotate-90\" />\n </button>\n\n {/* Settings Popup */}\n {isSettingsOpen && (\n <div className=\"fw-player-surface fw-settings-menu\">\n {/* Playback Mode - only show for live content (not VOD/clips) */}\n {onModeChange && isContentLive !== false && (\n <div className=\"fw-settings-section\">\n <div className=\"fw-settings-label\">Mode</div>\n <div className=\"fw-settings-options\">\n {([\"auto\", \"low-latency\", \"quality\"] as const).map((mode) => (\n <button\n key={mode}\n className={cn(\n \"fw-settings-btn\",\n playbackMode === mode && \"fw-settings-btn--active\"\n )}\n onClick={() => {\n onModeChange(mode);\n setIsSettingsOpen(false);\n }}\n >\n {mode === \"low-latency\"\n ? \"Fast\"\n : mode === \"quality\"\n ? \"Stable\"\n : \"Auto\"}\n </button>\n ))}\n </div>\n </div>\n )}\n {supportsPlaybackRate && (\n <div className=\"fw-settings-section\">\n <div className=\"fw-settings-label\">Speed</div>\n <div className=\"fw-settings-options fw-settings-options--wrap\">\n {SPEED_PRESETS.map((rate) => (\n <button\n key={rate}\n className={cn(\n \"fw-settings-btn\",\n playbackRate === rate && \"fw-settings-btn--active\"\n )}\n onClick={() => {\n handleSpeedChange(String(rate));\n setIsSettingsOpen(false);\n }}\n >\n {rate}x\n </button>\n ))}\n </div>\n </div>\n )}\n {qualities.length > 0 && (\n <div className=\"fw-settings-section\">\n <div className=\"fw-settings-label\">Quality</div>\n <div className=\"fw-settings-list\">\n <button\n className={cn(\n \"fw-settings-list-item\",\n qualityValue === \"auto\" && \"fw-settings-list-item--active\"\n )}\n onClick={() => {\n handleQualityChange(\"auto\");\n setIsSettingsOpen(false);\n }}\n >\n Auto\n </button>\n {qualities.map((q) => (\n <button\n key={q.id}\n className={cn(\n \"fw-settings-list-item\",\n qualityValue === q.id && \"fw-settings-list-item--active\"\n )}\n onClick={() => {\n handleQualityChange(q.id);\n setIsSettingsOpen(false);\n }}\n >\n {q.label}\n </button>\n ))}\n </div>\n </div>\n )}\n {textTracks.length > 0 && (\n <div className=\"fw-settings-section\">\n <div className=\"fw-settings-label\">Captions</div>\n <div className=\"fw-settings-list\">\n <button\n className={cn(\n \"fw-settings-list-item\",\n captionValue === \"none\" && \"fw-settings-list-item--active\"\n )}\n onClick={() => {\n handleCaptionChange(\"none\");\n setIsSettingsOpen(false);\n }}\n >\n Off\n </button>\n {textTracks.map((t) => (\n <button\n key={t.id}\n className={cn(\n \"fw-settings-list-item\",\n captionValue === t.id && \"fw-settings-list-item--active\"\n )}\n onClick={() => {\n handleCaptionChange(t.id);\n setIsSettingsOpen(false);\n }}\n >\n {t.label || t.id}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n\n <div className=\"fw-control-group\">\n <button\n type=\"button\"\n className=\"fw-btn-flush\"\n aria-label=\"Toggle fullscreen\"\n onClick={handleFullscreen}\n >\n <FullscreenToggleIcon isFullscreen={isFullscreen} size={16} />\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default PlayerControls;\n"],"names":["PlayerControls","_ref","_ctx$state","_mistStreamInfo$meta","_player$getTextTracks","_player$getTextTracks2","_mistStreamInfo$meta$","_mistStreamInfo$meta2","_mistStreamInfo$meta3","_player$getSeekableSt","_player$getLiveEdge","currentTime","duration","_ref$isVisible","isVisible","className","onSeek","mistStreamInfo","_ref$disabled","disabled","_ref$playbackMode","playbackMode","onModeChange","sourceType","isContentLive","propVideoElement","videoElement","_ref$qualities","qualities","propQualities","onSelectQuality","propIsMuted","isMuted","propVolume","volume","onVolumeChange","onToggleMute","propIsPlaying","isPlaying","onTogglePlay","onToggleFullscreen","propIsFullscreen","isFullscreen","isLoopEnabled","onToggleLoop","onJumpToLive","ctx","usePlayerContextOptional","contextVideo","state","player","controller","_useState","useState","_useState2","_slicedToArray","video","setVideo","videoCheckIntervalRef","useRef","findVideoElement","useCallback","_player$getVideoEleme","_ref2","_document$querySelect","getVideoElement","call","domVideo","document","querySelector","useEffect","updateVideo","v","current","setInterval","clearInterval","setTimeout","mistTracks","meta","tracks","useMemo","_player$getQualities","length","playerQualities","getQualities","Object","entries","filter","_ref3","_ref4","t","type","map","_ref5","_ref6","id","label","height","concat","codec","width","bitrate","bps","sort","a","b","textTracks","getTextTracks","_useState3","_useState4","internalIsPlaying","setInternalIsPlaying","_useState5","_useState6","internalIsMuted","setInternalIsMuted","_useState7","_useState8","internalIsFullscreen","setInternalIsFullscreen","_useState9","_useState0","hasAudio","setHasAudio","_useState1","undefined","_useState10","buffered","setBuffered","_useState11","Math","round","_useState12","internalVolume","setInternalVolume","_useState13","_video$playbackRate","playbackRate","_useState14","setPlaybackRate","actualVolume","volumeValue","_useState15","_useState16","qualityValue","setQualityValue","_useState17","_useState18","captionValue","setCaptionValue","_useState19","_useState20","isSettingsOpen","setIsSettingsOpen","_useState21","_useState22","isNearLiveState","setIsNearLiveState","handleWindowClick","event","target","closest","timeoutId","window","addEventListener","clearTimeout","removeEventListener","deriveBufferWindowMs","list","values","firstmsValues","firstms","lastmsValues","lastms","max","apply","_toConsumableArray","min","Number","isFinite","bufferWindowMs","buffer_window","isLive","isLiveContent","isWebRTC","isMediaStreamSource","supportsPlaybackRate","coreSupportsPlaybackRate","allowMediaStreamDvr","_useMemo","calculateSeekableRange","calcSeekableStart","seekableStart","calcLiveEdge","liveEdge","controllerSeekableStart","getSeekableStart","controllerLiveEdge","getLiveEdge","useControllerRange","hasDvrWindow","commitOnRelease","liveThresholds","calculateLiveThresholds","baseCanSeek","canSeekStream","canSeek","newState","calculateIsNearLive","hasSeekToLiveRef","updatePlayingState","paused","updateMutedState","muted","updateFullscreenState","fullscreenElement","updatePlaybackRate","activeTrack","find","track","active","updateBuffered","_player$getBufferedRa","_player$getBufferedRa2","next","getBufferedRanges","checkAudio","srcObject","MediaStream","audioTracks","getAudioTracks","videoAny","handlePlayPause","_ref7","_player$isPaused","_player$isPaused2","isPaused","play","pause","handleSkipBack","newTime","handleSkipForward","maxTime","handleMute","_player$isMuted","_player$isMuted2","_player$setMuted","nextMuted","setMuted","handleVolumeChange","value","_value$","handleFullscreen","container","exitFullscreen","requestFullscreen","handleGoLive","_player$jumpToLive","jumpToLive","handleSpeedChange","rate","handleQualityChange","_player$selectQuality","selectQuality","handleCaptionChange","_player$selectTextTra","_player$selectTextTra2","selectTextTrack","timeDisplay","formatTimeDisplay","unixoffset","_useState23","_useState24","isVolumeHovered","setIsVolumeHovered","_useState25","_useState26","isVolumeFocused","setIsVolumeFocused","isVolumeExpanded","volumeGroupRef","el","handler","e","preventDefault","delta","deltaY","passive","_jsx","cn","children","_jsxs","onClick","stopPropagation","SeekBar","time","PlayPauseIcon","size","_Fragment","SkipBackIcon","SkipForwardIcon","ref","onMouseEnter","onMouseLeave","onFocusCapture","onBlurCapture","currentTarget","contains","relatedTarget","VolumeIcon","Slider","orientation","step","onValueChange","title","SeekToLiveIcon","SettingsIcon","mode","SPEED_PRESETS","String","q","FullscreenToggleIcon"],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var React = require('react');
8
+ var button = require('../ui/button.js');
9
+
10
+ /**
11
+ * Error boundary to catch and handle player errors gracefully.
12
+ * Prevents player errors from crashing the parent application.
13
+ */
14
+ var PlayerErrorBoundary = /*#__PURE__*/function (_Component) {
15
+ function PlayerErrorBoundary(props) {
16
+ var _this;
17
+ _rollupPluginBabelHelpers.classCallCheck(this, PlayerErrorBoundary);
18
+ _this = _rollupPluginBabelHelpers.callSuper(this, PlayerErrorBoundary, [props]);
19
+ _this.handleRetry = function () {
20
+ var _this$props$onRetry, _this$props;
21
+ _this.setState({
22
+ hasError: false,
23
+ error: null
24
+ });
25
+ (_this$props$onRetry = (_this$props = _this.props).onRetry) === null || _this$props$onRetry === void 0 || _this$props$onRetry.call(_this$props);
26
+ };
27
+ _this.state = {
28
+ hasError: false,
29
+ error: null
30
+ };
31
+ return _this;
32
+ }
33
+ _rollupPluginBabelHelpers.inherits(PlayerErrorBoundary, _Component);
34
+ return _rollupPluginBabelHelpers.createClass(PlayerErrorBoundary, [{
35
+ key: "componentDidCatch",
36
+ value: function componentDidCatch(error, errorInfo) {
37
+ var _this$props$onError, _this$props2;
38
+ console.error("[PlayerErrorBoundary] Caught error:", error, errorInfo);
39
+ (_this$props$onError = (_this$props2 = this.props).onError) === null || _this$props$onError === void 0 || _this$props$onError.call(_this$props2, error, errorInfo);
40
+ }
41
+ }, {
42
+ key: "render",
43
+ value: function render() {
44
+ if (this.state.hasError) {
45
+ var _this$state$error;
46
+ if (this.props.fallback) {
47
+ return this.props.fallback;
48
+ }
49
+ return jsxRuntime.jsxs("div", {
50
+ className: "fw-player-error flex min-h-[280px] flex-col items-center justify-center gap-4 rounded-xl bg-slate-950 p-6 text-center text-white",
51
+ children: [jsxRuntime.jsx("div", {
52
+ className: "text-lg font-semibold text-red-400",
53
+ children: "Playback Error"
54
+ }), jsxRuntime.jsx("p", {
55
+ className: "max-w-sm text-sm text-slate-400",
56
+ children: ((_this$state$error = this.state.error) === null || _this$state$error === void 0 ? void 0 : _this$state$error.message) || "An unexpected error occurred while loading the player."
57
+ }), jsxRuntime.jsx(button.Button, {
58
+ type: "button",
59
+ variant: "secondary",
60
+ onClick: this.handleRetry,
61
+ className: "mt-2",
62
+ children: "Try Again"
63
+ })]
64
+ });
65
+ }
66
+ return this.props.children;
67
+ }
68
+ }], [{
69
+ key: "getDerivedStateFromError",
70
+ value: function getDerivedStateFromError(error) {
71
+ return {
72
+ hasError: true,
73
+ error: error
74
+ };
75
+ }
76
+ }]);
77
+ }(React.Component);
78
+
79
+ exports.default = PlayerErrorBoundary;
80
+ //# sourceMappingURL=PlayerErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayerErrorBoundary.js","sources":["../../../../src/components/PlayerErrorBoundary.tsx"],"sourcesContent":["import type { ErrorInfo, ReactNode } from \"react\";\nimport React, { Component } from \"react\";\nimport { Button } from \"../ui/button\";\n\ninterface Props {\n children: ReactNode;\n fallback?: ReactNode;\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n onRetry?: () => void;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * Error boundary to catch and handle player errors gracefully.\n * Prevents player errors from crashing the parent application.\n */\nclass PlayerErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(\"[PlayerErrorBoundary] Caught error:\", error, errorInfo);\n this.props.onError?.(error, errorInfo);\n }\n\n handleRetry = (): void => {\n this.setState({ hasError: false, error: null });\n this.props.onRetry?.();\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div className=\"fw-player-error flex min-h-[280px] flex-col items-center justify-center gap-4 rounded-xl bg-slate-950 p-6 text-center text-white\">\n <div className=\"text-lg font-semibold text-red-400\">Playback Error</div>\n <p className=\"max-w-sm text-sm text-slate-400\">\n {this.state.error?.message || \"An unexpected error occurred while loading the player.\"}\n </p>\n <Button type=\"button\" variant=\"secondary\" onClick={this.handleRetry} className=\"mt-2\">\n Try Again\n </Button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\nexport default PlayerErrorBoundary;\n"],"names":["PlayerErrorBoundary","_Component","props","_this","_classCallCheck","_callSuper","handleRetry","_this$props$onRetry","_this$props","setState","hasError","error","onRetry","call","state","_inherits","_createClass","key","value","componentDidCatch","errorInfo","_this$props$onError","_this$props2","console","onError","render","_this$state$error","fallback","_jsxs","className","children","_jsx","message","Button","type","variant","onClick","getDerivedStateFromError","Component"],"mappings":"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"}
@@ -0,0 +1,253 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var React = require('react');
8
+ var playerCore = require('@livepeer-frameworks/player-core');
9
+
10
+ /**
11
+ * Industry-standard video seek bar with:
12
+ * - Track background
13
+ * - Buffer progress indicator
14
+ * - Playback progress indicator
15
+ * - Thumb on hover
16
+ * - Time tooltip on hover (relative for live: "-5:30")
17
+ */
18
+ var SeekBar = function SeekBar(_ref) {
19
+ var currentTime = _ref.currentTime,
20
+ duration = _ref.duration,
21
+ buffered = _ref.buffered,
22
+ _ref$disabled = _ref.disabled,
23
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
24
+ onSeek = _ref.onSeek,
25
+ className = _ref.className,
26
+ _ref$isLive = _ref.isLive,
27
+ isLive = _ref$isLive === void 0 ? false : _ref$isLive,
28
+ _ref$seekableStart = _ref.seekableStart,
29
+ seekableStart = _ref$seekableStart === void 0 ? 0 : _ref$seekableStart,
30
+ liveEdge = _ref.liveEdge,
31
+ _ref$commitOnRelease = _ref.commitOnRelease,
32
+ commitOnRelease = _ref$commitOnRelease === void 0 ? false : _ref$commitOnRelease;
33
+ var trackRef = React.useRef(null);
34
+ var _useState = React.useState(false),
35
+ _useState2 = _rollupPluginBabelHelpers.slicedToArray(_useState, 2),
36
+ isHovering = _useState2[0],
37
+ setIsHovering = _useState2[1];
38
+ var _useState3 = React.useState(false),
39
+ _useState4 = _rollupPluginBabelHelpers.slicedToArray(_useState3, 2),
40
+ isDragging = _useState4[0],
41
+ setIsDragging = _useState4[1];
42
+ var _useState5 = React.useState(null),
43
+ _useState6 = _rollupPluginBabelHelpers.slicedToArray(_useState5, 2),
44
+ dragTime = _useState6[0],
45
+ setDragTime = _useState6[1];
46
+ var dragTimeRef = React.useRef(null);
47
+ var _useState7 = React.useState(0),
48
+ _useState8 = _rollupPluginBabelHelpers.slicedToArray(_useState7, 2),
49
+ hoverPosition = _useState8[0],
50
+ setHoverPosition = _useState8[1];
51
+ var _useState9 = React.useState(0),
52
+ _useState0 = _rollupPluginBabelHelpers.slicedToArray(_useState9, 2),
53
+ hoverTime = _useState0[0],
54
+ setHoverTime = _useState0[1];
55
+ // Effective live edge (use provided or fall back to duration)
56
+ var effectiveLiveEdge = liveEdge !== null && liveEdge !== void 0 ? liveEdge : duration;
57
+ // Seekable window size
58
+ var seekableWindow = effectiveLiveEdge - seekableStart;
59
+ // Calculate progress percentage
60
+ // For live streams: position within the DVR window
61
+ // For VOD: position within total duration
62
+ var displayTime = dragTime !== null && dragTime !== void 0 ? dragTime : currentTime;
63
+ var progressPercent = React.useMemo(function () {
64
+ if (isLive && seekableWindow > 0) {
65
+ var positionInWindow = displayTime - seekableStart;
66
+ return Math.min(100, Math.max(0, positionInWindow / seekableWindow * 100));
67
+ }
68
+ if (!Number.isFinite(duration) || duration <= 0) return 0;
69
+ return Math.min(100, Math.max(0, displayTime / duration * 100));
70
+ }, [displayTime, duration, isLive, seekableStart, seekableWindow]);
71
+ // Calculate buffered segments as array of {start%, end%} for accurate display
72
+ var bufferedSegments = React.useMemo(function () {
73
+ if (!buffered || buffered.length === 0) return [];
74
+ var rangeEnd = isLive ? effectiveLiveEdge : duration;
75
+ var rangeStart = isLive ? seekableStart : 0;
76
+ var rangeSize = rangeEnd - rangeStart;
77
+ if (!Number.isFinite(rangeSize) || rangeSize <= 0) return [];
78
+ var segments = [];
79
+ for (var i = 0; i < buffered.length; i++) {
80
+ var start = buffered.start(i);
81
+ var end = buffered.end(i);
82
+ // Calculate position relative to the seekable range
83
+ var relativeStart = start - rangeStart;
84
+ var relativeEnd = end - rangeStart;
85
+ segments.push({
86
+ startPercent: Math.min(100, Math.max(0, relativeStart / rangeSize * 100)),
87
+ endPercent: Math.min(100, Math.max(0, relativeEnd / rangeSize * 100))
88
+ });
89
+ }
90
+ return segments;
91
+ }, [buffered, duration, isLive, seekableStart, effectiveLiveEdge]);
92
+ // Format time as MM:SS or HH:MM:SS (for VOD)
93
+ var formatTime = React.useCallback(function (seconds) {
94
+ if (!Number.isFinite(seconds) || seconds < 0) return "0:00";
95
+ var total = Math.floor(seconds);
96
+ var hours = Math.floor(total / 3600);
97
+ var minutes = Math.floor(total % 3600 / 60);
98
+ var secs = total % 60;
99
+ if (hours > 0) {
100
+ return "".concat(hours, ":").concat(String(minutes).padStart(2, "0"), ":").concat(String(secs).padStart(2, "0"));
101
+ }
102
+ return "".concat(minutes, ":").concat(String(secs).padStart(2, "0"));
103
+ }, []);
104
+ // Format relative time for live streams (e.g., "-5:30" = 5:30 behind live edge)
105
+ var formatLiveTime = React.useCallback(function (seconds, edge) {
106
+ var behindSeconds = edge - seconds;
107
+ if (behindSeconds < 1) return "LIVE";
108
+ var total = Math.floor(behindSeconds);
109
+ var hours = Math.floor(total / 3600);
110
+ var minutes = Math.floor(total % 3600 / 60);
111
+ var secs = total % 60;
112
+ if (hours > 0) {
113
+ return "-".concat(hours, ":").concat(String(minutes).padStart(2, "0"), ":").concat(String(secs).padStart(2, "0"));
114
+ }
115
+ return "-".concat(minutes, ":").concat(String(secs).padStart(2, "0"));
116
+ }, []);
117
+ // Calculate time from mouse position
118
+ // For live: maps position to time within DVR window
119
+ var getTimeFromPosition = React.useCallback(function (clientX) {
120
+ if (!trackRef.current) return 0;
121
+ var rect = trackRef.current.getBoundingClientRect();
122
+ var x = clientX - rect.left;
123
+ var percent = Math.min(1, Math.max(0, x / rect.width));
124
+ // Live with valid seekable window
125
+ if (isLive && Number.isFinite(seekableWindow) && seekableWindow > 0) {
126
+ return seekableStart + percent * seekableWindow;
127
+ }
128
+ // VOD with finite duration
129
+ if (Number.isFinite(duration) && duration > 0) {
130
+ return percent * duration;
131
+ }
132
+ // Fallback: If we have liveEdge, use it even if not marked as live
133
+ // This handles cases where duration is Infinity but we have valid seekable data
134
+ if (liveEdge !== undefined && Number.isFinite(liveEdge) && liveEdge > 0) {
135
+ var start = Number.isFinite(seekableStart) ? seekableStart : 0;
136
+ var window = liveEdge - start;
137
+ if (window > 0) {
138
+ return start + percent * window;
139
+ }
140
+ }
141
+ // Last resort: use currentTime as a baseline
142
+ return percent * (currentTime || 1);
143
+ }, [duration, isLive, seekableStart, seekableWindow, liveEdge, currentTime]);
144
+ // Handle mouse move for hover preview
145
+ var handleMouseMove = React.useCallback(function (e) {
146
+ if (!trackRef.current || disabled) return;
147
+ var rect = trackRef.current.getBoundingClientRect();
148
+ var x = e.clientX - rect.left;
149
+ var percent = Math.min(1, Math.max(0, x / rect.width));
150
+ setHoverPosition(percent * 100);
151
+ setHoverTime(getTimeFromPosition(e.clientX));
152
+ }, [disabled, getTimeFromPosition]);
153
+ // Handle click to seek
154
+ var handleClick = React.useCallback(function (e) {
155
+ if (disabled) return;
156
+ if (!isLive && !Number.isFinite(duration)) return;
157
+ var time = getTimeFromPosition(e.clientX);
158
+ onSeek === null || onSeek === void 0 || onSeek(time);
159
+ setDragTime(null);
160
+ dragTimeRef.current = null;
161
+ }, [disabled, duration, isLive, getTimeFromPosition, onSeek]);
162
+ // Handle drag start
163
+ var handleMouseDown = React.useCallback(function (e) {
164
+ if (disabled) return;
165
+ if (!isLive && !Number.isFinite(duration)) return;
166
+ e.preventDefault();
167
+ setIsDragging(true);
168
+ var handleDragMove = function handleDragMove(moveEvent) {
169
+ var time = getTimeFromPosition(moveEvent.clientX);
170
+ if (commitOnRelease) {
171
+ setDragTime(time);
172
+ dragTimeRef.current = time;
173
+ } else {
174
+ onSeek === null || onSeek === void 0 || onSeek(time);
175
+ }
176
+ };
177
+ var _handleDragEnd = function handleDragEnd() {
178
+ setIsDragging(false);
179
+ document.removeEventListener("mousemove", handleDragMove);
180
+ document.removeEventListener("mouseup", _handleDragEnd);
181
+ var pending = dragTimeRef.current;
182
+ if (commitOnRelease && pending !== null) {
183
+ onSeek === null || onSeek === void 0 || onSeek(pending);
184
+ setDragTime(null);
185
+ dragTimeRef.current = null;
186
+ }
187
+ };
188
+ document.addEventListener("mousemove", handleDragMove);
189
+ document.addEventListener("mouseup", _handleDragEnd);
190
+ // Initial seek
191
+ var time = getTimeFromPosition(e.clientX);
192
+ if (commitOnRelease) {
193
+ setDragTime(time);
194
+ dragTimeRef.current = time;
195
+ } else {
196
+ onSeek === null || onSeek === void 0 || onSeek(time);
197
+ }
198
+ }, [disabled, duration, isLive, getTimeFromPosition, onSeek, commitOnRelease]);
199
+ var showThumb = isHovering || isDragging;
200
+ var canShowTooltip = isLive ? seekableWindow > 0 : Number.isFinite(duration);
201
+ return jsxRuntime.jsxs("div", {
202
+ ref: trackRef,
203
+ className: playerCore.cn("group relative w-full h-6 flex items-center cursor-pointer", disabled && "opacity-50 cursor-not-allowed", className),
204
+ onMouseEnter: function onMouseEnter() {
205
+ return !disabled && setIsHovering(true);
206
+ },
207
+ onMouseLeave: function onMouseLeave() {
208
+ setIsHovering(false);
209
+ setIsDragging(false);
210
+ },
211
+ onMouseMove: handleMouseMove,
212
+ onClick: handleClick,
213
+ onMouseDown: handleMouseDown,
214
+ role: "slider",
215
+ "aria-label": "Seek",
216
+ "aria-valuemin": isLive ? seekableStart : 0,
217
+ "aria-valuemax": isLive ? effectiveLiveEdge : duration || 100,
218
+ "aria-valuenow": displayTime,
219
+ "aria-valuetext": isLive ? formatLiveTime(displayTime, effectiveLiveEdge) : formatTime(displayTime),
220
+ tabIndex: disabled ? -1 : 0,
221
+ children: [jsxRuntime.jsxs("div", {
222
+ className: playerCore.cn("fw-seek-track", isDragging && "fw-seek-track--active"),
223
+ children: [bufferedSegments.map(function (segment, index) {
224
+ return jsxRuntime.jsx("div", {
225
+ className: "fw-seek-buffered",
226
+ style: {
227
+ left: "".concat(segment.startPercent, "%"),
228
+ width: "".concat(segment.endPercent - segment.startPercent, "%")
229
+ }
230
+ }, index);
231
+ }), jsxRuntime.jsx("div", {
232
+ className: "fw-seek-progress",
233
+ style: {
234
+ width: "".concat(progressPercent, "%")
235
+ }
236
+ })]
237
+ }), jsxRuntime.jsx("div", {
238
+ className: playerCore.cn("fw-seek-thumb", showThumb ? "fw-seek-thumb--active" : "fw-seek-thumb--hidden"),
239
+ style: {
240
+ left: "".concat(progressPercent, "%")
241
+ }
242
+ }), isHovering && !isDragging && canShowTooltip && jsxRuntime.jsx("div", {
243
+ className: "fw-seek-tooltip",
244
+ style: {
245
+ left: "".concat(hoverPosition, "%")
246
+ },
247
+ children: isLive ? formatLiveTime(hoverTime, effectiveLiveEdge) : formatTime(hoverTime)
248
+ })]
249
+ });
250
+ };
251
+
252
+ exports.default = SeekBar;
253
+ //# sourceMappingURL=SeekBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeekBar.js","sources":["../../../../src/components/SeekBar.tsx"],"sourcesContent":["import React, { useRef, useState, useCallback, useMemo } from \"react\";\nimport { cn } from \"@livepeer-frameworks/player-core\";\n\ninterface SeekBarProps {\n /** Current playback time in seconds */\n currentTime: number;\n /** Total duration in seconds */\n duration: number;\n /** Buffered time ranges from video element */\n buffered?: TimeRanges;\n /** Whether seeking is allowed */\n disabled?: boolean;\n /** Called when user seeks to a new time */\n onSeek?: (time: number) => void;\n /** Additional class names */\n className?: string;\n /** Whether this is a live stream */\n isLive?: boolean;\n /** For live: start of seekable DVR window (seconds) */\n seekableStart?: number;\n /** For live: current live edge position (seconds) */\n liveEdge?: number;\n /** Defer seeking until drag release */\n commitOnRelease?: boolean;\n}\n\n/**\n * Industry-standard video seek bar with:\n * - Track background\n * - Buffer progress indicator\n * - Playback progress indicator\n * - Thumb on hover\n * - Time tooltip on hover (relative for live: \"-5:30\")\n */\nconst SeekBar: React.FC<SeekBarProps> = ({\n currentTime,\n duration,\n buffered,\n disabled = false,\n onSeek,\n className,\n isLive = false,\n seekableStart = 0,\n liveEdge,\n commitOnRelease = false,\n}) => {\n const trackRef = useRef<HTMLDivElement>(null);\n const [isHovering, setIsHovering] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [dragTime, setDragTime] = useState<number | null>(null);\n const dragTimeRef = useRef<number | null>(null);\n const [hoverPosition, setHoverPosition] = useState(0);\n const [hoverTime, setHoverTime] = useState(0);\n\n // Effective live edge (use provided or fall back to duration)\n const effectiveLiveEdge = liveEdge ?? duration;\n\n // Seekable window size\n const seekableWindow = effectiveLiveEdge - seekableStart;\n\n // Calculate progress percentage\n // For live streams: position within the DVR window\n // For VOD: position within total duration\n const displayTime = dragTime ?? currentTime;\n const progressPercent = useMemo(() => {\n if (isLive && seekableWindow > 0) {\n const positionInWindow = displayTime - seekableStart;\n return Math.min(100, Math.max(0, (positionInWindow / seekableWindow) * 100));\n }\n if (!Number.isFinite(duration) || duration <= 0) return 0;\n return Math.min(100, Math.max(0, (displayTime / duration) * 100));\n }, [displayTime, duration, isLive, seekableStart, seekableWindow]);\n\n // Calculate buffered segments as array of {start%, end%} for accurate display\n const bufferedSegments = useMemo(() => {\n if (!buffered || buffered.length === 0) return [];\n\n const rangeEnd = isLive ? effectiveLiveEdge : duration;\n const rangeStart = isLive ? seekableStart : 0;\n const rangeSize = rangeEnd - rangeStart;\n\n if (!Number.isFinite(rangeSize) || rangeSize <= 0) return [];\n\n const segments: Array<{ startPercent: number; endPercent: number }> = [];\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i);\n const end = buffered.end(i);\n\n // Calculate position relative to the seekable range\n const relativeStart = start - rangeStart;\n const relativeEnd = end - rangeStart;\n\n segments.push({\n startPercent: Math.min(100, Math.max(0, (relativeStart / rangeSize) * 100)),\n endPercent: Math.min(100, Math.max(0, (relativeEnd / rangeSize) * 100)),\n });\n }\n return segments;\n }, [buffered, duration, isLive, seekableStart, effectiveLiveEdge]);\n\n // Format time as MM:SS or HH:MM:SS (for VOD)\n const formatTime = useCallback((seconds: number): string => {\n if (!Number.isFinite(seconds) || seconds < 0) return \"0:00\";\n const total = Math.floor(seconds);\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const secs = total % 60;\n if (hours > 0) {\n return `${hours}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n }\n return `${minutes}:${String(secs).padStart(2, \"0\")}`;\n }, []);\n\n // Format relative time for live streams (e.g., \"-5:30\" = 5:30 behind live edge)\n const formatLiveTime = useCallback((seconds: number, edge: number): string => {\n const behindSeconds = edge - seconds;\n if (behindSeconds < 1) return \"LIVE\";\n const total = Math.floor(behindSeconds);\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const secs = total % 60;\n if (hours > 0) {\n return `-${hours}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n }\n return `-${minutes}:${String(secs).padStart(2, \"0\")}`;\n }, []);\n\n // Calculate time from mouse position\n // For live: maps position to time within DVR window\n const getTimeFromPosition = useCallback(\n (clientX: number): number => {\n if (!trackRef.current) return 0;\n const rect = trackRef.current.getBoundingClientRect();\n const x = clientX - rect.left;\n const percent = Math.min(1, Math.max(0, x / rect.width));\n\n // Live with valid seekable window\n if (isLive && Number.isFinite(seekableWindow) && seekableWindow > 0) {\n return seekableStart + percent * seekableWindow;\n }\n\n // VOD with finite duration\n if (Number.isFinite(duration) && duration > 0) {\n return percent * duration;\n }\n\n // Fallback: If we have liveEdge, use it even if not marked as live\n // This handles cases where duration is Infinity but we have valid seekable data\n if (liveEdge !== undefined && Number.isFinite(liveEdge) && liveEdge > 0) {\n const start = Number.isFinite(seekableStart) ? seekableStart : 0;\n const window = liveEdge - start;\n if (window > 0) {\n return start + percent * window;\n }\n }\n\n // Last resort: use currentTime as a baseline\n return percent * (currentTime || 1);\n },\n [duration, isLive, seekableStart, seekableWindow, liveEdge, currentTime]\n );\n\n // Handle mouse move for hover preview\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!trackRef.current || disabled) return;\n const rect = trackRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const percent = Math.min(1, Math.max(0, x / rect.width));\n setHoverPosition(percent * 100);\n setHoverTime(getTimeFromPosition(e.clientX));\n },\n [disabled, getTimeFromPosition]\n );\n\n // Handle click to seek\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return;\n if (!isLive && !Number.isFinite(duration)) return;\n const time = getTimeFromPosition(e.clientX);\n onSeek?.(time);\n setDragTime(null);\n dragTimeRef.current = null;\n },\n [disabled, duration, isLive, getTimeFromPosition, onSeek]\n );\n\n // Handle drag start\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return;\n if (!isLive && !Number.isFinite(duration)) return;\n e.preventDefault();\n setIsDragging(true);\n\n const handleDragMove = (moveEvent: MouseEvent) => {\n const time = getTimeFromPosition(moveEvent.clientX);\n if (commitOnRelease) {\n setDragTime(time);\n dragTimeRef.current = time;\n } else {\n onSeek?.(time);\n }\n };\n\n const handleDragEnd = () => {\n setIsDragging(false);\n document.removeEventListener(\"mousemove\", handleDragMove);\n document.removeEventListener(\"mouseup\", handleDragEnd);\n const pending = dragTimeRef.current;\n if (commitOnRelease && pending !== null) {\n onSeek?.(pending);\n setDragTime(null);\n dragTimeRef.current = null;\n }\n };\n\n document.addEventListener(\"mousemove\", handleDragMove);\n document.addEventListener(\"mouseup\", handleDragEnd);\n\n // Initial seek\n const time = getTimeFromPosition(e.clientX);\n if (commitOnRelease) {\n setDragTime(time);\n dragTimeRef.current = time;\n } else {\n onSeek?.(time);\n }\n },\n [disabled, duration, isLive, getTimeFromPosition, onSeek, commitOnRelease]\n );\n\n const showThumb = isHovering || isDragging;\n const canShowTooltip = isLive ? seekableWindow > 0 : Number.isFinite(duration);\n\n return (\n <div\n ref={trackRef}\n className={cn(\n \"group relative w-full h-6 flex items-center cursor-pointer\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n onMouseEnter={() => !disabled && setIsHovering(true)}\n onMouseLeave={() => {\n setIsHovering(false);\n setIsDragging(false);\n }}\n onMouseMove={handleMouseMove}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n role=\"slider\"\n aria-label=\"Seek\"\n aria-valuemin={isLive ? seekableStart : 0}\n aria-valuemax={isLive ? effectiveLiveEdge : duration || 100}\n aria-valuenow={displayTime}\n aria-valuetext={\n isLive ? formatLiveTime(displayTime, effectiveLiveEdge) : formatTime(displayTime)\n }\n tabIndex={disabled ? -1 : 0}\n >\n {/* Track background */}\n <div className={cn(\"fw-seek-track\", isDragging && \"fw-seek-track--active\")}>\n {/* Buffered segments - show actual buffered ranges */}\n {bufferedSegments.map((segment, index) => (\n <div\n key={index}\n className=\"fw-seek-buffered\"\n style={{\n left: `${segment.startPercent}%`,\n width: `${segment.endPercent - segment.startPercent}%`,\n }}\n />\n ))}\n {/* Playback progress */}\n <div className=\"fw-seek-progress\" style={{ width: `${progressPercent}%` }} />\n </div>\n\n {/* Thumb */}\n <div\n className={cn(\n \"fw-seek-thumb\",\n showThumb ? \"fw-seek-thumb--active\" : \"fw-seek-thumb--hidden\"\n )}\n style={{ left: `${progressPercent}%` }}\n />\n\n {/* Hover time tooltip */}\n {isHovering && !isDragging && canShowTooltip && (\n <div className=\"fw-seek-tooltip\" style={{ left: `${hoverPosition}%` }}>\n {isLive ? formatLiveTime(hoverTime, effectiveLiveEdge) : formatTime(hoverTime)}\n </div>\n )}\n </div>\n );\n};\n\nexport default SeekBar;\n"],"names":["SeekBar","_ref","currentTime","duration","buffered","_ref$disabled","disabled","onSeek","className","_ref$isLive","isLive","_ref$seekableStart","seekableStart","liveEdge","_ref$commitOnRelease","commitOnRelease","trackRef","useRef","_useState","useState","_useState2","_slicedToArray","isHovering","setIsHovering","_useState3","_useState4","isDragging","setIsDragging","_useState5","_useState6","dragTime","setDragTime","dragTimeRef","_useState7","_useState8","hoverPosition","setHoverPosition","_useState9","_useState0","hoverTime","setHoverTime","effectiveLiveEdge","seekableWindow","displayTime","progressPercent","useMemo","positionInWindow","Math","min","max","Number","isFinite","bufferedSegments","length","rangeEnd","rangeStart","rangeSize","segments","i","start","end","relativeStart","relativeEnd","push","startPercent","endPercent","formatTime","useCallback","seconds","total","floor","hours","minutes","secs","concat","String","padStart","formatLiveTime","edge","behindSeconds","getTimeFromPosition","clientX","current","rect","getBoundingClientRect","x","left","percent","width","undefined","window","handleMouseMove","e","handleClick","time","handleMouseDown","preventDefault","handleDragMove","moveEvent","handleDragEnd","document","removeEventListener","pending","addEventListener","showThumb","canShowTooltip","_jsxs","ref","cn","onMouseEnter","onMouseLeave","onMouseMove","onClick","onMouseDown","role","tabIndex","children","map","segment","index","_jsx","style"],"mappings":"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"}