@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.
- package/README.md +7 -9
- package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js +359 -0
- package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/dist/cjs/assets/logomark.svg.js +8 -0
- package/dist/cjs/assets/logomark.svg.js.map +1 -0
- package/dist/cjs/components/DevModePanel.js +826 -0
- package/dist/cjs/components/DevModePanel.js.map +1 -0
- package/dist/cjs/components/DvdLogo.js +200 -0
- package/dist/cjs/components/DvdLogo.js.map +1 -0
- package/dist/cjs/components/Icons.js +439 -0
- package/dist/cjs/components/Icons.js.map +1 -0
- package/dist/cjs/components/IdleScreen.js +587 -0
- package/dist/cjs/components/IdleScreen.js.map +1 -0
- package/dist/cjs/components/LoadingScreen.js +523 -0
- package/dist/cjs/components/LoadingScreen.js.map +1 -0
- package/dist/cjs/components/Player.js +420 -0
- package/dist/cjs/components/Player.js.map +1 -0
- package/dist/cjs/components/PlayerControls.js +798 -0
- package/dist/cjs/components/PlayerControls.js.map +1 -0
- package/dist/cjs/components/PlayerErrorBoundary.js +80 -0
- package/dist/cjs/components/PlayerErrorBoundary.js.map +1 -0
- package/dist/cjs/components/SeekBar.js +253 -0
- package/dist/cjs/components/SeekBar.js.map +1 -0
- package/dist/cjs/components/SkipIndicator.js +92 -0
- package/dist/cjs/components/SkipIndicator.js.map +1 -0
- package/dist/cjs/components/SpeedIndicator.js +43 -0
- package/dist/cjs/components/SpeedIndicator.js.map +1 -0
- package/dist/cjs/components/StatsPanel.js +202 -0
- package/dist/cjs/components/StatsPanel.js.map +1 -0
- package/dist/cjs/components/StreamStateOverlay.js +229 -0
- package/dist/cjs/components/StreamStateOverlay.js.map +1 -0
- package/dist/cjs/components/ThumbnailOverlay.js +86 -0
- package/dist/cjs/components/ThumbnailOverlay.js.map +1 -0
- package/dist/cjs/components/TitleOverlay.js +32 -0
- package/dist/cjs/components/TitleOverlay.js.map +1 -0
- package/dist/cjs/context/PlayerContext.js +46 -0
- package/dist/cjs/context/PlayerContext.js.map +1 -0
- package/dist/cjs/hooks/useMetaTrack.js +165 -0
- package/dist/cjs/hooks/useMetaTrack.js.map +1 -0
- package/dist/cjs/hooks/usePlaybackQuality.js +131 -0
- package/dist/cjs/hooks/usePlaybackQuality.js.map +1 -0
- package/dist/cjs/hooks/usePlayerController.js +518 -0
- package/dist/cjs/hooks/usePlayerController.js.map +1 -0
- package/dist/cjs/hooks/usePlayerSelection.js +90 -0
- package/dist/cjs/hooks/usePlayerSelection.js.map +1 -0
- package/dist/cjs/hooks/useStreamState.js +360 -0
- package/dist/cjs/hooks/useStreamState.js.map +1 -0
- package/dist/cjs/hooks/useTelemetry.js +120 -0
- package/dist/cjs/hooks/useTelemetry.js.map +1 -0
- package/dist/cjs/hooks/useViewerEndpoints.js +222 -0
- package/dist/cjs/hooks/useViewerEndpoints.js.map +1 -0
- package/dist/cjs/index.js +97 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/ui/badge.js +34 -0
- package/dist/cjs/ui/badge.js.map +1 -0
- package/dist/cjs/ui/button.js +74 -0
- package/dist/cjs/ui/button.js.map +1 -0
- package/dist/cjs/ui/context-menu.js +163 -0
- package/dist/cjs/ui/context-menu.js.map +1 -0
- package/dist/cjs/ui/slider.js +60 -0
- package/dist/cjs/ui/slider.js.map +1 -0
- package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +329 -0
- package/dist/esm/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/dist/esm/assets/logomark.svg.js +4 -0
- package/dist/esm/assets/logomark.svg.js.map +1 -0
- package/dist/esm/components/DevModePanel.js +822 -0
- package/dist/esm/components/DevModePanel.js.map +1 -0
- package/dist/esm/components/DvdLogo.js +196 -0
- package/dist/esm/components/DvdLogo.js.map +1 -0
- package/dist/esm/components/Icons.js +421 -0
- package/dist/esm/components/Icons.js.map +1 -0
- package/dist/esm/components/IdleScreen.js +582 -0
- package/dist/esm/components/IdleScreen.js.map +1 -0
- package/dist/esm/components/LoadingScreen.js +519 -0
- package/dist/esm/components/LoadingScreen.js.map +1 -0
- package/dist/esm/components/Player.js +416 -0
- package/dist/esm/components/Player.js.map +1 -0
- package/dist/esm/components/PlayerControls.js +794 -0
- package/dist/esm/components/PlayerControls.js.map +1 -0
- package/dist/esm/components/PlayerErrorBoundary.js +76 -0
- package/dist/esm/components/PlayerErrorBoundary.js.map +1 -0
- package/dist/esm/components/SeekBar.js +249 -0
- package/dist/esm/components/SeekBar.js.map +1 -0
- package/dist/esm/components/SkipIndicator.js +88 -0
- package/dist/esm/components/SkipIndicator.js.map +1 -0
- package/dist/esm/components/SpeedIndicator.js +39 -0
- package/dist/esm/components/SpeedIndicator.js.map +1 -0
- package/dist/esm/components/StatsPanel.js +198 -0
- package/dist/esm/components/StatsPanel.js.map +1 -0
- package/dist/esm/components/StreamStateOverlay.js +224 -0
- package/dist/esm/components/StreamStateOverlay.js.map +1 -0
- package/dist/esm/components/ThumbnailOverlay.js +82 -0
- package/dist/esm/components/ThumbnailOverlay.js.map +1 -0
- package/dist/esm/components/TitleOverlay.js +28 -0
- package/dist/esm/components/TitleOverlay.js.map +1 -0
- package/dist/esm/context/PlayerContext.js +41 -0
- package/dist/esm/context/PlayerContext.js.map +1 -0
- package/dist/esm/hooks/useMetaTrack.js +163 -0
- package/dist/esm/hooks/useMetaTrack.js.map +1 -0
- package/dist/esm/hooks/usePlaybackQuality.js +129 -0
- package/dist/esm/hooks/usePlaybackQuality.js.map +1 -0
- package/dist/esm/hooks/usePlayerController.js +516 -0
- package/dist/esm/hooks/usePlayerController.js.map +1 -0
- package/dist/esm/hooks/usePlayerSelection.js +88 -0
- package/dist/esm/hooks/usePlayerSelection.js.map +1 -0
- package/dist/esm/hooks/useStreamState.js +358 -0
- package/dist/esm/hooks/useStreamState.js.map +1 -0
- package/dist/esm/hooks/useTelemetry.js +118 -0
- package/dist/esm/hooks/useTelemetry.js.map +1 -0
- package/dist/esm/hooks/useViewerEndpoints.js +220 -0
- package/dist/esm/hooks/useViewerEndpoints.js.map +1 -0
- package/dist/esm/index.js +23 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/ui/badge.js +31 -0
- package/dist/esm/ui/badge.js.map +1 -0
- package/dist/esm/ui/button.js +52 -0
- package/dist/esm/ui/button.js.map +1 -0
- package/dist/esm/ui/context-menu.js +132 -0
- package/dist/esm/ui/context-menu.js.map +1 -0
- package/dist/esm/ui/slider.js +38 -0
- package/dist/esm/ui/slider.js.map +1 -0
- package/dist/types/components/DvdLogo.d.ts +1 -1
- package/dist/types/components/Icons.d.ts +1 -1
- package/dist/types/components/Player.d.ts +1 -1
- package/dist/types/components/PlayerErrorBoundary.d.ts +2 -1
- package/dist/types/components/StreamStateOverlay.d.ts +2 -2
- package/dist/types/components/SubtitleRenderer.d.ts +2 -2
- package/dist/types/context/PlayerContext.d.ts +2 -2
- package/dist/types/context/index.d.ts +2 -2
- package/dist/types/hooks/useMetaTrack.d.ts +3 -3
- package/dist/types/hooks/usePlaybackQuality.d.ts +2 -2
- package/dist/types/hooks/usePlayerController.d.ts +26 -3
- package/dist/types/hooks/usePlayerSelection.d.ts +1 -1
- package/dist/types/hooks/useStreamState.d.ts +1 -1
- package/dist/types/hooks/useTelemetry.d.ts +1 -1
- package/dist/types/hooks/useViewerEndpoints.d.ts +3 -3
- package/dist/types/index.d.ts +28 -28
- package/dist/types/types.d.ts +3 -3
- package/dist/types/ui/select.d.ts +1 -1
- package/package.json +22 -14
- package/src/components/DevModePanel.tsx +244 -143
- package/src/components/DvdLogo.tsx +1 -1
- package/src/components/Icons.tsx +105 -25
- package/src/components/IdleScreen.tsx +262 -128
- package/src/components/LoadingScreen.tsx +169 -151
- package/src/components/LogoOverlay.tsx +3 -6
- package/src/components/Player.tsx +126 -59
- package/src/components/PlayerControls.tsx +384 -272
- package/src/components/PlayerErrorBoundary.tsx +7 -13
- package/src/components/SeekBar.tsx +96 -88
- package/src/components/SkipIndicator.tsx +2 -12
- package/src/components/SpeedIndicator.tsx +2 -11
- package/src/components/StatsPanel.tsx +31 -22
- package/src/components/StreamStateOverlay.tsx +105 -49
- package/src/components/SubtitleRenderer.tsx +29 -29
- package/src/components/ThumbnailOverlay.tsx +5 -6
- package/src/components/TitleOverlay.tsx +2 -8
- package/src/context/PlayerContext.tsx +4 -8
- package/src/context/index.ts +3 -3
- package/src/hooks/useMetaTrack.ts +27 -27
- package/src/hooks/usePlaybackQuality.ts +3 -3
- package/src/hooks/usePlayerController.ts +246 -138
- package/src/hooks/usePlayerSelection.ts +6 -6
- package/src/hooks/useStreamState.ts +51 -56
- package/src/hooks/useTelemetry.ts +18 -3
- package/src/hooks/useViewerEndpoints.ts +34 -23
- package/src/index.tsx +36 -28
- package/src/types.ts +8 -8
- package/src/ui/badge.tsx +6 -5
- package/src/ui/button.tsx +9 -8
- package/src/ui/context-menu.tsx +42 -61
- package/src/ui/select.tsx +13 -7
- package/src/ui/slider.tsx +18 -29
- package/dist/types/components/players/DashJsPlayer.d.ts +0 -18
- package/dist/types/components/players/HlsJsPlayer.d.ts +0 -18
- package/dist/types/components/players/MewsWsPlayer/index.d.ts +0 -18
- package/dist/types/components/players/MistPlayer.d.ts +0 -20
- package/dist/types/components/players/MistWebRTCPlayer/index.d.ts +0 -20
- package/dist/types/components/players/NativePlayer.d.ts +0 -19
- package/dist/types/components/players/VideoJsPlayer.d.ts +0 -18
- package/src/components/players/DashJsPlayer.tsx +0 -56
- package/src/components/players/HlsJsPlayer.tsx +0 -56
- package/src/components/players/MewsWsPlayer/index.tsx +0 -56
- package/src/components/players/MistPlayer.tsx +0 -60
- package/src/components/players/MistWebRTCPlayer/index.tsx +0 -59
- package/src/components/players/NativePlayer.tsx +0 -58
- 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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"}
|