@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":"LoadingScreen.js","sources":["../../../../src/components/LoadingScreen.tsx"],"sourcesContent":["import React, { useRef, useEffect, useState } from \"react\";\nimport DvdLogo from \"./DvdLogo\";\nimport logomarkAsset from \"../assets/logomark.svg\";\n\ninterface AnimatedBubbleProps {\n index: number;\n}\n\nconst AnimatedBubble: React.FC<AnimatedBubbleProps> = ({ index }) => {\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const [size, setSize] = useState(40);\n const [opacity, setOpacity] = useState(0);\n\n const getRandomPosition = () => ({\n top: Math.random() * 80 + 10, // 10% to 90%\n left: Math.random() * 80 + 10, // 10% to 90%\n });\n\n const getRandomSize = () => Math.random() * 60 + 30; // 30px to 90px\n\n useEffect(() => {\n // Initial random position and size\n setPosition(getRandomPosition());\n setSize(getRandomSize());\n\n const animationCycle = () => {\n // Fade in\n setOpacity(0.15);\n\n setTimeout(\n () => {\n // Fade out\n setOpacity(0);\n\n setTimeout(() => {\n // Move to new random position with new size while invisible\n setPosition(getRandomPosition());\n setSize(getRandomSize());\n // Start next cycle after a brief delay to ensure position change is complete\n setTimeout(() => {\n animationCycle();\n }, 200);\n }, 1500); // Wait for fade out to complete\n },\n 4000 + Math.random() * 3000\n ); // Stay visible for 4-7 seconds (was 2-4)\n };\n\n // Start the animation cycle with staggered timing\n const timeout = setTimeout(animationCycle, index * 500);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [index]);\n\n // Tokyo Night inspired pastel colors\n const bubbleColors = [\n \"rgba(122, 162, 247, 0.2)\", // Terminal Blue\n \"rgba(187, 154, 247, 0.2)\", // Terminal Magenta\n \"rgba(158, 206, 106, 0.2)\", // Strings/CSS classes\n \"rgba(115, 218, 202, 0.2)\", // Terminal Green\n \"rgba(125, 207, 255, 0.2)\", // Terminal Cyan\n \"rgba(247, 118, 142, 0.2)\", // Keywords/Terminal Red\n \"rgba(224, 175, 104, 0.2)\", // Terminal Yellow\n \"rgba(42, 195, 222, 0.2)\", // Language functions\n ];\n\n return (\n <div\n style={\n {\n position: \"absolute\",\n top: `${position.top}%`,\n left: `${position.left}%`,\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: \"50%\",\n background: bubbleColors[index % bubbleColors.length],\n opacity: opacity,\n transition: \"opacity 1s ease-in-out\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n MozUserSelect: \"none\",\n msUserSelect: \"none\",\n } as React.CSSProperties\n }\n />\n );\n};\n\ninterface CenterLogoProps {\n containerRef: React.RefObject<HTMLDivElement>;\n scale?: number;\n onHitmarker?: (e: { clientX: number; clientY: number }) => void;\n}\n\nconst CenterLogo: React.FC<CenterLogoProps> = ({ containerRef, scale = 0.2, onHitmarker }) => {\n const [logoSize, setLogoSize] = useState(100);\n const [offset, setOffset] = useState({ x: 0, y: 0 });\n const [isHovered, setIsHovered] = useState(false);\n\n useEffect(() => {\n if (containerRef.current) {\n const containerWidth = containerRef.current.clientWidth;\n const containerHeight = containerRef.current.clientHeight;\n const minDimension = Math.min(containerWidth, containerHeight);\n setLogoSize(minDimension * scale);\n }\n }, [containerRef, scale]);\n\n const handleLogoClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // Prevent event bubbling to container\n if (onHitmarker) {\n // Get the exact click position on the logo\n onHitmarker({ clientX: e.clientX, clientY: e.clientY });\n }\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n const mouseX = e.clientX;\n const mouseY = e.clientY;\n\n // Calculate distance from center\n const deltaX = mouseX - centerX;\n const deltaY = mouseY - centerY;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n // If mouse is close to logo, move it away\n const maxDistance = logoSize * 1.5; // Detection radius\n if (distance < maxDistance && distance > 0) {\n const pushStrength = (maxDistance - distance) / maxDistance;\n const pushDistance = 50 * pushStrength; // Max push distance\n\n // Normalize direction and apply push\n const pushX = -(deltaX / distance) * pushDistance;\n const pushY = -(deltaY / distance) * pushDistance;\n\n setOffset({ x: pushX, y: pushY });\n setIsHovered(true);\n } else {\n setOffset({ x: 0, y: 0 });\n setIsHovered(false);\n }\n };\n\n const handleMouseLeave = () => {\n setOffset({ x: 0, y: 0 });\n setIsHovered(false);\n };\n\n useEffect(() => {\n if (containerRef.current) {\n const container = containerRef.current;\n container.addEventListener(\"mousemove\", handleMouseMove);\n container.addEventListener(\"mouseleave\", handleMouseLeave);\n\n return () => {\n container.removeEventListener(\"mousemove\", handleMouseMove);\n container.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n }\n }, [logoSize, containerRef]);\n\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: `translate(-50%, -50%) translate(${offset.x}px, ${offset.y}px)`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 10,\n transition: \"transform 0.3s ease-out\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n MozUserSelect: \"none\",\n msUserSelect: \"none\",\n }}\n >\n {/* Pulsing circle background */}\n <div\n style={{\n position: \"absolute\",\n width: `${logoSize * 1.4}px`,\n height: `${logoSize * 1.4}px`,\n borderRadius: \"50%\",\n background: \"rgba(122, 162, 247, 0.15)\",\n animation: isHovered\n ? \"logoPulse 1s ease-in-out infinite\"\n : \"logoPulse 3s ease-in-out infinite\",\n transform: isHovered ? \"scale(1.2)\" : \"scale(1)\",\n transition: \"transform 0.3s ease-out\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n MozUserSelect: \"none\",\n msUserSelect: \"none\",\n pointerEvents: \"none\",\n }}\n />\n\n {/* Logo - only the SVG is clickable */}\n <img\n src={logomarkAsset}\n alt=\"FrameWorks Logo\"\n onClick={handleLogoClick}\n style={\n {\n width: `${logoSize}px`,\n height: `${logoSize}px`,\n position: \"relative\",\n zIndex: 1,\n filter: isHovered\n ? \"drop-shadow(0 6px 12px rgba(36, 40, 59, 0.4)) brightness(1.1)\"\n : \"drop-shadow(0 4px 8px rgba(36, 40, 59, 0.3))\",\n transform: isHovered ? \"scale(1.1)\" : \"scale(1)\",\n transition: \"all 0.3s ease-out\",\n cursor: isHovered ? \"pointer\" : \"default\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n MozUserSelect: \"none\",\n msUserSelect: \"none\",\n WebkitUserDrag: \"none\",\n WebkitTouchCallout: \"none\",\n } as React.CSSProperties\n }\n />\n </div>\n );\n};\n\ninterface LoadingScreenProps {\n message?: string;\n}\n\ninterface Hitmarker {\n id: number;\n x: number;\n y: number;\n}\n\nconst LoadingScreen: React.FC<LoadingScreenProps> = ({ message = \"Waiting for source...\" }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hitmarkers, setHitmarkers] = useState<Hitmarker[]>([]);\n\n const playHitmarkerSound = () => {\n try {\n // Embedded hitmarker sound as base64 data URL\n const hitmarkerDataUrl =\n \"data:audio/mpeg;base64,SUQzBAAAAAAANFRDT04AAAAHAAADT3RoZXIAVFNTRQAAAA8AAANMYXZmNTcuODMuMTAwAAAAAAAAAAAA\" +\n \"AAD/+1QAAAAAAAAAAAAAAAAAAAAA\" +\n \"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\" +\n \"qqqqqqqqqqqqqqqqqqqqqqqqqqo=\";\n\n const audio = new Audio(hitmarkerDataUrl);\n audio.volume = 0.3;\n audio.play().catch(() => {\n // Fallback to synthetic sound if data URL fails\n createSyntheticHitmarkerSound();\n });\n } catch {\n // Fallback to synthetic sound\n createSyntheticHitmarkerSound();\n }\n };\n\n const createSyntheticHitmarkerSound = () => {\n try {\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n\n // Create a more realistic hitmarker sound with noise and metallic ring\n const oscillator1 = audioContext.createOscillator();\n const oscillator2 = audioContext.createOscillator();\n const noiseBuffer = audioContext.createBuffer(\n 1,\n audioContext.sampleRate * 0.1,\n audioContext.sampleRate\n );\n const noiseSource = audioContext.createBufferSource();\n\n // Generate white noise for the initial \"crack\"\n const noiseData = noiseBuffer.getChannelData(0);\n for (let i = 0; i < noiseData.length; i++) {\n noiseData[i] = Math.random() * 2 - 1;\n }\n noiseSource.buffer = noiseBuffer;\n\n const gainNode1 = audioContext.createGain();\n const gainNode2 = audioContext.createGain();\n const noiseGain = audioContext.createGain();\n const masterGain = audioContext.createGain();\n\n // Connect everything\n oscillator1.connect(gainNode1);\n oscillator2.connect(gainNode2);\n noiseSource.connect(noiseGain);\n\n gainNode1.connect(masterGain);\n gainNode2.connect(masterGain);\n noiseGain.connect(masterGain);\n masterGain.connect(audioContext.destination);\n\n // Sharp metallic frequencies\n oscillator1.frequency.setValueAtTime(1800, audioContext.currentTime);\n oscillator1.frequency.exponentialRampToValueAtTime(900, audioContext.currentTime + 0.08);\n\n oscillator2.frequency.setValueAtTime(3600, audioContext.currentTime);\n oscillator2.frequency.exponentialRampToValueAtTime(1800, audioContext.currentTime + 0.04);\n\n oscillator1.type = \"triangle\";\n oscillator2.type = \"sine\";\n\n // Sharp attack, quick decay\n gainNode1.gain.setValueAtTime(0, audioContext.currentTime);\n gainNode1.gain.linearRampToValueAtTime(0.4, audioContext.currentTime + 0.002);\n gainNode1.gain.exponentialRampToValueAtTime(0.001, audioContext.currentTime + 0.12);\n\n gainNode2.gain.setValueAtTime(0, audioContext.currentTime);\n gainNode2.gain.linearRampToValueAtTime(0.3, audioContext.currentTime + 0.001);\n gainNode2.gain.exponentialRampToValueAtTime(0.001, audioContext.currentTime + 0.06);\n\n // Noise burst for the initial crack\n noiseGain.gain.setValueAtTime(0, audioContext.currentTime);\n noiseGain.gain.linearRampToValueAtTime(0.2, audioContext.currentTime + 0.001);\n noiseGain.gain.exponentialRampToValueAtTime(0.001, audioContext.currentTime + 0.01);\n\n masterGain.gain.setValueAtTime(0.5, audioContext.currentTime);\n\n const startTime = audioContext.currentTime;\n const stopTime = startTime + 0.15;\n\n oscillator1.start(startTime);\n oscillator2.start(startTime);\n noiseSource.start(startTime);\n\n oscillator1.stop(stopTime);\n oscillator2.stop(stopTime);\n noiseSource.stop(startTime + 0.02);\n } catch {\n console.log(\"Audio context not available\");\n }\n };\n\n const createHitmarker = (e: { clientX: number; clientY: number }) => {\n if (!containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n const newHitmarker: Hitmarker = {\n id: Date.now() + Math.random(),\n x,\n y,\n };\n\n setHitmarkers((prev) => [...prev, newHitmarker]);\n\n // Play sound\n playHitmarkerSound();\n\n // Remove hitmarker after animation\n setTimeout(() => {\n setHitmarkers((prev) => prev.filter((h) => h.id !== newHitmarker.id));\n }, 600);\n };\n\n // Inject CSS animations\n useEffect(() => {\n const styleId = \"loading-screen-animations\";\n if (!document.getElementById(styleId)) {\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = `\n @keyframes fadeInOut {\n 0%, 100% {\n opacity: 0.6;\n }\n 50% {\n opacity: 0.9;\n }\n }\n\n @keyframes logoPulse {\n 0%, 100% {\n opacity: 0.15;\n transform: scale(1);\n }\n 50% {\n opacity: 0.25;\n transform: scale(1.05);\n }\n }\n\n @keyframes shimmer {\n 0% {\n background-position: -200px 0;\n }\n 100% {\n background-position: calc(200px + 100%) 0;\n }\n }\n\n @keyframes floatUp {\n 0% {\n transform: translateY(100vh) rotate(0deg);\n opacity: 0;\n }\n 10% {\n opacity: 0.6;\n }\n 90% {\n opacity: 0.6;\n }\n 100% {\n transform: translateY(-100px) rotate(360deg);\n opacity: 0;\n }\n }\n\n @keyframes gradientShift {\n 0%, 100% {\n background-position: 0% 50%;\n }\n 50% {\n background-position: 100% 50%;\n }\n }\n\n @keyframes hitmarkerFade {\n 0% {\n opacity: 1;\n transform: scale(0.5);\n }\n 20% {\n opacity: 1;\n transform: scale(1.2);\n }\n 100% {\n opacity: 0;\n transform: scale(1);\n }\n }\n\n @keyframes hitmarkerFade45 {\n 0% {\n opacity: 1;\n transform: translate(-50%, -50%) rotate(45deg) scale(0.5);\n }\n 20% {\n opacity: 1;\n transform: translate(-50%, -50%) rotate(45deg) scale(1.2);\n }\n 100% {\n opacity: 0;\n transform: translate(-50%, -50%) rotate(45deg) scale(1);\n }\n }\n\n @keyframes hitmarkerFadeNeg45 {\n 0% {\n opacity: 1;\n transform: translate(-50%, -50%) rotate(-45deg) scale(0.5);\n }\n 20% {\n opacity: 1;\n transform: translate(-50%, -50%) rotate(-45deg) scale(1.2);\n }\n 100% {\n opacity: 0;\n transform: translate(-50%, -50%) rotate(-45deg) scale(1);\n }\n }\n `;\n document.head.appendChild(style);\n }\n }, []);\n\n return (\n <div\n ref={containerRef}\n className=\"fw-player-root\"\n style={\n {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"300px\",\n background: `\n linear-gradient(135deg,\n hsl(var(--tn-bg-dark, 235 21% 11%)) 0%,\n hsl(var(--tn-bg, 233 23% 17%)) 25%,\n hsl(var(--tn-bg-dark, 235 21% 11%)) 50%,\n hsl(var(--tn-bg, 233 23% 17%)) 75%,\n hsl(var(--tn-bg-dark, 235 21% 11%)) 100%\n )\n `,\n backgroundSize: \"400% 400%\",\n animation: \"gradientShift 16s ease-in-out infinite\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n borderRadius: \"0\" /* Slab - no rounded corners */,\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n MozUserSelect: \"none\",\n msUserSelect: \"none\",\n } as React.CSSProperties\n }\n >\n {/* Hitmarkers */}\n {hitmarkers.map((hitmarker) => (\n <div\n key={hitmarker.id}\n style={{\n position: \"absolute\",\n left: `${hitmarker.x}px`,\n top: `${hitmarker.y}px`,\n transform: \"translate(-50%, -50%)\",\n pointerEvents: \"none\",\n zIndex: 100,\n width: \"40px\",\n height: \"40px\",\n }}\n >\n {/* Top-left diagonal line */}\n <div\n style={{\n position: \"absolute\",\n top: \"25%\",\n left: \"25%\",\n width: \"12px\",\n height: \"3px\",\n backgroundColor: \"#ffffff\",\n transform: \"translate(-50%, -50%) rotate(45deg)\",\n animation: \"hitmarkerFade45 0.6s ease-out forwards\",\n boxShadow: \"0 0 8px rgba(255, 255, 255, 0.8)\",\n borderRadius: \"1px\",\n }}\n />\n {/* Top-right diagonal line */}\n <div\n style={{\n position: \"absolute\",\n top: \"25%\",\n left: \"75%\",\n width: \"12px\",\n height: \"3px\",\n backgroundColor: \"#ffffff\",\n transform: \"translate(-50%, -50%) rotate(-45deg)\",\n animation: \"hitmarkerFadeNeg45 0.6s ease-out forwards\",\n boxShadow: \"0 0 8px rgba(255, 255, 255, 0.8)\",\n borderRadius: \"1px\",\n }}\n />\n {/* Bottom-left diagonal line */}\n <div\n style={{\n position: \"absolute\",\n top: \"75%\",\n left: \"25%\",\n width: \"12px\",\n height: \"3px\",\n backgroundColor: \"#ffffff\",\n transform: \"translate(-50%, -50%) rotate(-45deg)\",\n animation: \"hitmarkerFadeNeg45 0.6s ease-out forwards\",\n boxShadow: \"0 0 8px rgba(255, 255, 255, 0.8)\",\n borderRadius: \"1px\",\n }}\n />\n {/* Bottom-right diagonal line */}\n <div\n style={{\n position: \"absolute\",\n top: \"75%\",\n left: \"75%\",\n width: \"12px\",\n height: \"3px\",\n backgroundColor: \"#ffffff\",\n transform: \"translate(-50%, -50%) rotate(45deg)\",\n animation: \"hitmarkerFade45 0.6s ease-out forwards\",\n boxShadow: \"0 0 8px rgba(255, 255, 255, 0.8)\",\n borderRadius: \"1px\",\n }}\n />\n </div>\n ))}\n\n {/* Floating particles */}\n {[...Array(12)].map((_, index) => (\n <div\n key={`particle-${index}`}\n style={{\n position: \"absolute\",\n left: `${Math.random() * 100}%`,\n width: `${Math.random() * 4 + 2}px`,\n height: `${Math.random() * 4 + 2}px`,\n borderRadius: \"50%\",\n background: [\n \"#7aa2f7\", // Terminal Blue\n \"#bb9af7\", // Terminal Magenta\n \"#9ece6a\", // Strings/CSS classes\n \"#73daca\", // Terminal Green\n \"#7dcfff\", // Terminal Cyan\n \"#f7768e\", // Keywords/Terminal Red\n \"#e0af68\", // Terminal Yellow\n \"#2ac3de\", // Language functions\n ][index % 8],\n opacity: 0,\n animation: `floatUp ${8 + Math.random() * 4}s linear infinite`,\n animationDelay: `${Math.random() * 8}s`,\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n />\n ))}\n\n {/* Animated bubbles with Tokyo Night colors */}\n {[...Array(8)].map((_, index) => (\n <AnimatedBubble key={index} index={index} />\n ))}\n\n {/* Center logo */}\n <CenterLogo\n containerRef={containerRef as React.RefObject<HTMLDivElement>}\n onHitmarker={createHitmarker}\n />\n\n {/* Bouncing DVD Logo */}\n <DvdLogo parentRef={containerRef as React.RefObject<HTMLDivElement>} scale={0.08} />\n\n {/* Message */}\n <div\n style={{\n position: \"absolute\",\n bottom: \"20%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n color: \"#a9b1d6\",\n fontSize: \"16px\",\n fontWeight: \"500\",\n textAlign: \"center\",\n animation: \"fadeInOut 2s ease-in-out infinite\",\n textShadow: \"0 2px 4px rgba(36, 40, 59, 0.5)\",\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n MozUserSelect: \"none\",\n msUserSelect: \"none\",\n pointerEvents: \"none\",\n }}\n >\n {message}\n </div>\n\n {/* Subtle overlay texture */}\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: `\n radial-gradient(circle at 20% 80%, rgba(122, 162, 247, 0.03) 0%, transparent 50%),\n radial-gradient(circle at 80% 20%, rgba(187, 154, 247, 0.03) 0%, transparent 50%),\n radial-gradient(circle at 40% 40%, rgba(158, 206, 106, 0.02) 0%, transparent 50%)\n `,\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n />\n </div>\n );\n};\n\nexport default LoadingScreen;\n"],"names":["AnimatedBubble","_ref","index","_useState","useState","top","left","_useState2","_slicedToArray","position","setPosition","_useState3","_useState4","size","setSize","_useState5","_useState6","opacity","setOpacity","getRandomPosition","Math","random","getRandomSize","useEffect","animationCycle","setTimeout","timeout","clearTimeout","bubbleColors","_jsx","style","concat","width","height","borderRadius","background","length","transition","pointerEvents","userSelect","WebkitUserSelect","MozUserSelect","msUserSelect","CenterLogo","_ref2","containerRef","_ref2$scale","scale","onHitmarker","_useState7","_useState8","logoSize","setLogoSize","_useState9","x","y","_useState0","offset","setOffset","_useState1","_useState10","isHovered","setIsHovered","current","containerWidth","clientWidth","containerHeight","clientHeight","minDimension","min","handleLogoClick","e","stopPropagation","clientX","clientY","handleMouseMove","rect","getBoundingClientRect","centerX","centerY","mouseX","mouseY","deltaX","deltaY","distance","sqrt","maxDistance","pushStrength","pushDistance","pushX","pushY","handleMouseLeave","container","addEventListener","removeEventListener","_jsxs","transform","display","alignItems","justifyContent","zIndex","children","animation","src","logomarkAsset","alt","onClick","filter","cursor","WebkitUserDrag","WebkitTouchCallout","LoadingScreen","_ref3","_ref3$message","message","useRef","_useState11","_useState12","hitmarkers","setHitmarkers","playHitmarkerSound","hitmarkerDataUrl","audio","Audio","volume","play","createSyntheticHitmarkerSound","_unused","audioContext","window","AudioContext","webkitAudioContext","oscillator1","createOscillator","oscillator2","noiseBuffer","createBuffer","sampleRate","noiseSource","createBufferSource","noiseData","getChannelData","i","buffer","gainNode1","createGain","gainNode2","noiseGain","masterGain","connect","destination","frequency","setValueAtTime","currentTime","exponentialRampToValueAtTime","type","gain","linearRampToValueAtTime","startTime","stopTime","start","stop","_unused2","console","log","createHitmarker","newHitmarker","id","Date","now","prev","_toConsumableArray","h","styleId","document","getElementById","createElement","textContent","head","appendChild","ref","className","minHeight","backgroundSize","flexDirection","overflow","map","hitmarker","backgroundColor","boxShadow","Array","_","animationDelay","DvdLogo","parentRef","bottom","color","fontSize","fontWeight","textAlign","textShadow","fontFamily","right"],"mappings":"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"}
@@ -0,0 +1,420 @@
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 IdleScreen = require('./IdleScreen.js');
9
+ var TitleOverlay = require('./TitleOverlay.js');
10
+ var StatsPanel = require('./StatsPanel.js');
11
+ var PlayerControls = require('./PlayerControls.js');
12
+ var DevModePanel = require('./DevModePanel.js');
13
+ var SpeedIndicator = require('./SpeedIndicator.js');
14
+ var SkipIndicator = require('./SkipIndicator.js');
15
+ var Icons = require('./Icons.js');
16
+ var usePlayerController = require('../hooks/usePlayerController.js');
17
+ var playerCore = require('@livepeer-frameworks/player-core');
18
+ var contextMenu = require('../ui/context-menu.js');
19
+
20
+ /**
21
+ * Inner player component that uses PlayerController via hook
22
+ */
23
+ var PlayerInner = function PlayerInner(_ref) {
24
+ var _state$endpoints, _state$currentPlayerI, _state$endpoints2, _state$metadata, _state$metadata2, _state$streamState, _state$streamState2, _state$streamState3, _state$streamState4, _state$streamState5, _state$currentSourceI, _state$streamState6;
25
+ var contentId = _ref.contentId,
26
+ contentType = _ref.contentType,
27
+ _ref$thumbnailUrl = _ref.thumbnailUrl,
28
+ thumbnailUrl = _ref$thumbnailUrl === void 0 ? null : _ref$thumbnailUrl,
29
+ options = _ref.options,
30
+ propsEndpoints = _ref.endpoints,
31
+ _onStateChange = _ref.onStateChange;
32
+ // ============================================================================
33
+ // UI-only State (stays in wrapper)
34
+ // ============================================================================
35
+ var _useState = React.useState(false),
36
+ _useState2 = _rollupPluginBabelHelpers.slicedToArray(_useState, 2),
37
+ isStatsOpen = _useState2[0],
38
+ setIsStatsOpen = _useState2[1];
39
+ var _useState3 = React.useState(false),
40
+ _useState4 = _rollupPluginBabelHelpers.slicedToArray(_useState3, 2),
41
+ isDevPanelOpen = _useState4[0],
42
+ setIsDevPanelOpen = _useState4[1];
43
+ var _useState5 = React.useState(null),
44
+ _useState6 = _rollupPluginBabelHelpers.slicedToArray(_useState5, 2),
45
+ skipDirection = _useState6[0],
46
+ setSkipDirection = _useState6[1];
47
+ // Playback mode preference (persistent)
48
+ var _useState7 = React.useState((options === null || options === void 0 ? void 0 : options.playbackMode) || "auto"),
49
+ _useState8 = _rollupPluginBabelHelpers.slicedToArray(_useState7, 2),
50
+ devPlaybackMode = _useState8[0],
51
+ setDevPlaybackMode = _useState8[1];
52
+ // ============================================================================
53
+ // PlayerController Hook - ALL business logic
54
+ // ============================================================================
55
+ var _usePlayerController = usePlayerController.usePlayerController({
56
+ contentId: contentId,
57
+ contentType: contentType,
58
+ endpoints: propsEndpoints,
59
+ gatewayUrl: options === null || options === void 0 ? void 0 : options.gatewayUrl,
60
+ mistUrl: options === null || options === void 0 ? void 0 : options.mistUrl,
61
+ authToken: options === null || options === void 0 ? void 0 : options.authToken,
62
+ autoplay: (options === null || options === void 0 ? void 0 : options.autoplay) !== false,
63
+ muted: (options === null || options === void 0 ? void 0 : options.muted) !== false,
64
+ controls: (options === null || options === void 0 ? void 0 : options.stockControls) === true,
65
+ poster: thumbnailUrl || undefined,
66
+ debug: options === null || options === void 0 ? void 0 : options.debug,
67
+ onStateChange: function onStateChange(playerState) {
68
+ _onStateChange === null || _onStateChange === void 0 || _onStateChange(playerState);
69
+ },
70
+ onError: function onError(error) {
71
+ console.warn("[Player] Error:", error);
72
+ }
73
+ }),
74
+ containerRef = _usePlayerController.containerRef,
75
+ state = _usePlayerController.state,
76
+ controller = _usePlayerController.controller,
77
+ togglePlay = _usePlayerController.togglePlay,
78
+ toggleMute = _usePlayerController.toggleMute,
79
+ toggleLoop = _usePlayerController.toggleLoop,
80
+ toggleFullscreen = _usePlayerController.toggleFullscreen,
81
+ togglePiP = _usePlayerController.togglePiP,
82
+ setVolume = _usePlayerController.setVolume,
83
+ selectQuality = _usePlayerController.selectQuality,
84
+ clearError = _usePlayerController.clearError,
85
+ dismissToast = _usePlayerController.dismissToast,
86
+ retry = _usePlayerController.retry,
87
+ reload = _usePlayerController.reload,
88
+ jumpToLive = _usePlayerController.jumpToLive,
89
+ handleMouseEnter = _usePlayerController.handleMouseEnter,
90
+ handleMouseLeave = _usePlayerController.handleMouseLeave,
91
+ handleMouseMove = _usePlayerController.handleMouseMove,
92
+ setDevModeOptions = _usePlayerController.setDevModeOptions;
93
+ // ============================================================================
94
+ // Dev Mode Callbacks
95
+ // ============================================================================
96
+ var handleDevSettingsChange = React.useCallback(function (settings) {
97
+ // One-shot selection - controller handles the state
98
+ setDevModeOptions({
99
+ forcePlayer: settings.forcePlayer,
100
+ forceType: settings.forceType,
101
+ forceSource: settings.forceSource
102
+ });
103
+ }, [setDevModeOptions]);
104
+ var handleModeChange = React.useCallback(function (mode) {
105
+ setDevPlaybackMode(mode);
106
+ // Mode is a persistent preference
107
+ setDevModeOptions({
108
+ playbackMode: mode
109
+ });
110
+ }, [setDevModeOptions]);
111
+ var handleReload = React.useCallback(function () {
112
+ clearError();
113
+ reload();
114
+ }, [clearError, reload]);
115
+ var handleStatsToggle = React.useCallback(function () {
116
+ setIsStatsOpen(function (prev) {
117
+ return !prev;
118
+ });
119
+ }, []);
120
+ // Clear skip indicator after animation
121
+ var handleSkipIndicatorHide = React.useCallback(function () {
122
+ setSkipDirection(null);
123
+ }, []);
124
+ // Auto-dismiss toast after 3 seconds
125
+ React.useEffect(function () {
126
+ if (!state.toast) return;
127
+ var timer = setTimeout(function () {
128
+ dismissToast();
129
+ }, 3000);
130
+ return function () {
131
+ return clearTimeout(timer);
132
+ };
133
+ }, [state.toast, dismissToast]);
134
+ // ============================================================================
135
+ // Derived Values
136
+ // ============================================================================
137
+ var primaryEndpoint = (_state$endpoints = state.endpoints) === null || _state$endpoints === void 0 ? void 0 : _state$endpoints.primary;
138
+ var isLegacyPlayer = ((_state$currentPlayerI = state.currentPlayerInfo) === null || _state$currentPlayerI === void 0 ? void 0 : _state$currentPlayerI.shortname) === "mist-legacy";
139
+ var useStockControls = (options === null || options === void 0 ? void 0 : options.stockControls) === true || isLegacyPlayer;
140
+ // Title overlay visibility: show on hover or when paused
141
+ var showTitleOverlay = (state.isHovering || state.isPaused) && !state.shouldShowIdleScreen && !state.isBuffering && !state.error;
142
+ // Buffering spinner: only during active playback
143
+ var showBufferingSpinner = !state.shouldShowIdleScreen && state.isBuffering && !state.error && state.hasPlaybackStarted;
144
+ // ============================================================================
145
+ // Waiting for Endpoint (shown as overlay, not early return)
146
+ // ============================================================================
147
+ var showWaitingForEndpoint = !((_state$endpoints2 = state.endpoints) !== null && _state$endpoints2 !== void 0 && _state$endpoints2.primary) && state.state !== "booting";
148
+ var waitingMessage = options !== null && options !== void 0 && options.gatewayUrl ? state.state === "gateway_loading" ? "Resolving viewing endpoint..." : "Waiting for endpoint..." : "Waiting for endpoint...";
149
+ // ============================================================================
150
+ // Render
151
+ // ============================================================================
152
+ return jsxRuntime.jsxs(contextMenu.ContextMenu, {
153
+ children: [jsxRuntime.jsx(contextMenu.ContextMenuTrigger, {
154
+ asChild: true,
155
+ children: jsxRuntime.jsxs("div", {
156
+ className: playerCore.cn("fw-player-surface fw-player-root w-full h-full overflow-hidden", (options === null || options === void 0 ? void 0 : options.devMode) && "flex"),
157
+ "data-player-container": "true",
158
+ tabIndex: 0,
159
+ onMouseEnter: handleMouseEnter,
160
+ onMouseLeave: handleMouseLeave,
161
+ onMouseMove: handleMouseMove,
162
+ children: [jsxRuntime.jsxs("div", {
163
+ className: playerCore.cn("relative", options !== null && options !== void 0 && options.devMode ? "flex-1 min-w-0" : "w-full h-full"),
164
+ children: [jsxRuntime.jsx("div", {
165
+ ref: containerRef,
166
+ className: "fw-player-container"
167
+ }), jsxRuntime.jsx(TitleOverlay.default, {
168
+ title: (_state$metadata = state.metadata) === null || _state$metadata === void 0 ? void 0 : _state$metadata.title,
169
+ description: (_state$metadata2 = state.metadata) === null || _state$metadata2 === void 0 ? void 0 : _state$metadata2.description,
170
+ isVisible: showTitleOverlay
171
+ }), jsxRuntime.jsx(StatsPanel.default, {
172
+ isOpen: isStatsOpen,
173
+ onClose: handleStatsToggle,
174
+ metadata: state.metadata,
175
+ streamState: state.streamState,
176
+ quality: state.playbackQuality,
177
+ videoElement: state.videoElement,
178
+ protocol: primaryEndpoint === null || primaryEndpoint === void 0 ? void 0 : primaryEndpoint.protocol,
179
+ nodeId: primaryEndpoint === null || primaryEndpoint === void 0 ? void 0 : primaryEndpoint.nodeId,
180
+ geoDistance: primaryEndpoint === null || primaryEndpoint === void 0 ? void 0 : primaryEndpoint.geoDistance
181
+ }), (options === null || options === void 0 ? void 0 : options.devMode) && !isDevPanelOpen && jsxRuntime.jsx(DevModePanel.default, {
182
+ onSettingsChange: handleDevSettingsChange,
183
+ playbackMode: devPlaybackMode,
184
+ onModeChange: handleModeChange,
185
+ onReload: handleReload,
186
+ streamInfo: state.streamInfo,
187
+ mistStreamInfo: (_state$streamState = state.streamState) === null || _state$streamState === void 0 ? void 0 : _state$streamState.streamInfo,
188
+ currentPlayer: state.currentPlayerInfo,
189
+ currentSource: state.currentSourceInfo,
190
+ videoElement: state.videoElement,
191
+ protocol: primaryEndpoint === null || primaryEndpoint === void 0 ? void 0 : primaryEndpoint.protocol,
192
+ nodeId: primaryEndpoint === null || primaryEndpoint === void 0 ? void 0 : primaryEndpoint.nodeId,
193
+ isVisible: false,
194
+ isOpen: false,
195
+ onOpenChange: setIsDevPanelOpen
196
+ }), state.isHoldingSpeed && jsxRuntime.jsx(SpeedIndicator.default, {
197
+ isVisible: true,
198
+ speed: state.holdSpeed
199
+ }), jsxRuntime.jsx(SkipIndicator.default, {
200
+ direction: skipDirection,
201
+ seconds: 10,
202
+ onHide: handleSkipIndicatorHide
203
+ }), showWaitingForEndpoint && jsxRuntime.jsx(IdleScreen.IdleScreen, {
204
+ status: "OFFLINE",
205
+ message: waitingMessage
206
+ }), !showWaitingForEndpoint && state.shouldShowIdleScreen && jsxRuntime.jsx(IdleScreen.IdleScreen, {
207
+ status: state.isEffectivelyLive ? (_state$streamState2 = state.streamState) === null || _state$streamState2 === void 0 ? void 0 : _state$streamState2.status : undefined,
208
+ message: state.isEffectivelyLive ? (_state$streamState3 = state.streamState) === null || _state$streamState3 === void 0 ? void 0 : _state$streamState3.message : "Loading video...",
209
+ percentage: state.isEffectivelyLive ? (_state$streamState4 = state.streamState) === null || _state$streamState4 === void 0 ? void 0 : _state$streamState4.percentage : undefined
210
+ }), showBufferingSpinner && jsxRuntime.jsx("div", {
211
+ role: "status",
212
+ "aria-live": "polite",
213
+ className: "fw-player-surface absolute inset-0 flex items-center justify-center bg-black/40 backdrop-blur-sm z-20",
214
+ children: jsxRuntime.jsxs("div", {
215
+ className: "flex items-center gap-3 rounded-lg border border-white/10 bg-black/70 px-4 py-3 text-sm text-white shadow-lg",
216
+ children: [jsxRuntime.jsx("div", {
217
+ className: "w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin"
218
+ }), jsxRuntime.jsx("span", {
219
+ children: "Buffering..."
220
+ })]
221
+ })
222
+ }), !state.shouldShowIdleScreen && state.error && jsxRuntime.jsx("div", {
223
+ role: "alert",
224
+ "aria-live": "assertive",
225
+ className: playerCore.cn("fw-error-overlay", state.isPassiveError ? "fw-error-overlay--passive" : "fw-error-overlay--fullscreen"),
226
+ children: jsxRuntime.jsxs("div", {
227
+ className: playerCore.cn("fw-error-popup", state.isPassiveError ? "fw-error-popup--passive" : "fw-error-popup--fullscreen"),
228
+ children: [jsxRuntime.jsxs("div", {
229
+ className: playerCore.cn("fw-error-header", state.isPassiveError ? "fw-error-header--warning" : "fw-error-header--error"),
230
+ children: [jsxRuntime.jsx("span", {
231
+ className: playerCore.cn("fw-error-title", state.isPassiveError ? "fw-error-title--warning" : "fw-error-title--error"),
232
+ children: state.isPassiveError ? "Warning" : "Error"
233
+ }), jsxRuntime.jsx("button", {
234
+ type: "button",
235
+ className: "fw-error-close",
236
+ onClick: clearError,
237
+ "aria-label": "Dismiss",
238
+ children: jsxRuntime.jsx("svg", {
239
+ width: "12",
240
+ height: "12",
241
+ viewBox: "0 0 12 12",
242
+ fill: "none",
243
+ children: jsxRuntime.jsx("path", {
244
+ d: "M9 3L3 9M3 3L9 9",
245
+ stroke: "currentColor",
246
+ strokeWidth: "1.5",
247
+ strokeLinecap: "round"
248
+ })
249
+ })
250
+ })]
251
+ }), jsxRuntime.jsx("div", {
252
+ className: "fw-error-body",
253
+ children: jsxRuntime.jsx("p", {
254
+ className: "fw-error-message",
255
+ children: "Playback issue"
256
+ })
257
+ }), jsxRuntime.jsx("div", {
258
+ className: "fw-error-actions",
259
+ children: jsxRuntime.jsx("button", {
260
+ type: "button",
261
+ className: "fw-error-btn",
262
+ "aria-label": "Retry playback",
263
+ onClick: function onClick() {
264
+ clearError();
265
+ retry();
266
+ },
267
+ children: "Retry"
268
+ })
269
+ })]
270
+ })
271
+ }), state.toast && jsxRuntime.jsx("div", {
272
+ className: "absolute bottom-20 left-1/2 -translate-x-1/2 z-30 animate-in fade-in slide-in-from-bottom-2 duration-200",
273
+ role: "status",
274
+ "aria-live": "polite",
275
+ children: jsxRuntime.jsxs("div", {
276
+ className: "flex items-center gap-2 rounded-lg border border-white/10 bg-black/80 px-4 py-2 text-sm text-white shadow-lg backdrop-blur-sm",
277
+ children: [jsxRuntime.jsx("span", {
278
+ children: state.toast.message
279
+ }), jsxRuntime.jsx("button", {
280
+ type: "button",
281
+ onClick: dismissToast,
282
+ className: "ml-2 text-white/60 hover:text-white",
283
+ "aria-label": "Dismiss",
284
+ children: jsxRuntime.jsx("svg", {
285
+ width: "12",
286
+ height: "12",
287
+ viewBox: "0 0 12 12",
288
+ fill: "none",
289
+ children: jsxRuntime.jsx("path", {
290
+ d: "M9 3L3 9M3 3L9 9",
291
+ stroke: "currentColor",
292
+ strokeWidth: "1.5",
293
+ strokeLinecap: "round"
294
+ })
295
+ })
296
+ })]
297
+ })
298
+ }), !useStockControls && jsxRuntime.jsx(PlayerControls.default, {
299
+ currentTime: state.currentTime,
300
+ duration: state.duration,
301
+ isVisible: state.shouldShowControls,
302
+ onSeek: function onSeek(t) {
303
+ return controller === null || controller === void 0 ? void 0 : controller.seek(t);
304
+ },
305
+ showStatsButton: false,
306
+ isStatsOpen: isStatsOpen,
307
+ onStatsToggle: handleStatsToggle,
308
+ mistStreamInfo: (_state$streamState5 = state.streamState) === null || _state$streamState5 === void 0 ? void 0 : _state$streamState5.streamInfo,
309
+ disabled: !state.videoElement,
310
+ playbackMode: devPlaybackMode,
311
+ onModeChange: handleModeChange,
312
+ sourceType: (_state$currentSourceI = state.currentSourceInfo) === null || _state$currentSourceI === void 0 ? void 0 : _state$currentSourceI.type,
313
+ isContentLive: state.isEffectivelyLive,
314
+ // Props from usePlayerController hook
315
+ videoElement: state.videoElement,
316
+ qualities: state.qualities,
317
+ onSelectQuality: selectQuality,
318
+ isMuted: state.isMuted,
319
+ volume: state.volume,
320
+ onVolumeChange: setVolume,
321
+ onToggleMute: toggleMute,
322
+ isPlaying: state.isPlaying,
323
+ onTogglePlay: togglePlay,
324
+ onToggleFullscreen: toggleFullscreen,
325
+ isFullscreen: state.isFullscreen,
326
+ isLoopEnabled: state.isLoopEnabled,
327
+ onToggleLoop: toggleLoop,
328
+ onJumpToLive: jumpToLive
329
+ })]
330
+ }), (options === null || options === void 0 ? void 0 : options.devMode) && isDevPanelOpen && jsxRuntime.jsx(DevModePanel.default, {
331
+ onSettingsChange: handleDevSettingsChange,
332
+ playbackMode: devPlaybackMode,
333
+ onModeChange: handleModeChange,
334
+ onReload: handleReload,
335
+ streamInfo: state.streamInfo,
336
+ mistStreamInfo: (_state$streamState6 = state.streamState) === null || _state$streamState6 === void 0 ? void 0 : _state$streamState6.streamInfo,
337
+ currentPlayer: state.currentPlayerInfo,
338
+ currentSource: state.currentSourceInfo,
339
+ videoElement: state.videoElement,
340
+ protocol: primaryEndpoint === null || primaryEndpoint === void 0 ? void 0 : primaryEndpoint.protocol,
341
+ nodeId: primaryEndpoint === null || primaryEndpoint === void 0 ? void 0 : primaryEndpoint.nodeId,
342
+ isVisible: true,
343
+ isOpen: true,
344
+ onOpenChange: setIsDevPanelOpen
345
+ })]
346
+ })
347
+ }), jsxRuntime.jsxs(contextMenu.ContextMenuContent, {
348
+ children: [jsxRuntime.jsxs(contextMenu.ContextMenuItem, {
349
+ onClick: handleStatsToggle,
350
+ className: "gap-2",
351
+ children: [jsxRuntime.jsx(Icons.StatsIcon, {
352
+ size: 14,
353
+ className: "opacity-70 flex-shrink-0"
354
+ }), jsxRuntime.jsx("span", {
355
+ children: isStatsOpen ? "Hide Stats" : "Stats"
356
+ })]
357
+ }), (options === null || options === void 0 ? void 0 : options.devMode) && jsxRuntime.jsxs(jsxRuntime.Fragment, {
358
+ children: [jsxRuntime.jsx(contextMenu.ContextMenuSeparator, {}), jsxRuntime.jsxs(contextMenu.ContextMenuItem, {
359
+ onClick: function onClick() {
360
+ return setIsDevPanelOpen(!isDevPanelOpen);
361
+ },
362
+ className: "gap-2",
363
+ children: [jsxRuntime.jsx(Icons.SettingsIcon, {
364
+ size: 14,
365
+ className: "opacity-70 flex-shrink-0"
366
+ }), jsxRuntime.jsx("span", {
367
+ children: isDevPanelOpen ? "Hide Settings" : "Settings"
368
+ })]
369
+ })]
370
+ }), jsxRuntime.jsx(contextMenu.ContextMenuSeparator, {}), jsxRuntime.jsxs(contextMenu.ContextMenuItem, {
371
+ onClick: togglePiP,
372
+ className: "gap-2",
373
+ children: [jsxRuntime.jsx(Icons.PictureInPictureIcon, {
374
+ size: 14,
375
+ className: "opacity-70 flex-shrink-0"
376
+ }), jsxRuntime.jsx("span", {
377
+ children: "Picture-in-Picture"
378
+ })]
379
+ }), jsxRuntime.jsxs(contextMenu.ContextMenuItem, {
380
+ onClick: toggleLoop,
381
+ className: "gap-2",
382
+ children: [jsxRuntime.jsxs("svg", {
383
+ width: "14",
384
+ height: "14",
385
+ viewBox: "0 0 24 24",
386
+ fill: "none",
387
+ stroke: "currentColor",
388
+ strokeWidth: "2",
389
+ strokeLinecap: "round",
390
+ strokeLinejoin: "round",
391
+ className: "opacity-70 flex-shrink-0",
392
+ children: [jsxRuntime.jsx("polyline", {
393
+ points: "17 1 21 5 17 9"
394
+ }), jsxRuntime.jsx("path", {
395
+ d: "M3 11V9a4 4 0 0 1 4-4h14"
396
+ }), jsxRuntime.jsx("polyline", {
397
+ points: "7 23 3 19 7 15"
398
+ }), jsxRuntime.jsx("path", {
399
+ d: "M21 13v2a4 4 0 0 1-4 4H3"
400
+ })]
401
+ }), jsxRuntime.jsx("span", {
402
+ children: state.isLoopEnabled ? "Disable Loop" : "Enable Loop"
403
+ })]
404
+ })]
405
+ })]
406
+ });
407
+ };
408
+ /**
409
+ * Main Player component.
410
+ *
411
+ * Note: PlayerProvider is available if you need to use context-based access
412
+ * across multiple components. PlayerInner manages its own PlayerController
413
+ * via usePlayerController hook.
414
+ */
415
+ var Player = function Player(props) {
416
+ return jsxRuntime.jsx(PlayerInner, _rollupPluginBabelHelpers.objectSpread2({}, props));
417
+ };
418
+
419
+ exports.default = Player;
420
+ //# sourceMappingURL=Player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Player.js","sources":["../../../../src/components/Player.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect } from \"react\";\nimport IdleScreen from \"./IdleScreen\";\nimport TitleOverlay from \"./TitleOverlay\";\nimport StatsPanel from \"./StatsPanel\";\nimport PlayerControls from \"./PlayerControls\";\nimport DevModePanel from \"./DevModePanel\";\nimport SpeedIndicator from \"./SpeedIndicator\";\nimport type { SkipDirection } from \"./SkipIndicator\";\nimport SkipIndicator from \"./SkipIndicator\";\nimport { StatsIcon, SettingsIcon, PictureInPictureIcon } from \"./Icons\";\nimport type { PlayerProps } from \"../types\";\nimport { usePlayerController } from \"../hooks/usePlayerController\";\nimport { cn } from \"@livepeer-frameworks/player-core\";\nimport type { PlaybackMode, EndpointInfo } from \"@livepeer-frameworks/player-core\";\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuTrigger,\n} from \"../ui/context-menu\";\n\n/**\n * Inner player component that uses PlayerController via hook\n */\nconst PlayerInner: React.FC<PlayerProps> = ({\n contentId,\n contentType,\n thumbnailUrl = null,\n options,\n endpoints: propsEndpoints,\n onStateChange,\n}) => {\n // ============================================================================\n // UI-only State (stays in wrapper)\n // ============================================================================\n const [isStatsOpen, setIsStatsOpen] = useState(false);\n const [isDevPanelOpen, setIsDevPanelOpen] = useState(false);\n const [skipDirection, setSkipDirection] = useState<SkipDirection>(null);\n\n // Playback mode preference (persistent)\n const [devPlaybackMode, setDevPlaybackMode] = useState<PlaybackMode>(\n options?.playbackMode || \"auto\"\n );\n\n // ============================================================================\n // PlayerController Hook - ALL business logic\n // ============================================================================\n const {\n containerRef,\n state,\n controller,\n togglePlay,\n toggleMute,\n toggleLoop,\n toggleFullscreen,\n togglePiP,\n setVolume,\n selectQuality,\n clearError,\n dismissToast,\n retry,\n reload,\n jumpToLive,\n handleMouseEnter,\n handleMouseLeave,\n handleMouseMove,\n setDevModeOptions,\n } = usePlayerController({\n contentId,\n contentType,\n endpoints: propsEndpoints,\n gatewayUrl: options?.gatewayUrl,\n mistUrl: options?.mistUrl,\n authToken: options?.authToken,\n autoplay: options?.autoplay !== false,\n muted: options?.muted !== false,\n controls: options?.stockControls === true,\n poster: thumbnailUrl || undefined,\n debug: options?.debug,\n onStateChange: (playerState) => {\n onStateChange?.(playerState);\n },\n onError: (error) => {\n console.warn(\"[Player] Error:\", error);\n },\n });\n\n // ============================================================================\n // Dev Mode Callbacks\n // ============================================================================\n const handleDevSettingsChange = useCallback(\n (settings: { forcePlayer?: string; forceType?: string; forceSource?: number }) => {\n // One-shot selection - controller handles the state\n setDevModeOptions({\n forcePlayer: settings.forcePlayer,\n forceType: settings.forceType,\n forceSource: settings.forceSource,\n });\n },\n [setDevModeOptions]\n );\n\n const handleModeChange = useCallback(\n (mode: PlaybackMode) => {\n setDevPlaybackMode(mode);\n // Mode is a persistent preference\n setDevModeOptions({ playbackMode: mode });\n },\n [setDevModeOptions]\n );\n\n const handleReload = useCallback(() => {\n clearError();\n reload();\n }, [clearError, reload]);\n\n const handleStatsToggle = useCallback(() => {\n setIsStatsOpen((prev) => !prev);\n }, []);\n\n // Clear skip indicator after animation\n const handleSkipIndicatorHide = useCallback(() => {\n setSkipDirection(null);\n }, []);\n\n // Auto-dismiss toast after 3 seconds\n useEffect(() => {\n if (!state.toast) return;\n const timer = setTimeout(() => {\n dismissToast();\n }, 3000);\n return () => clearTimeout(timer);\n }, [state.toast, dismissToast]);\n\n // ============================================================================\n // Derived Values\n // ============================================================================\n const primaryEndpoint = state.endpoints?.primary as EndpointInfo | undefined;\n const isLegacyPlayer = state.currentPlayerInfo?.shortname === \"mist-legacy\";\n const useStockControls = options?.stockControls === true || isLegacyPlayer;\n\n // Title overlay visibility: show on hover or when paused\n const showTitleOverlay =\n (state.isHovering || state.isPaused) &&\n !state.shouldShowIdleScreen &&\n !state.isBuffering &&\n !state.error;\n\n // Buffering spinner: only during active playback\n const showBufferingSpinner =\n !state.shouldShowIdleScreen && state.isBuffering && !state.error && state.hasPlaybackStarted;\n\n // ============================================================================\n // Waiting for Endpoint (shown as overlay, not early return)\n // ============================================================================\n const showWaitingForEndpoint = !state.endpoints?.primary && state.state !== \"booting\";\n const waitingMessage = options?.gatewayUrl\n ? state.state === \"gateway_loading\"\n ? \"Resolving viewing endpoint...\"\n : \"Waiting for endpoint...\"\n : \"Waiting for endpoint...\";\n\n // ============================================================================\n // Render\n // ============================================================================\n return (\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <div\n className={cn(\n \"fw-player-surface fw-player-root w-full h-full overflow-hidden\",\n options?.devMode && \"flex\"\n )}\n data-player-container=\"true\"\n tabIndex={0}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onMouseMove={handleMouseMove}\n >\n {/* Player area */}\n <div className={cn(\"relative\", options?.devMode ? \"flex-1 min-w-0\" : \"w-full h-full\")}>\n {/* Video container - PlayerController attaches here */}\n <div ref={containerRef} className=\"fw-player-container\" />\n\n {/* Title/Description overlay */}\n <TitleOverlay\n title={state.metadata?.title}\n description={state.metadata?.description}\n isVisible={showTitleOverlay}\n />\n\n {/* Stats panel */}\n <StatsPanel\n isOpen={isStatsOpen}\n onClose={handleStatsToggle}\n metadata={state.metadata}\n streamState={state.streamState}\n quality={state.playbackQuality}\n videoElement={state.videoElement}\n protocol={primaryEndpoint?.protocol}\n nodeId={primaryEndpoint?.nodeId}\n geoDistance={primaryEndpoint?.geoDistance}\n />\n\n {/* Dev Mode Panel toggle */}\n {options?.devMode && !isDevPanelOpen && (\n <DevModePanel\n onSettingsChange={handleDevSettingsChange}\n playbackMode={devPlaybackMode}\n onModeChange={handleModeChange}\n onReload={handleReload}\n streamInfo={state.streamInfo}\n mistStreamInfo={state.streamState?.streamInfo}\n currentPlayer={state.currentPlayerInfo}\n currentSource={state.currentSourceInfo}\n videoElement={state.videoElement}\n protocol={primaryEndpoint?.protocol}\n nodeId={primaryEndpoint?.nodeId}\n isVisible={false}\n isOpen={false}\n onOpenChange={setIsDevPanelOpen}\n />\n )}\n\n {/* Speed indicator */}\n {state.isHoldingSpeed && <SpeedIndicator isVisible={true} speed={state.holdSpeed} />}\n\n {/* Skip indicator */}\n <SkipIndicator\n direction={skipDirection}\n seconds={10}\n onHide={handleSkipIndicatorHide}\n />\n\n {/* Waiting for endpoint overlay */}\n {showWaitingForEndpoint && <IdleScreen status=\"OFFLINE\" message={waitingMessage} />}\n\n {/* Idle screen */}\n {!showWaitingForEndpoint && state.shouldShowIdleScreen && (\n <IdleScreen\n status={state.isEffectivelyLive ? state.streamState?.status : undefined}\n message={state.isEffectivelyLive ? state.streamState?.message : \"Loading video...\"}\n percentage={state.isEffectivelyLive ? state.streamState?.percentage : undefined}\n />\n )}\n\n {/* Buffering spinner */}\n {showBufferingSpinner && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"fw-player-surface absolute inset-0 flex items-center justify-center bg-black/40 backdrop-blur-sm z-20\"\n >\n <div className=\"flex items-center gap-3 rounded-lg border border-white/10 bg-black/70 px-4 py-3 text-sm text-white shadow-lg\">\n <div className=\"w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin\"></div>\n <span>Buffering...</span>\n </div>\n </div>\n )}\n\n {/* Error overlay */}\n {!state.shouldShowIdleScreen && state.error && (\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n className={cn(\n \"fw-error-overlay\",\n state.isPassiveError\n ? \"fw-error-overlay--passive\"\n : \"fw-error-overlay--fullscreen\"\n )}\n >\n <div\n className={cn(\n \"fw-error-popup\",\n state.isPassiveError ? \"fw-error-popup--passive\" : \"fw-error-popup--fullscreen\"\n )}\n >\n <div\n className={cn(\n \"fw-error-header\",\n state.isPassiveError ? \"fw-error-header--warning\" : \"fw-error-header--error\"\n )}\n >\n <span\n className={cn(\n \"fw-error-title\",\n state.isPassiveError ? \"fw-error-title--warning\" : \"fw-error-title--error\"\n )}\n >\n {state.isPassiveError ? \"Warning\" : \"Error\"}\n </span>\n <button\n type=\"button\"\n className=\"fw-error-close\"\n onClick={clearError}\n aria-label=\"Dismiss\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M9 3L3 9M3 3L9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n <div className=\"fw-error-body\">\n <p className=\"fw-error-message\">Playback issue</p>\n </div>\n <div className=\"fw-error-actions\">\n <button\n type=\"button\"\n className=\"fw-error-btn\"\n aria-label=\"Retry playback\"\n onClick={() => {\n clearError();\n retry();\n }}\n >\n Retry\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Toast notification */}\n {state.toast && (\n <div\n className=\"absolute bottom-20 left-1/2 -translate-x-1/2 z-30 animate-in fade-in slide-in-from-bottom-2 duration-200\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <div className=\"flex items-center gap-2 rounded-lg border border-white/10 bg-black/80 px-4 py-2 text-sm text-white shadow-lg backdrop-blur-sm\">\n <span>{state.toast.message}</span>\n <button\n type=\"button\"\n onClick={dismissToast}\n className=\"ml-2 text-white/60 hover:text-white\"\n aria-label=\"Dismiss\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M9 3L3 9M3 3L9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n </div>\n )}\n\n {/* Player controls */}\n {!useStockControls && (\n <PlayerControls\n currentTime={state.currentTime}\n duration={state.duration}\n isVisible={state.shouldShowControls}\n onSeek={(t) => controller?.seek(t)}\n showStatsButton={false}\n isStatsOpen={isStatsOpen}\n onStatsToggle={handleStatsToggle}\n mistStreamInfo={state.streamState?.streamInfo}\n disabled={!state.videoElement}\n playbackMode={devPlaybackMode}\n onModeChange={handleModeChange}\n sourceType={state.currentSourceInfo?.type}\n isContentLive={state.isEffectivelyLive}\n // Props from usePlayerController hook\n videoElement={state.videoElement}\n qualities={state.qualities}\n onSelectQuality={selectQuality}\n isMuted={state.isMuted}\n volume={state.volume}\n onVolumeChange={setVolume}\n onToggleMute={toggleMute}\n isPlaying={state.isPlaying}\n onTogglePlay={togglePlay}\n onToggleFullscreen={toggleFullscreen}\n isFullscreen={state.isFullscreen}\n isLoopEnabled={state.isLoopEnabled}\n onToggleLoop={toggleLoop}\n onJumpToLive={jumpToLive}\n />\n )}\n </div>\n\n {/* Dev Mode Panel - side panel */}\n {options?.devMode && isDevPanelOpen && (\n <DevModePanel\n onSettingsChange={handleDevSettingsChange}\n playbackMode={devPlaybackMode}\n onModeChange={handleModeChange}\n onReload={handleReload}\n streamInfo={state.streamInfo}\n mistStreamInfo={state.streamState?.streamInfo}\n currentPlayer={state.currentPlayerInfo}\n currentSource={state.currentSourceInfo}\n videoElement={state.videoElement}\n protocol={primaryEndpoint?.protocol}\n nodeId={primaryEndpoint?.nodeId}\n isVisible={true}\n isOpen={true}\n onOpenChange={setIsDevPanelOpen}\n />\n )}\n </div>\n </ContextMenuTrigger>\n\n {/* Context menu */}\n <ContextMenuContent>\n <ContextMenuItem onClick={handleStatsToggle} className=\"gap-2\">\n <StatsIcon size={14} className=\"opacity-70 flex-shrink-0\" />\n <span>{isStatsOpen ? \"Hide Stats\" : \"Stats\"}</span>\n </ContextMenuItem>\n {options?.devMode && (\n <>\n <ContextMenuSeparator />\n <ContextMenuItem onClick={() => setIsDevPanelOpen(!isDevPanelOpen)} className=\"gap-2\">\n <SettingsIcon size={14} className=\"opacity-70 flex-shrink-0\" />\n <span>{isDevPanelOpen ? \"Hide Settings\" : \"Settings\"}</span>\n </ContextMenuItem>\n </>\n )}\n <ContextMenuSeparator />\n <ContextMenuItem onClick={togglePiP} className=\"gap-2\">\n <PictureInPictureIcon size={14} className=\"opacity-70 flex-shrink-0\" />\n <span>Picture-in-Picture</span>\n </ContextMenuItem>\n <ContextMenuItem onClick={toggleLoop} className=\"gap-2\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"opacity-70 flex-shrink-0\"\n >\n <polyline points=\"17 1 21 5 17 9\"></polyline>\n <path d=\"M3 11V9a4 4 0 0 1 4-4h14\"></path>\n <polyline points=\"7 23 3 19 7 15\"></polyline>\n <path d=\"M21 13v2a4 4 0 0 1-4 4H3\"></path>\n </svg>\n <span>{state.isLoopEnabled ? \"Disable Loop\" : \"Enable Loop\"}</span>\n </ContextMenuItem>\n </ContextMenuContent>\n </ContextMenu>\n );\n};\n\n/**\n * Main Player component.\n *\n * Note: PlayerProvider is available if you need to use context-based access\n * across multiple components. PlayerInner manages its own PlayerController\n * via usePlayerController hook.\n */\nconst Player: React.FC<PlayerProps> = (props) => {\n return <PlayerInner {...props} />;\n};\n\nexport default Player;\n"],"names":["PlayerInner","_ref","_state$endpoints","_state$currentPlayerI","_state$endpoints2","_state$metadata","_state$metadata2","_state$streamState","_state$streamState2","_state$streamState3","_state$streamState4","_state$streamState5","_state$currentSourceI","_state$streamState6","contentId","contentType","_ref$thumbnailUrl","thumbnailUrl","options","propsEndpoints","endpoints","onStateChange","_useState","useState","_useState2","_slicedToArray","isStatsOpen","setIsStatsOpen","_useState3","_useState4","isDevPanelOpen","setIsDevPanelOpen","_useState5","_useState6","skipDirection","setSkipDirection","_useState7","playbackMode","_useState8","devPlaybackMode","setDevPlaybackMode","_usePlayerController","usePlayerController","gatewayUrl","mistUrl","authToken","autoplay","muted","controls","stockControls","poster","undefined","debug","playerState","onError","error","console","warn","containerRef","state","controller","togglePlay","toggleMute","toggleLoop","toggleFullscreen","togglePiP","setVolume","selectQuality","clearError","dismissToast","retry","reload","jumpToLive","handleMouseEnter","handleMouseLeave","handleMouseMove","setDevModeOptions","handleDevSettingsChange","useCallback","settings","forcePlayer","forceType","forceSource","handleModeChange","mode","handleReload","handleStatsToggle","prev","handleSkipIndicatorHide","useEffect","toast","timer","setTimeout","clearTimeout","primaryEndpoint","primary","isLegacyPlayer","currentPlayerInfo","shortname","useStockControls","showTitleOverlay","isHovering","isPaused","shouldShowIdleScreen","isBuffering","showBufferingSpinner","hasPlaybackStarted","showWaitingForEndpoint","waitingMessage","_jsxs","ContextMenu","children","_jsx","ContextMenuTrigger","asChild","className","cn","devMode","tabIndex","onMouseEnter","onMouseLeave","onMouseMove","ref","TitleOverlay","title","metadata","description","isVisible","StatsPanel","isOpen","onClose","streamState","quality","playbackQuality","videoElement","protocol","nodeId","geoDistance","DevModePanel","onSettingsChange","onModeChange","onReload","streamInfo","mistStreamInfo","currentPlayer","currentSource","currentSourceInfo","onOpenChange","isHoldingSpeed","SpeedIndicator","speed","holdSpeed","SkipIndicator","direction","seconds","onHide","IdleScreen","status","message","isEffectivelyLive","percentage","role","isPassiveError","type","onClick","width","height","viewBox","fill","d","stroke","strokeWidth","strokeLinecap","PlayerControls","currentTime","duration","shouldShowControls","onSeek","t","seek","showStatsButton","onStatsToggle","disabled","sourceType","isContentLive","qualities","onSelectQuality","isMuted","volume","onVolumeChange","onToggleMute","isPlaying","onTogglePlay","onToggleFullscreen","isFullscreen","isLoopEnabled","onToggleLoop","onJumpToLive","ContextMenuContent","ContextMenuItem","StatsIcon","size","_Fragment","ContextMenuSeparator","SettingsIcon","PictureInPictureIcon","strokeLinejoin","points","Player","props","_objectSpread"],"mappings":"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"}