@djangocfg/ui-tools 2.1.119 → 2.1.120
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/dist/JsonTree-G2TPWQ4C.mjs +4 -0
- package/dist/{JsonTree-6RYAOPSS.mjs.map → JsonTree-G2TPWQ4C.mjs.map} +1 -1
- package/dist/JsonTree-TWXUBBIG.cjs +10 -0
- package/dist/{JsonTree-7OH6CIHT.cjs.map → JsonTree-TWXUBBIG.cjs.map} +1 -1
- package/dist/{Mermaid.client-PNXEC6YL.cjs → Mermaid.client-AF4WOQZR.cjs} +9 -11
- package/dist/Mermaid.client-AF4WOQZR.cjs.map +1 -0
- package/dist/{Mermaid.client-OKACITCW.mjs → Mermaid.client-W4QXJX7Q.mjs} +9 -11
- package/dist/Mermaid.client-W4QXJX7Q.mjs.map +1 -0
- package/dist/{PlaygroundLayout-SYMEAG3J.cjs → PlaygroundLayout-RZMJWH3Y.cjs} +25 -25
- package/dist/{PlaygroundLayout-SYMEAG3J.cjs.map → PlaygroundLayout-RZMJWH3Y.cjs.map} +1 -1
- package/dist/{PlaygroundLayout-UQRBU5RH.mjs → PlaygroundLayout-UQABCZ6K.mjs} +4 -4
- package/dist/{PlaygroundLayout-UQRBU5RH.mjs.map → PlaygroundLayout-UQABCZ6K.mjs.map} +1 -1
- package/dist/{chunk-UOMPPIED.mjs → chunk-4G4UGMOP.mjs} +3 -3
- package/dist/chunk-4G4UGMOP.mjs.map +1 -0
- package/dist/{chunk-47T5ECYV.cjs → chunk-CY3CQS26.cjs} +3 -3
- package/dist/chunk-CY3CQS26.cjs.map +1 -0
- package/dist/{chunk-5QT3QYFZ.cjs → chunk-EGYUND4E.cjs} +2 -2
- package/dist/chunk-EGYUND4E.cjs.map +1 -0
- package/dist/{chunk-DI3HUXHK.cjs → chunk-OYLQZT62.cjs} +2 -2
- package/dist/chunk-OYLQZT62.cjs.map +1 -0
- package/dist/{chunk-W6YHQI4F.mjs → chunk-OYYCGIBF.mjs} +2 -2
- package/dist/chunk-OYYCGIBF.mjs.map +1 -0
- package/dist/{chunk-G6PRZP5I.mjs → chunk-XZZ22EHP.mjs} +2 -2
- package/dist/chunk-XZZ22EHP.mjs.map +1 -0
- package/dist/{components-EASJYK45.mjs → components-4YSJ5ALL.mjs} +3 -3
- package/dist/{components-CJ2IB65O.cjs.map → components-4YSJ5ALL.mjs.map} +1 -1
- package/dist/{components-CJ2IB65O.cjs → components-BSTP3VLD.cjs} +7 -7
- package/dist/{components-EASJYK45.mjs.map → components-BSTP3VLD.cjs.map} +1 -1
- package/dist/index.cjs +27 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +10 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -12
- package/src/tools/AudioPlayer/AudioPlayer.story.tsx +102 -0
- package/src/tools/Gallery/Gallery.story.tsx +231 -0
- package/src/tools/Gallery/components/compact/GalleryCompact.tsx +72 -7
- package/src/tools/Gallery/components/preview/GalleryCarousel.tsx +83 -1
- package/src/tools/JsonForm/JsonForm.story.tsx +134 -0
- package/src/tools/JsonTree/JsonTree.story.tsx +140 -0
- package/src/tools/JsonTree/index.tsx +1 -1
- package/src/tools/LottiePlayer/LottiePlayer.story.tsx +95 -0
- package/src/tools/Map/Map.story.tsx +300 -0
- package/src/tools/Mermaid/Mermaid.story.tsx +131 -0
- package/src/tools/Mermaid/hooks/useMermaidCleanup.ts +2 -5
- package/src/tools/Mermaid/hooks/useMermaidRenderer.ts +7 -1
- package/src/tools/Mermaid/hooks/useMermaidValidation.ts +4 -2
- package/src/tools/Mermaid/index.tsx +1 -1
- package/src/tools/PrettyCode/PrettyCode.story.tsx +116 -0
- package/src/tools/PrettyCode/index.tsx +1 -1
- package/src/tools/VideoPlayer/VideoPlayer.story.tsx +87 -0
- package/src/tools/VideoPlayer/utils/resolvers.ts +2 -2
- package/dist/JsonTree-6RYAOPSS.mjs +0 -4
- package/dist/JsonTree-7OH6CIHT.cjs +0 -10
- package/dist/Mermaid.client-OKACITCW.mjs.map +0 -1
- package/dist/Mermaid.client-PNXEC6YL.cjs.map +0 -1
- package/dist/chunk-47T5ECYV.cjs.map +0 -1
- package/dist/chunk-5QT3QYFZ.cjs.map +0 -1
- package/dist/chunk-DI3HUXHK.cjs.map +0 -1
- package/dist/chunk-G6PRZP5I.mjs.map +0 -1
- package/dist/chunk-UOMPPIED.mjs.map +0 -1
- package/dist/chunk-W6YHQI4F.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/VideoPlayer/utils/debug.ts","../src/tools/VideoPlayer/providers/VidstackProvider.tsx","../src/tools/VideoPlayer/hooks/useVideoPlayerSettings.ts","../src/tools/VideoPlayer/providers/NativeProvider.tsx","../src/tools/VideoPlayer/providers/StreamProvider.tsx","../src/tools/VideoPlayer/context/VideoPlayerContext.tsx","../src/tools/VideoPlayer/utils/resolvers.ts","../src/tools/VideoPlayer/utils/fileSource.ts","../src/tools/VideoPlayer/components/VideoPlayer.tsx","../src/tools/VideoPlayer/components/VideoControls.tsx","../src/tools/VideoPlayer/components/VideoErrorFallback.tsx"],"names":["cn","useVideoPlayerSettings","useCallback","forwardRef","useState","useRef","useEffect","useImperativeHandle","jsxs","jsx","DefaultErrorFallback","AspectRatio","Fragment","Preloader","useMemo"],"mappings":"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","file":"chunk-4G4UGMOP.mjs","sourcesContent":["'use client';\n\n/**\n * VideoPlayer Debug Logger\n *\n * Uses universal logger with media-specific helpers.\n * Logs go to both console (dev) and zustand store (for Console panel).\n */\n\nimport { createMediaLogger } from '@djangocfg/ui-core/lib';\n\nexport const videoDebug = createMediaLogger('VideoPlayer');\n\nexport default videoDebug;\n","/**\n * VidstackProvider - Full-featured video player using Vidstack\n * Supports YouTube, Vimeo, HLS, DASH, and direct URLs\n */\n\n'use client';\n\n// Import Vidstack base styles\nimport '@vidstack/react/player/styles/base.css';\nimport '@vidstack/react/player/styles/default/theme.css';\nimport '@vidstack/react/player/styles/default/layouts/video.css';\n\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\n\nimport { cn, generateOgImageUrl } from '@djangocfg/ui-core/lib';\nimport { MediaPlayer, MediaProvider, Poster } from '@vidstack/react';\nimport { defaultLayoutIcons, DefaultVideoLayout } from '@vidstack/react/player/layouts/default';\nimport { useVideoCache } from '../../../stores/mediaCache';\n\nimport type { MediaPlayerInstance, PlayerSrc } from '@vidstack/react';\nimport type { VidstackProviderProps, VideoPlayerRef, ErrorFallbackProps } from '../types';\nimport { videoDebug } from '../utils/debug';\n\n/**\n * Convert source to Vidstack-compatible format\n * Returns object with explicit type for HLS/DASH to ensure proper loader selection\n */\nfunction getVidstackSrc(source: VidstackProviderProps['source']): PlayerSrc {\n switch (source.type) {\n case 'youtube':\n return `youtube/${source.id}`;\n case 'vimeo':\n return `vimeo/${source.id}`;\n case 'hls':\n // Explicit type needed because URL may have query params that hide .m3u8 extension\n return { src: source.url, type: 'application/x-mpegurl' } as PlayerSrc;\n case 'dash':\n return { src: source.url, type: 'application/dash+xml' } as PlayerSrc;\n case 'url':\n return source.url;\n default:\n return '';\n }\n}\n\n/** Default error fallback UI */\nfunction DefaultErrorFallback({ error }: ErrorFallbackProps) {\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center gap-4 text-white bg-black\">\n <svg\n className=\"w-16 h-16 text-muted-foreground\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n <p className=\"text-lg\">{error || 'Video cannot be played'}</p>\n </div>\n );\n}\n\nexport const VidstackProvider = forwardRef<VideoPlayerRef, VidstackProviderProps>(\n (\n {\n source,\n aspectRatio = 16 / 9,\n autoPlay = false,\n muted = false,\n loop = false,\n playsInline = true,\n controls = true,\n className,\n showInfo = false,\n theme = 'default',\n errorFallback,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n },\n ref\n ) => {\n const playerRef = useRef<MediaPlayerInstance | null>(null);\n const [hasError, setHasError] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string>('Video cannot be played');\n const lastSavedTimeRef = useRef<number>(0);\n const hasRestoredPositionRef = useRef(false);\n\n // Cache hooks\n const {\n getPosterUrl,\n cachePosterUrl,\n saveVideoPosition,\n getVideoPosition,\n } = useVideoCache();\n\n // Get source key for position caching\n const sourceKey = useMemo(() => {\n switch (source.type) {\n case 'youtube':\n return `youtube:${source.id}`;\n case 'vimeo':\n return `vimeo:${source.id}`;\n case 'hls':\n case 'dash':\n case 'url':\n return `url:${source.url}`;\n default:\n return null;\n }\n }, [source]);\n\n // Generate poster if not provided, with caching\n const posterUrl = useMemo(() => {\n if (source.poster) return source.poster;\n if (!source.title) return undefined;\n\n // Check cache first\n const cached = getPosterUrl(source.title);\n if (cached) return cached;\n\n // Generate and cache\n const url = generateOgImageUrl({ title: source.title });\n cachePosterUrl(source.title, url);\n return url;\n }, [source.poster, source.title, getPosterUrl, cachePosterUrl]);\n\n // Get Vidstack-compatible source URL\n const vidstackSrc = useMemo(() => getVidstackSrc(source), [source]);\n\n // Debug: Log video source\n useEffect(() => {\n const srcString = typeof vidstackSrc === 'string' ? vidstackSrc : (vidstackSrc as { src: string }).src;\n videoDebug.load(srcString, source.type);\n }, [vidstackSrc, source.type]);\n\n // Retry function\n const retry = useCallback(() => {\n setHasError(false);\n setErrorMessage('Video cannot be played');\n // Force reload by updating key would be needed, but for now just reset state\n const player = playerRef.current;\n if (player) {\n player.currentTime = 0;\n player.play();\n }\n }, []);\n\n // Expose player methods via ref\n useImperativeHandle(\n ref,\n () => {\n const player = playerRef.current;\n\n return {\n play: () => player?.play(),\n pause: () => player?.pause(),\n togglePlay: () => {\n if (player) {\n player.paused ? player.play() : player.pause();\n }\n },\n seekTo: (time: number) => {\n if (player) player.currentTime = time;\n },\n setVolume: (volume: number) => {\n if (player) player.volume = Math.max(0, Math.min(1, volume));\n },\n toggleMute: () => {\n if (player) player.muted = !player.muted;\n },\n enterFullscreen: () => player?.enterFullscreen(),\n exitFullscreen: () => player?.exitFullscreen(),\n get currentTime() {\n return player?.currentTime ?? 0;\n },\n get duration() {\n return player?.duration ?? 0;\n },\n get paused() {\n return player?.paused ?? true;\n },\n };\n },\n []\n );\n\n const handlePlay = () => onPlay?.();\n\n const handlePause = useCallback(() => {\n // Save position on pause\n const player = playerRef.current;\n if (sourceKey && player && player.currentTime > 0) {\n saveVideoPosition(sourceKey, player.currentTime);\n lastSavedTimeRef.current = player.currentTime;\n }\n onPause?.();\n }, [sourceKey, saveVideoPosition, onPause]);\n\n const handleEnded = () => onEnded?.();\n\n const handleError = (detail: unknown) => {\n const error = detail as { message?: string };\n const msg = error?.message || 'Video playback error';\n videoDebug.error('Vidstack error', { message: msg });\n setHasError(true);\n setErrorMessage(msg);\n onError?.(msg);\n };\n\n const handleLoadStart = () => onLoadStart?.();\n\n const handleCanPlay = useCallback(() => {\n const player = playerRef.current;\n if (player) {\n videoDebug.state('canplay', { duration: player.duration });\n // Log buffer state if media element is available\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n }\n setHasError(false);\n\n // Restore position from cache (only once per source)\n if (sourceKey && player && !hasRestoredPositionRef.current) {\n const cachedPosition = getVideoPosition(sourceKey);\n if (cachedPosition && cachedPosition > 0) {\n const duration = player.duration;\n // Only restore if position is valid (not at the end)\n if (cachedPosition < duration - 1) {\n videoDebug.debug(`Restoring position: ${cachedPosition}s`);\n player.currentTime = cachedPosition;\n }\n }\n hasRestoredPositionRef.current = true;\n }\n\n onCanPlay?.();\n }, [sourceKey, getVideoPosition, onCanPlay]);\n\n const handleTimeUpdate = useCallback(() => {\n const player = playerRef.current;\n if (!player) return;\n\n // Save position every 5 seconds\n if (sourceKey && player.currentTime > 0) {\n const timeSinceLastSave = player.currentTime - lastSavedTimeRef.current;\n if (timeSinceLastSave >= 5 || timeSinceLastSave < 0) {\n saveVideoPosition(sourceKey, player.currentTime);\n lastSavedTimeRef.current = player.currentTime;\n }\n }\n\n onTimeUpdate?.(player.currentTime, player.duration);\n }, [sourceKey, saveVideoPosition, onTimeUpdate]);\n\n // Reset position restoration flag when source changes\n useEffect(() => {\n hasRestoredPositionRef.current = false;\n lastSavedTimeRef.current = 0;\n }, [sourceKey]);\n\n // Debug: Log player events\n useEffect(() => {\n const player = playerRef.current;\n if (!player) return;\n\n const handleSeeking = () => {\n videoDebug.event('seeking', { currentTime: player.currentTime });\n };\n\n const handleSeeked = () => {\n videoDebug.event('seeked', { currentTime: player.currentTime });\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n };\n\n const handleWaiting = () => {\n videoDebug.warn('WAITING - buffering...');\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n };\n\n const handleStalled = () => {\n videoDebug.warn('STALLED - network issue');\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n };\n\n player.addEventListener('seeking', handleSeeking);\n player.addEventListener('seeked', handleSeeked);\n player.addEventListener('waiting', handleWaiting);\n player.addEventListener('stalled', handleStalled);\n\n return () => {\n player.removeEventListener('seeking', handleSeeking);\n player.removeEventListener('seeked', handleSeeked);\n player.removeEventListener('waiting', handleWaiting);\n player.removeEventListener('stalled', handleStalled);\n };\n }, [vidstackSrc]);\n\n // Determine layout mode\n const isFillMode = aspectRatio === 'fill';\n const computedAspectRatio = aspectRatio === 'auto' || aspectRatio === 'fill' ? undefined : aspectRatio;\n\n // Render error fallback\n const renderErrorFallback = () => {\n const fallbackProps: ErrorFallbackProps = { error: errorMessage, retry };\n\n if (typeof errorFallback === 'function') {\n return errorFallback(fallbackProps);\n }\n\n if (errorFallback) {\n return errorFallback;\n }\n\n return <DefaultErrorFallback {...fallbackProps} />;\n };\n\n // Container styles based on mode\n const containerStyles = isFillMode\n ? { width: '100%', height: '100%' }\n : { aspectRatio: computedAspectRatio };\n\n return (\n <div className={cn(isFillMode ? 'w-full h-full' : 'w-full', className)}>\n <div\n className={cn(\n 'relative w-full rounded-sm bg-black overflow-hidden',\n isFillMode && 'h-full',\n theme === 'minimal' && 'rounded-none',\n theme === 'modern' && 'rounded-xl shadow-2xl'\n )}\n style={containerStyles}\n >\n {hasError ? (\n renderErrorFallback()\n ) : (\n <MediaPlayer\n ref={playerRef}\n title={source.title || 'Video'}\n src={vidstackSrc}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n playsInline={playsInline}\n onPlay={handlePlay}\n onPause={handlePause}\n onEnded={handleEnded}\n onError={handleError}\n onLoadStart={handleLoadStart}\n onCanPlay={handleCanPlay}\n onTimeUpdate={handleTimeUpdate}\n className=\"w-full h-full\"\n >\n <MediaProvider />\n\n {posterUrl && (\n <Poster\n className=\"vds-poster\"\n src={posterUrl}\n alt={source.title || 'Video poster'}\n style={{ objectFit: 'cover' }}\n />\n )}\n\n {controls && <DefaultVideoLayout icons={defaultLayoutIcons} thumbnails={posterUrl} />}\n </MediaPlayer>\n )}\n </div>\n\n {showInfo && source.title && (\n <div className=\"mt-4 space-y-2\">\n <h3 className=\"text-xl font-semibold text-foreground\">{source.title}</h3>\n </div>\n )}\n </div>\n );\n }\n);\n\nVidstackProvider.displayName = 'VidstackProvider';\n","'use client';\n\n/**\n * useVideoPlayerSettings - Hook for persisted video player settings\n *\n * Provides volume and loop settings that persist in localStorage.\n * Use this hook in video player providers to apply saved settings.\n *\n * @example\n * const { settings, updateVolume, updateLoop } = useVideoPlayerSettings();\n *\n * // Apply to video element\n * videoRef.current.volume = settings.volume;\n * videoRef.current.loop = settings.isLooping;\n *\n * // Save when user changes\n * const handleVolumeChange = (vol: number) => {\n * videoRef.current.volume = vol;\n * updateVolume(vol);\n * };\n */\n\nimport { useCallback } from 'react';\nimport { useVideoPlayerSettings as useSettings } from '../../../stores/mediaCache';\n\nexport interface VideoPlayerSettingsReturn {\n /** Current settings */\n settings: {\n volume: number;\n isLooping: boolean;\n };\n /** Update volume (0-1) */\n updateVolume: (volume: number) => void;\n /** Update loop setting */\n updateLoop: (isLooping: boolean) => void;\n /** Update multiple settings at once */\n updateSettings: (settings: { volume?: number; isLooping?: boolean }) => void;\n}\n\nexport function useVideoPlayerSettings(): VideoPlayerSettingsReturn {\n const { settings, saveSettings } = useSettings();\n\n const updateVolume = useCallback(\n (volume: number) => {\n saveSettings({ volume: Math.max(0, Math.min(1, volume)) });\n },\n [saveSettings]\n );\n\n const updateLoop = useCallback(\n (isLooping: boolean) => {\n saveSettings({ isLooping });\n },\n [saveSettings]\n );\n\n const updateSettings = useCallback(\n (newSettings: { volume?: number; isLooping?: boolean }) => {\n saveSettings(newSettings);\n },\n [saveSettings]\n );\n\n return {\n settings,\n updateVolume,\n updateLoop,\n updateSettings,\n };\n}\n","/**\n * NativeProvider - Lightweight native HTML5 video player\n * For demo videos, background videos, autoplay loop muted scenarios\n */\n\n'use client';\n\nimport React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { Preloader, AspectRatio } from '@djangocfg/ui-core';\nimport { useVideoPlayerSettings } from '../hooks/useVideoPlayerSettings';\n\nimport type { NativeProviderProps, VideoPlayerRef } from '../types';\nimport { videoDebug } from '../utils/debug';\n\n/**\n * Get video URL from source\n */\nfunction getVideoUrl(source: NativeProviderProps['source']): string {\n switch (source.type) {\n case 'url':\n return source.url;\n case 'data-url':\n return source.data;\n default:\n return '';\n }\n}\n\nexport const NativeProvider = forwardRef<VideoPlayerRef, NativeProviderProps>(\n (\n {\n source,\n aspectRatio = 16 / 9,\n autoPlay = true,\n muted = true,\n loop = true,\n playsInline = true,\n preload = 'auto',\n controls = false,\n disableContextMenu = true,\n showPreloader = true,\n preloaderTimeout = 5000,\n className,\n videoClassName,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n },\n ref\n ) => {\n const [isLoading, setIsLoading] = useState(showPreloader);\n const videoRef = useRef<HTMLVideoElement>(null);\n\n // Persisted player settings\n const { settings: savedSettings, updateVolume } = useVideoPlayerSettings();\n\n const videoUrl = getVideoUrl(source);\n\n // Debug: Log video source\n useEffect(() => {\n videoDebug.load(videoUrl, source.type);\n }, [videoUrl, source.type]);\n\n // Expose video element methods via ref\n useImperativeHandle(\n ref,\n () => ({\n play: () => videoRef.current?.play(),\n pause: () => videoRef.current?.pause(),\n togglePlay: () => {\n const video = videoRef.current;\n if (video) {\n video.paused ? video.play() : video.pause();\n }\n },\n seekTo: (time: number) => {\n if (videoRef.current) videoRef.current.currentTime = time;\n },\n setVolume: (volume: number) => {\n if (videoRef.current) videoRef.current.volume = Math.max(0, Math.min(1, volume));\n },\n toggleMute: () => {\n if (videoRef.current) videoRef.current.muted = !videoRef.current.muted;\n },\n enterFullscreen: () => videoRef.current?.requestFullscreen(),\n exitFullscreen: () => document.exitFullscreen(),\n get currentTime() {\n return videoRef.current?.currentTime ?? 0;\n },\n get duration() {\n return videoRef.current?.duration ?? 0;\n },\n get paused() {\n return videoRef.current?.paused ?? true;\n },\n }),\n []\n );\n\n useEffect(() => {\n if (!showPreloader) return;\n\n const video = videoRef.current;\n if (!video) return;\n\n // Check if video is already loaded\n if (video.readyState >= 3) {\n setIsLoading(false);\n return;\n }\n\n const hideLoader = () => setIsLoading(false);\n\n video.addEventListener('canplay', hideLoader);\n video.addEventListener('loadeddata', hideLoader);\n video.addEventListener('playing', hideLoader);\n\n // Fallback: hide loader after timeout\n const timeout = setTimeout(hideLoader, preloaderTimeout);\n\n return () => {\n video.removeEventListener('canplay', hideLoader);\n video.removeEventListener('loadeddata', hideLoader);\n video.removeEventListener('playing', hideLoader);\n clearTimeout(timeout);\n };\n }, [showPreloader, preloaderTimeout]);\n\n // Debug: Log video events\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleLoadedMetadata = () => {\n videoDebug.state('loadedmetadata', { duration: video.duration });\n };\n\n const handleCanPlayDebug = () => {\n videoDebug.state('canplay', { duration: video.duration, buffered: video.buffered.length });\n videoDebug.buffer(video.buffered, video.duration);\n // Apply saved volume\n video.volume = savedSettings.volume;\n };\n\n const handleSeeking = () => {\n videoDebug.event('seeking', { currentTime: video.currentTime });\n };\n\n const handleSeeked = () => {\n videoDebug.event('seeked', { currentTime: video.currentTime });\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleWaiting = () => {\n videoDebug.warn('WAITING - buffering...');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleStalled = () => {\n videoDebug.warn('STALLED - network issue');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n video.addEventListener('canplay', handleCanPlayDebug);\n video.addEventListener('seeking', handleSeeking);\n video.addEventListener('seeked', handleSeeked);\n video.addEventListener('waiting', handleWaiting);\n video.addEventListener('stalled', handleStalled);\n\n return () => {\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n video.removeEventListener('canplay', handleCanPlayDebug);\n video.removeEventListener('seeking', handleSeeking);\n video.removeEventListener('seeked', handleSeeked);\n video.removeEventListener('waiting', handleWaiting);\n video.removeEventListener('stalled', handleStalled);\n };\n }, [savedSettings.volume]);\n\n // Persist volume when user changes it via native controls\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleVolumeChange = () => {\n updateVolume(video.volume);\n };\n\n video.addEventListener('volumechange', handleVolumeChange);\n return () => video.removeEventListener('volumechange', handleVolumeChange);\n }, [updateVolume]);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (disableContextMenu) {\n e.preventDefault();\n }\n };\n\n const handleError = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n const video = e.currentTarget;\n const errorMsg = video.error?.message || 'Video playback error';\n videoDebug.error('Video error', { code: video.error?.code, message: errorMsg });\n setIsLoading(false);\n onError?.(errorMsg);\n };\n\n const handleTimeUpdate = () => {\n const video = videoRef.current;\n if (video && onTimeUpdate) {\n onTimeUpdate(video.currentTime, video.duration);\n }\n };\n\n // Determine if we should use AspectRatio wrapper or fill mode\n const isFillMode = aspectRatio === 'fill';\n const computedAspectRatio = aspectRatio === 'auto' || aspectRatio === 'fill' ? undefined : aspectRatio;\n\n // Video content\n const videoContent = (\n <>\n {/* Preloader */}\n {showPreloader && isLoading && (\n <div\n className={cn(\n 'absolute inset-0 flex items-center justify-center bg-muted/30 backdrop-blur-sm z-10'\n )}\n >\n <Preloader size=\"lg\" spinnerClassName=\"text-white\" />\n </div>\n )}\n\n {/* Video */}\n <video\n ref={videoRef}\n className={cn('w-full h-full object-cover', videoClassName)}\n src={videoUrl}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n playsInline={playsInline}\n preload={preload}\n controls={controls}\n poster={source.poster}\n onContextMenu={handleContextMenu}\n onLoadStart={onLoadStart}\n onCanPlay={onCanPlay}\n onPlay={onPlay}\n onPause={onPause}\n onPlaying={() => setIsLoading(false)}\n onEnded={onEnded}\n onError={handleError}\n onTimeUpdate={handleTimeUpdate}\n />\n </>\n );\n\n // Fill mode - no AspectRatio wrapper\n if (isFillMode) {\n return (\n <div className={cn('relative w-full h-full overflow-hidden', className)}>\n {videoContent}\n </div>\n );\n }\n\n // Normal mode with AspectRatio\n return (\n <div className={cn('relative overflow-hidden', className)}>\n <AspectRatio ratio={computedAspectRatio}>\n {videoContent}\n </AspectRatio>\n </div>\n );\n }\n);\n\nNativeProvider.displayName = 'NativeProvider';\n","/**\n * StreamProvider - HTTP Range streaming and Blob video player\n * Supports:\n * - HTTP Range requests with authorization (for large files)\n * - Blob/ArrayBuffer sources\n * - Data URL sources\n * - Fill parent container mode\n * - Custom error fallback\n */\n\n'use client';\n\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { Preloader, AspectRatio } from '@djangocfg/ui-core';\nimport { useMediaCacheStore, generateContentKey } from '../../../stores/mediaCache';\nimport { useVideoPlayerSettings } from '../hooks/useVideoPlayerSettings';\n\nimport type { StreamProviderProps, VideoPlayerRef, StreamSource, BlobSource, DataUrlSource, ErrorFallbackProps } from '../types';\nimport { videoDebug } from '../utils/debug';\n\n/** Default error fallback UI */\nfunction DefaultErrorFallback({ error }: ErrorFallbackProps) {\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center gap-4 text-white\">\n <svg\n className=\"w-16 h-16 text-muted-foreground\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n <p className=\"text-lg\">{error || 'Video cannot be previewed'}</p>\n </div>\n );\n}\n\nexport const StreamProvider = forwardRef<VideoPlayerRef, StreamProviderProps>(\n (\n {\n source,\n aspectRatio = 16 / 9,\n autoPlay = false,\n muted = false,\n loop = false,\n playsInline = true,\n preload = 'metadata',\n controls = true,\n disableContextMenu = false,\n showPreloader = true,\n preloaderTimeout = 10000,\n className,\n videoClassName,\n errorFallback,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n onBufferProgress,\n },\n ref\n ) => {\n const [videoUrl, setVideoUrl] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string>('Video cannot be previewed');\n const videoRef = useRef<HTMLVideoElement>(null);\n const contentKeyRef = useRef<string | null>(null);\n const lastSavedTimeRef = useRef<number>(0);\n\n // Get stable function references from store (not from hook to avoid re-renders)\n const getOrCreateBlobUrl = useMediaCacheStore.getState().getOrCreateBlobUrl;\n const releaseBlobUrl = useMediaCacheStore.getState().releaseBlobUrl;\n const getOrCreateStreamUrl = useMediaCacheStore.getState().getOrCreateStreamUrl;\n const saveVideoPosition = useMediaCacheStore.getState().saveVideoPosition;\n const getVideoPosition = useMediaCacheStore.getState().getVideoPosition;\n\n // Persisted player settings\n const { settings: savedSettings, updateVolume } = useVideoPlayerSettings();\n\n // Retry function for error fallback\n // Regenerates URL for stream sources to get fresh token/session\n const retry = useCallback(() => {\n setHasError(false);\n setIsLoading(true);\n\n // For stream sources, regenerate URL bypassing cache\n if (source.type === 'stream') {\n const streamSource = source as StreamSource;\n const freshUrl = streamSource.getStreamUrl(streamSource.sessionId, streamSource.path);\n setVideoUrl(freshUrl);\n return;\n }\n\n // For other sources, just reload\n const video = videoRef.current;\n if (video && videoUrl) {\n video.load();\n }\n }, [source, videoUrl]);\n\n // Expose video element methods via ref\n useImperativeHandle(\n ref,\n () => ({\n play: () => videoRef.current?.play(),\n pause: () => videoRef.current?.pause(),\n togglePlay: () => {\n const video = videoRef.current;\n if (video) {\n video.paused ? video.play() : video.pause();\n }\n },\n seekTo: (time: number) => {\n if (videoRef.current) videoRef.current.currentTime = time;\n },\n setVolume: (volume: number) => {\n if (videoRef.current) videoRef.current.volume = Math.max(0, Math.min(1, volume));\n },\n toggleMute: () => {\n if (videoRef.current) videoRef.current.muted = !videoRef.current.muted;\n },\n enterFullscreen: () => videoRef.current?.requestFullscreen(),\n exitFullscreen: () => document.exitFullscreen(),\n get currentTime() {\n return videoRef.current?.currentTime ?? 0;\n },\n get duration() {\n return videoRef.current?.duration ?? 0;\n },\n get paused() {\n return videoRef.current?.paused ?? true;\n },\n }),\n []\n );\n\n // Track unmount for cleanup\n const isMountedRef = useRef(true);\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n // Release blob URL only on actual unmount\n if (contentKeyRef.current) {\n useMediaCacheStore.getState().releaseBlobUrl(contentKeyRef.current);\n contentKeyRef.current = null;\n }\n };\n }, []);\n\n // Create video URL based on source type with caching\n useEffect(() => {\n // Release previous blob URL if source changed\n if (contentKeyRef.current) {\n const newKey = source.type === 'blob'\n ? generateContentKey((source as BlobSource).data)\n : null;\n if (newKey !== contentKeyRef.current) {\n releaseBlobUrl(contentKeyRef.current);\n contentKeyRef.current = null;\n }\n }\n\n setHasError(false);\n setIsLoading(true);\n\n switch (source.type) {\n case 'stream': {\n const streamSource = source as StreamSource;\n // Use cached stream URL\n const url = getOrCreateStreamUrl(\n streamSource.sessionId,\n streamSource.path,\n streamSource.getStreamUrl\n );\n videoDebug.load(url, 'stream');\n setVideoUrl(url);\n break;\n }\n\n case 'blob': {\n const blobSource = source as BlobSource;\n // Generate content key for caching\n const contentKey = generateContentKey(blobSource.data);\n contentKeyRef.current = contentKey;\n // Use cached blob URL\n const url = getOrCreateBlobUrl(\n contentKey,\n blobSource.data,\n blobSource.mimeType || 'video/mp4'\n );\n videoDebug.load(url, 'blob');\n setVideoUrl(url);\n break;\n }\n\n case 'data-url': {\n const dataUrlSource = source as DataUrlSource;\n videoDebug.load(dataUrlSource.data.slice(0, 50) + '...', 'data-url');\n setVideoUrl(dataUrlSource.data);\n break;\n }\n\n default:\n videoDebug.error('Invalid video source type', { type: (source as { type: string }).type });\n setVideoUrl(null);\n setHasError(true);\n setErrorMessage('Invalid video source');\n }\n\n // No cleanup here - cleanup happens in unmount effect above\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [source]);\n\n // Get source key for position caching\n const getSourceKey = useCallback(() => {\n switch (source.type) {\n case 'stream':\n return `stream:${(source as StreamSource).sessionId}:${(source as StreamSource).path}`;\n case 'blob':\n return contentKeyRef.current ? `blob:${contentKeyRef.current}` : null;\n case 'data-url':\n return `data:${(source as DataUrlSource).data.slice(0, 50)}`;\n default:\n return null;\n }\n }, [source]);\n\n // Restore cached playback position and settings when video is ready\n const handleCanPlay = useCallback(() => {\n const video = videoRef.current;\n if (video) {\n videoDebug.state('canplay', { duration: video.duration, buffered: video.buffered.length });\n videoDebug.buffer(video.buffered, video.duration);\n\n // Apply saved volume (user preference)\n video.volume = savedSettings.volume;\n }\n setIsLoading(false);\n\n // Restore position from cache\n const sourceKey = getSourceKey();\n if (sourceKey && video) {\n const cachedPosition = getVideoPosition(sourceKey);\n if (cachedPosition && cachedPosition > 0) {\n const duration = video.duration;\n // Only restore if position is valid (not at the end)\n if (cachedPosition < duration - 1) {\n videoDebug.debug(`Restoring position: ${cachedPosition}s`);\n video.currentTime = cachedPosition;\n }\n }\n }\n\n onCanPlay?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getSourceKey, onCanPlay, savedSettings.volume]);\n\n // Save playback position periodically\n const handleTimeUpdate = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n\n // Save position every 5 seconds\n const sourceKey = getSourceKey();\n if (sourceKey && video.currentTime > 0) {\n const timeSinceLastSave = video.currentTime - lastSavedTimeRef.current;\n if (timeSinceLastSave >= 5 || timeSinceLastSave < 0) {\n saveVideoPosition(sourceKey, video.currentTime);\n lastSavedTimeRef.current = video.currentTime;\n }\n }\n\n onTimeUpdate?.(video.currentTime, video.duration);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getSourceKey, onTimeUpdate]);\n\n // Save position on pause\n const handlePause = useCallback(() => {\n const video = videoRef.current;\n const sourceKey = getSourceKey();\n if (sourceKey && video && video.currentTime > 0) {\n saveVideoPosition(sourceKey, video.currentTime);\n lastSavedTimeRef.current = video.currentTime;\n }\n onPause?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getSourceKey, onPause]);\n\n // Handle buffer progress\n const handleProgress = useCallback(() => {\n const video = videoRef.current;\n if (!video || !onBufferProgress) return;\n\n // Get the buffered time ranges\n if (video.buffered.length > 0) {\n // Get the end of the last buffered range\n const bufferedEnd = video.buffered.end(video.buffered.length - 1);\n const duration = video.duration;\n\n if (duration > 0 && !isNaN(bufferedEnd)) {\n onBufferProgress(bufferedEnd, duration);\n }\n }\n }, [onBufferProgress]);\n\n // Preloader timeout\n useEffect(() => {\n if (!showPreloader || !isLoading) return;\n\n const timeout = setTimeout(() => {\n setIsLoading(false);\n }, preloaderTimeout);\n\n return () => clearTimeout(timeout);\n }, [showPreloader, isLoading, preloaderTimeout]);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (disableContextMenu) {\n e.preventDefault();\n }\n };\n\n const handleLoadedData = () => {\n setIsLoading(false);\n };\n\n const handleError = () => {\n const video = videoRef.current;\n if (video) {\n videoDebug.error('Video error', { code: video.error?.code, message: video.error?.message });\n }\n setIsLoading(false);\n setHasError(true);\n setErrorMessage('Failed to load video');\n onError?.('Video playback error');\n };\n\n // Debug: Log video events\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleLoadedMetadata = () => {\n videoDebug.state('loadedmetadata', { duration: video.duration });\n };\n\n const handleSeeking = () => {\n videoDebug.event('seeking', { currentTime: video.currentTime });\n };\n\n const handleSeeked = () => {\n videoDebug.event('seeked', { currentTime: video.currentTime });\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleWaiting = () => {\n videoDebug.warn('WAITING - buffering...');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleStalled = () => {\n videoDebug.warn('STALLED - network issue');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n video.addEventListener('seeking', handleSeeking);\n video.addEventListener('seeked', handleSeeked);\n video.addEventListener('waiting', handleWaiting);\n video.addEventListener('stalled', handleStalled);\n\n return () => {\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n video.removeEventListener('seeking', handleSeeking);\n video.removeEventListener('seeked', handleSeeked);\n video.removeEventListener('waiting', handleWaiting);\n video.removeEventListener('stalled', handleStalled);\n };\n }, [videoUrl]);\n\n // Persist volume when user changes it via native controls\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleVolumeChange = () => {\n updateVolume(video.volume);\n };\n\n video.addEventListener('volumechange', handleVolumeChange);\n return () => video.removeEventListener('volumechange', handleVolumeChange);\n }, [videoUrl, updateVolume]);\n\n // Determine if we should use AspectRatio wrapper or fill mode\n const isFillMode = aspectRatio === 'fill';\n const computedAspectRatio = aspectRatio === 'auto' || aspectRatio === 'fill' ? undefined : aspectRatio;\n\n // Render error fallback\n const renderErrorFallback = () => {\n const fallbackProps: ErrorFallbackProps = { error: errorMessage, retry };\n\n if (typeof errorFallback === 'function') {\n return errorFallback(fallbackProps);\n }\n\n if (errorFallback) {\n return errorFallback;\n }\n\n return <DefaultErrorFallback {...fallbackProps} />;\n };\n\n // Error state\n if (!videoUrl || hasError) {\n if (isFillMode) {\n return (\n <div className={cn('relative w-full h-full overflow-hidden bg-black', className)}>\n {renderErrorFallback()}\n </div>\n );\n }\n\n return (\n <div className={cn('relative overflow-hidden bg-black', className)}>\n <AspectRatio ratio={computedAspectRatio}>\n {renderErrorFallback()}\n </AspectRatio>\n </div>\n );\n }\n\n // Video content\n const videoContent = (\n <>\n {/* Loading indicator */}\n {showPreloader && isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50 z-10\">\n <Preloader size=\"lg\" spinnerClassName=\"text-white\" />\n </div>\n )}\n\n {/* Video element */}\n <video\n ref={videoRef}\n src={videoUrl}\n className={cn(\n 'w-full h-full object-contain',\n isLoading && 'opacity-0',\n videoClassName\n )}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n playsInline={playsInline}\n preload={preload}\n controls={controls}\n crossOrigin=\"anonymous\"\n poster={source.poster}\n onContextMenu={handleContextMenu}\n onLoadStart={onLoadStart}\n onCanPlay={handleCanPlay}\n onLoadedData={handleLoadedData}\n onPlay={onPlay}\n onPause={handlePause}\n onEnded={onEnded}\n onError={handleError}\n onTimeUpdate={handleTimeUpdate}\n onProgress={handleProgress}\n />\n </>\n );\n\n // Fill mode - no AspectRatio wrapper\n if (isFillMode) {\n return (\n <div className={cn('relative w-full h-full overflow-hidden bg-black', className)}>\n {videoContent}\n </div>\n );\n }\n\n // Normal mode with AspectRatio\n return (\n <div className={cn('relative overflow-hidden bg-black', className)}>\n <AspectRatio ratio={computedAspectRatio}>\n {videoContent}\n </AspectRatio>\n </div>\n );\n }\n);\n\nStreamProvider.displayName = 'StreamProvider';\n","/**\n * VideoPlayerContext - Context for streaming configuration\n * Simplifies streaming API by providing getStreamUrl globally\n */\n\n'use client';\n\nimport React, { createContext, useContext, useMemo } from 'react';\n\nimport type { VideoPlayerContextValue, VideoPlayerProviderProps } from '../types';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst VideoPlayerContext = createContext<VideoPlayerContextValue | null>(null);\n\n/**\n * Provider for VideoPlayer streaming configuration\n *\n * @example\n * // In your app layout or FileWorkspace\n * <VideoPlayerProvider\n * sessionId={sessionId}\n * getStreamUrl={terminalClient.terminal_media.streamStreamRetrieveUrl}\n * >\n * <VideoPlayer source={{ type: 'stream', path: '/video.mp4' }} />\n * </VideoPlayerProvider>\n */\nexport function VideoPlayerProvider({\n children,\n getStreamUrl,\n sessionId,\n}: VideoPlayerProviderProps) {\n const value = useMemo(\n () => ({ getStreamUrl, sessionId }),\n [getStreamUrl, sessionId]\n );\n\n return (\n <VideoPlayerContext.Provider value={value}>\n {children}\n </VideoPlayerContext.Provider>\n );\n}\n\n/**\n * Hook to access VideoPlayer context\n */\nexport function useVideoPlayerContext(): VideoPlayerContextValue | null {\n return useContext(VideoPlayerContext);\n}\n","/**\n * Video source and player mode resolvers\n */\n\nimport type { VideoSourceUnion, PlayerMode, SimpleStreamSource, StreamSource, VideoPlayerContextValue } from '../types';\n\n/**\n * Determine which provider to use based on source type\n */\nexport function resolvePlayerMode(\n source: VideoSourceUnion,\n mode: PlayerMode = 'auto'\n): 'vidstack' | 'native' | 'streaming' {\n if (mode !== 'auto') {\n return mode;\n }\n\n switch (source.type) {\n case 'youtube':\n case 'vimeo':\n case 'hls':\n case 'dash':\n return 'vidstack';\n\n case 'stream':\n case 'blob':\n return 'streaming';\n\n case 'data-url':\n case 'url':\n default:\n return 'native';\n }\n}\n\n/**\n * Check if source is a simplified stream source (without getStreamUrl)\n */\nexport function isSimpleStreamSource(\n source: VideoSourceUnion | SimpleStreamSource | undefined | null\n): source is SimpleStreamSource {\n return source != null && source.type === 'stream' && !('getStreamUrl' in source);\n}\n\n/**\n * Resolve simplified stream source to full stream source using context\n */\nexport function resolveStreamSource(\n source: SimpleStreamSource,\n context: VideoPlayerContextValue | null\n): StreamSource | null {\n if (!context?.getStreamUrl) {\n console.warn(\n 'VideoPlayer: Stream source requires getStreamUrl. ' +\n 'Either provide it in source or wrap with VideoPlayerProvider.'\n );\n return null;\n }\n\n const sessionId = source.sessionId || context.sessionId;\n if (!sessionId) {\n console.warn('VideoPlayer: Stream source requires sessionId.');\n return null;\n }\n\n return {\n type: 'stream',\n sessionId,\n path: source.path,\n getStreamUrl: context.getStreamUrl,\n mimeType: source.mimeType,\n title: source.title,\n poster: source.poster,\n };\n}\n","/**\n * File source resolution utilities\n */\n\nimport type { VideoSourceUnion, ResolveFileSourceOptions } from '../types';\n\n/**\n * Resolve file content to VideoSourceUnion\n * Useful for FileWorkspace/file manager integrations\n *\n * @example\n * const source = resolveFileSource({\n * content: file.content,\n * path: file.path,\n * mimeType: file.mimeType,\n * sessionId: sessionId,\n * loadMethod: file.loadMethod,\n * getStreamUrl: terminalClient.terminal_media.streamStreamRetrieveUrl\n * });\n *\n * <VideoPlayer source={source} />\n */\nexport function resolveFileSource(options: ResolveFileSourceOptions): VideoSourceUnion | null {\n const {\n content,\n path,\n mimeType,\n sessionId,\n loadMethod,\n getStreamUrl,\n title,\n poster,\n } = options;\n\n const contentSize = content\n ? typeof content === 'string'\n ? content.length\n : content.byteLength\n : 0;\n const hasContent = contentSize > 0;\n\n // Priority 1: HTTP Range streaming for large files\n if (loadMethod === 'http_stream' && !hasContent && sessionId && getStreamUrl) {\n return {\n type: 'stream',\n sessionId,\n path,\n getStreamUrl,\n mimeType,\n title,\n poster,\n };\n }\n\n // Priority 2: Data URL (base64 string)\n if (typeof content === 'string' && hasContent) {\n return {\n type: 'data-url',\n data: content,\n title,\n poster,\n };\n }\n\n // Priority 3: ArrayBuffer → Blob\n if (content instanceof ArrayBuffer && hasContent) {\n return {\n type: 'blob',\n data: content,\n mimeType: mimeType || 'video/mp4',\n title,\n poster,\n };\n }\n\n // No valid content\n return null;\n}\n","/**\n * VideoPlayer - Unified Video Player Component\n *\n * Supports multiple modes:\n * - vidstack: Full-featured player (YouTube, Vimeo, HLS, DASH)\n * - native: Lightweight HTML5 player\n * - streaming: HTTP Range streaming with auth / Blob sources\n *\n * @example\n * // YouTube video\n * <VideoPlayer source={{ type: 'youtube', id: 'dQw4w9WgXcQ' }} />\n *\n * @example\n * // HLS stream\n * <VideoPlayer source={{ type: 'hls', url: 'https://example.com/video.m3u8' }} />\n *\n * @example\n * // HTTP Range streaming with auth (full source)\n * <VideoPlayer\n * source={{\n * type: 'stream',\n * sessionId: 'abc123',\n * path: '/videos/movie.mp4',\n * getStreamUrl: (id, path) => `/api/stream/${id}?path=${path}&token=${token}`\n * }}\n * />\n *\n * @example\n * // HTTP Range streaming (simplified, using VideoPlayerProvider context)\n * <VideoPlayerProvider sessionId={sessionId} getStreamUrl={getStreamUrl}>\n * <VideoPlayer source={{ type: 'stream', path: '/videos/movie.mp4' }} />\n * </VideoPlayerProvider>\n *\n * @example\n * // Blob/ArrayBuffer\n * <VideoPlayer source={{ type: 'blob', data: arrayBuffer, mimeType: 'video/mp4' }} />\n */\n\n'use client';\n\nimport React, { forwardRef, useMemo } from 'react';\n\nimport { VidstackProvider, NativeProvider, StreamProvider } from '../providers';\nimport { useVideoPlayerContext } from '../context';\nimport { resolvePlayerMode, isSimpleStreamSource, resolveStreamSource } from '../utils';\n\nimport type { VideoPlayerProps, VideoPlayerRef, VideoSourceUnion, VidstackProviderProps, NativeProviderProps, StreamProviderProps, SimpleStreamSource } from '../types';\n\nexport const VideoPlayer = forwardRef<VideoPlayerRef, VideoPlayerProps & { source: VideoSourceUnion | SimpleStreamSource }>(\n (\n {\n source: rawSource,\n mode = 'auto',\n aspectRatio = 16 / 9,\n autoPlay = false,\n muted = false,\n loop = false,\n playsInline = true,\n controls = true,\n preload = 'metadata',\n theme = 'default',\n showInfo = false,\n className,\n videoClassName,\n disableContextMenu = false,\n showPreloader = true,\n preloaderTimeout = 5000,\n errorFallback,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n },\n ref\n ) => {\n // Get context for simplified stream sources\n const context = useVideoPlayerContext();\n\n // Resolve simplified stream source to full source using context\n const source = useMemo(() => {\n if (isSimpleStreamSource(rawSource)) {\n const resolved = resolveStreamSource(rawSource, context);\n if (!resolved) {\n // Return a special error source that will trigger error fallback\n return null;\n }\n return resolved;\n }\n return rawSource;\n }, [rawSource, context]);\n\n // Handle unresolved source\n if (!source) {\n // Render error state\n const errorMessage = 'Stream source requires VideoPlayerProvider with getStreamUrl and sessionId';\n\n if (typeof errorFallback === 'function') {\n return (\n <div className={className} style={{ aspectRatio: aspectRatio === 'fill' ? undefined : aspectRatio }}>\n {errorFallback({ error: errorMessage })}\n </div>\n );\n }\n\n if (errorFallback) {\n return (\n <div className={className} style={{ aspectRatio: aspectRatio === 'fill' ? undefined : aspectRatio }}>\n {errorFallback}\n </div>\n );\n }\n\n // Default error UI\n return (\n <div\n className={className}\n style={{\n aspectRatio: aspectRatio === 'fill' ? undefined : aspectRatio,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'black',\n color: 'white',\n }}\n >\n <p>{errorMessage}</p>\n </div>\n );\n }\n\n // Determine which provider to use\n const resolvedMode = resolvePlayerMode(source, mode);\n\n // Common props for all providers\n const commonProps = {\n aspectRatio,\n autoPlay,\n muted,\n loop,\n playsInline,\n controls,\n preload,\n className,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n };\n\n // Render appropriate provider\n switch (resolvedMode) {\n case 'vidstack':\n return (\n <VidstackProvider\n ref={ref}\n source={source as VidstackProviderProps['source']}\n theme={theme}\n showInfo={showInfo}\n errorFallback={errorFallback}\n {...commonProps}\n />\n );\n\n case 'streaming':\n return (\n <StreamProvider\n ref={ref}\n source={source as StreamProviderProps['source']}\n videoClassName={videoClassName}\n disableContextMenu={disableContextMenu}\n showPreloader={showPreloader}\n preloaderTimeout={preloaderTimeout}\n errorFallback={errorFallback}\n {...commonProps}\n />\n );\n\n case 'native':\n default:\n return (\n <NativeProvider\n ref={ref}\n source={source as NativeProviderProps['source']}\n videoClassName={videoClassName}\n disableContextMenu={disableContextMenu}\n showPreloader={showPreloader}\n preloaderTimeout={preloaderTimeout}\n {...commonProps}\n />\n );\n }\n }\n);\n\nVideoPlayer.displayName = 'VideoPlayer';\n","/**\n * Custom Video Controls for Vidstack Player\n */\n\n'use client';\n\nimport { Maximize, Minimize, Pause, Play, Volume2, VolumeX } from 'lucide-react';\nimport React from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useMediaRemote, useMediaStore } from '@vidstack/react';\n\nimport type { MediaPlayerInstance } from '@vidstack/react';\ninterface VideoControlsProps {\n player: React.RefObject<MediaPlayerInstance | null>;\n className?: string;\n}\n\nexport function VideoControls({ player, className }: VideoControlsProps) {\n const store = useMediaStore(player);\n const remote = useMediaRemote();\n\n const isPaused = store.paused;\n const isMuted = store.muted;\n const isFullscreen = store.fullscreen;\n const currentTime = store.currentTime;\n const duration = store.duration;\n const volume = store.volume;\n\n const formatTime = (seconds: number): string => {\n if (!seconds || seconds < 0) return '0:00';\n const minutes = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${minutes}:${secs.toString().padStart(2, '0')}`;\n };\n\n const handleProgressClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!duration) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const percentage = clickX / rect.width;\n const newTime = percentage * duration;\n remote.seek(newTime);\n };\n\n const handleVolumeChange = (e: React.MouseEvent<HTMLDivElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const percentage = Math.max(0, Math.min(1, clickX / rect.width));\n remote.changeVolume(percentage);\n if (percentage > 0 && isMuted) {\n remote.toggleMuted();\n }\n };\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n return (\n <div\n className={cn(\n \"absolute inset-0 flex flex-col justify-end transition-opacity duration-300\",\n \"bg-gradient-to-t from-black/80 via-black/20 to-transparent\",\n \"opacity-0 group-hover:opacity-100 focus-within:opacity-100\",\n \"pointer-events-none group-hover:pointer-events-auto\",\n className\n )}\n >\n {/* Progress Bar */}\n <div className=\"px-4 pb-2 pointer-events-auto\">\n <div\n className=\"h-1.5 bg-white/20 rounded-full cursor-pointer hover:h-2 transition-all group\"\n onClick={handleProgressClick}\n >\n <div\n className=\"h-full bg-primary rounded-full transition-all relative group-hover:bg-primary/90\"\n style={{ width: `${progress}%` }}\n >\n <div className=\"absolute right-0 top-1/2 -translate-y-1/2 w-3 h-3 bg-white rounded-full opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n </div>\n </div>\n\n {/* Control Bar */}\n <div className=\"flex items-center gap-4 px-4 pb-4 pointer-events-auto\">\n {/* Play/Pause */}\n <button\n onClick={() => remote.togglePaused()}\n className=\"text-white hover:text-primary transition-colors p-1.5 hover:bg-white/10 rounded-full\"\n >\n {isPaused ? <Play className=\"h-6 w-6\" /> : <Pause className=\"h-6 w-6\" />}\n </button>\n\n {/* Time */}\n <div className=\"text-white text-sm font-medium\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </div>\n\n <div className=\"flex-1\" />\n\n {/* Volume Control */}\n <div className=\"flex items-center gap-2 group/volume\">\n <button\n onClick={() => remote.toggleMuted()}\n className=\"text-white hover:text-primary transition-colors p-1.5 hover:bg-white/10 rounded-full\"\n >\n {isMuted || volume === 0 ? (\n <VolumeX className=\"h-5 w-5\" />\n ) : (\n <Volume2 className=\"h-5 w-5\" />\n )}\n </button>\n\n <div\n className=\"w-0 group-hover/volume:w-20 transition-all overflow-hidden\"\n >\n <div\n className=\"h-1.5 bg-white/20 rounded-full cursor-pointer hover:h-2 transition-all\"\n onClick={handleVolumeChange}\n >\n <div\n className=\"h-full bg-white rounded-full transition-all\"\n style={{ width: `${volume * 100}%` }}\n />\n </div>\n </div>\n </div>\n\n {/* Fullscreen */}\n <button\n onClick={() => isFullscreen ? remote.exitFullscreen() : remote.enterFullscreen()}\n className=\"text-white hover:text-primary transition-colors p-1.5 hover:bg-white/10 rounded-full\"\n >\n {isFullscreen ? <Minimize className=\"h-5 w-5\" /> : <Maximize className=\"h-5 w-5\" />}\n </button>\n </div>\n </div>\n );\n}\n","/**\n * VideoErrorFallback - Pre-built error fallback with download button\n * For use with VideoPlayer errorFallback prop\n */\n\n'use client';\n\nimport React from 'react';\nimport { FileVideo, RefreshCw } from 'lucide-react';\n\nimport { cn, Button, DownloadButton } from '../../_shared';\n\nimport type { ErrorFallbackProps } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface VideoErrorFallbackProps extends ErrorFallbackProps {\n /** URL for download button (if provided, shows download button) */\n downloadUrl?: string;\n /** Filename for download */\n downloadFilename?: string;\n /** File size to display */\n fileSize?: string;\n /** Show retry button */\n showRetry?: boolean;\n /** Custom className */\n className?: string;\n /** Custom icon */\n icon?: React.ReactNode;\n /** Custom title (defaults to error message) */\n title?: string;\n /** Custom description */\n description?: string;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Pre-built error fallback component for VideoPlayer\n *\n * @example\n * // Basic usage\n * <VideoPlayer\n * source={source}\n * errorFallback={(props) => (\n * <VideoErrorFallback\n * {...props}\n * downloadUrl={getDownloadUrl()}\n * downloadFilename=\"video.mp4\"\n * />\n * )}\n * />\n *\n * @example\n * // With file size\n * <VideoErrorFallback\n * error=\"Failed to load video\"\n * downloadUrl=\"/api/download/video.mp4\"\n * fileSize=\"125 MB\"\n * showRetry\n * retry={() => reloadVideo()}\n * />\n */\nexport function VideoErrorFallback({\n error,\n retry,\n downloadUrl,\n downloadFilename,\n fileSize,\n showRetry = true,\n className,\n icon,\n title,\n description,\n}: VideoErrorFallbackProps) {\n const displayTitle = title || error || 'Video cannot be previewed';\n\n return (\n <div\n className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center gap-4 bg-black/90 text-white p-6',\n className\n )}\n >\n {/* Icon */}\n {icon || <FileVideo className=\"w-16 h-16 text-muted-foreground\" />}\n\n {/* Title */}\n <p className=\"text-lg font-medium text-center\">{displayTitle}</p>\n\n {/* Description / File size */}\n {(description || fileSize) && (\n <p className=\"text-sm text-muted-foreground text-center\">\n {description || fileSize}\n </p>\n )}\n\n {/* Actions */}\n <div className=\"flex items-center gap-3 mt-2\">\n {/* Retry button */}\n {showRetry && retry && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={retry}\n className=\"gap-2\"\n >\n <RefreshCw className=\"w-4 h-4\" />\n Retry\n </Button>\n )}\n\n {/* Download button */}\n {downloadUrl && (\n <DownloadButton\n url={downloadUrl}\n filename={downloadFilename}\n variant=\"default\"\n size=\"sm\"\n >\n Download to view\n </DownloadButton>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Factory for common use cases\n// ============================================================================\n\nexport interface CreateVideoErrorFallbackOptions {\n /** Function to get download URL from source */\n getDownloadUrl?: (source: unknown) => string | undefined;\n /** Function to get filename from source */\n getFilename?: (source: unknown) => string | undefined;\n /** Function to get file size from source */\n getFileSize?: (source: unknown) => string | undefined;\n /** Show retry button */\n showRetry?: boolean;\n}\n\n/**\n * Factory to create error fallback function for VideoPlayer\n *\n * @example\n * const errorFallback = createVideoErrorFallback({\n * getDownloadUrl: (source) => source.downloadUrl,\n * getFilename: (source) => source.filename,\n * showRetry: true,\n * });\n *\n * <VideoPlayer source={source} errorFallback={errorFallback} />\n */\nexport function createVideoErrorFallback(\n options: CreateVideoErrorFallbackOptions\n): (props: ErrorFallbackProps, source?: unknown) => React.ReactNode {\n return (props: ErrorFallbackProps, source?: unknown) => (\n <VideoErrorFallback\n {...props}\n downloadUrl={options.getDownloadUrl?.(source)}\n downloadFilename={options.getFilename?.(source)}\n fileSize={options.getFileSize?.(source)}\n showRetry={options.showRetry}\n />\n );\n}\n"]}
|
|
@@ -957,7 +957,7 @@ function resolvePlayerMode(source, mode = "auto") {
|
|
|
957
957
|
}
|
|
958
958
|
chunkWGEGR3DF_cjs.__name(resolvePlayerMode, "resolvePlayerMode");
|
|
959
959
|
function isSimpleStreamSource(source) {
|
|
960
|
-
return source.type === "stream" && !("getStreamUrl" in source);
|
|
960
|
+
return source != null && source.type === "stream" && !("getStreamUrl" in source);
|
|
961
961
|
}
|
|
962
962
|
chunkWGEGR3DF_cjs.__name(isSimpleStreamSource, "isSimpleStreamSource");
|
|
963
963
|
function resolveStreamSource(source, context) {
|
|
@@ -1353,5 +1353,5 @@ exports.resolveFileSource = resolveFileSource;
|
|
|
1353
1353
|
exports.resolvePlayerMode = resolvePlayerMode;
|
|
1354
1354
|
exports.resolveStreamSource = resolveStreamSource;
|
|
1355
1355
|
exports.useVideoPlayerContext = useVideoPlayerContext;
|
|
1356
|
-
//# sourceMappingURL=chunk-
|
|
1357
|
-
//# sourceMappingURL=chunk-
|
|
1356
|
+
//# sourceMappingURL=chunk-CY3CQS26.cjs.map
|
|
1357
|
+
//# sourceMappingURL=chunk-CY3CQS26.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/VideoPlayer/utils/debug.ts","../src/tools/VideoPlayer/providers/VidstackProvider.tsx","../src/tools/VideoPlayer/hooks/useVideoPlayerSettings.ts","../src/tools/VideoPlayer/providers/NativeProvider.tsx","../src/tools/VideoPlayer/providers/StreamProvider.tsx","../src/tools/VideoPlayer/context/VideoPlayerContext.tsx","../src/tools/VideoPlayer/utils/resolvers.ts","../src/tools/VideoPlayer/utils/fileSource.ts","../src/tools/VideoPlayer/components/VideoPlayer.tsx","../src/tools/VideoPlayer/components/VideoControls.tsx","../src/tools/VideoPlayer/components/VideoErrorFallback.tsx"],"names":["createMediaLogger","__name","jsxs","jsx","forwardRef","useRef","useState","useVideoCache","useMemo","generateOgImageUrl","useEffect","useCallback","useImperativeHandle","cn","MediaPlayer","MediaProvider","Poster","DefaultVideoLayout","defaultLayoutIcons","useVideoPlayerSettings","Fragment","Preloader","AspectRatio","DefaultErrorFallback","useMediaCacheStore","generateContentKey","createContext","useContext","useMediaStore","useMediaRemote","Play","Pause","VolumeX","Volume2","Minimize","Maximize","FileVideo","Button","RefreshCw","DownloadButton"],"mappings":"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","file":"chunk-CY3CQS26.cjs","sourcesContent":["'use client';\n\n/**\n * VideoPlayer Debug Logger\n *\n * Uses universal logger with media-specific helpers.\n * Logs go to both console (dev) and zustand store (for Console panel).\n */\n\nimport { createMediaLogger } from '@djangocfg/ui-core/lib';\n\nexport const videoDebug = createMediaLogger('VideoPlayer');\n\nexport default videoDebug;\n","/**\n * VidstackProvider - Full-featured video player using Vidstack\n * Supports YouTube, Vimeo, HLS, DASH, and direct URLs\n */\n\n'use client';\n\n// Import Vidstack base styles\nimport '@vidstack/react/player/styles/base.css';\nimport '@vidstack/react/player/styles/default/theme.css';\nimport '@vidstack/react/player/styles/default/layouts/video.css';\n\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\n\nimport { cn, generateOgImageUrl } from '@djangocfg/ui-core/lib';\nimport { MediaPlayer, MediaProvider, Poster } from '@vidstack/react';\nimport { defaultLayoutIcons, DefaultVideoLayout } from '@vidstack/react/player/layouts/default';\nimport { useVideoCache } from '../../../stores/mediaCache';\n\nimport type { MediaPlayerInstance, PlayerSrc } from '@vidstack/react';\nimport type { VidstackProviderProps, VideoPlayerRef, ErrorFallbackProps } from '../types';\nimport { videoDebug } from '../utils/debug';\n\n/**\n * Convert source to Vidstack-compatible format\n * Returns object with explicit type for HLS/DASH to ensure proper loader selection\n */\nfunction getVidstackSrc(source: VidstackProviderProps['source']): PlayerSrc {\n switch (source.type) {\n case 'youtube':\n return `youtube/${source.id}`;\n case 'vimeo':\n return `vimeo/${source.id}`;\n case 'hls':\n // Explicit type needed because URL may have query params that hide .m3u8 extension\n return { src: source.url, type: 'application/x-mpegurl' } as PlayerSrc;\n case 'dash':\n return { src: source.url, type: 'application/dash+xml' } as PlayerSrc;\n case 'url':\n return source.url;\n default:\n return '';\n }\n}\n\n/** Default error fallback UI */\nfunction DefaultErrorFallback({ error }: ErrorFallbackProps) {\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center gap-4 text-white bg-black\">\n <svg\n className=\"w-16 h-16 text-muted-foreground\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n <p className=\"text-lg\">{error || 'Video cannot be played'}</p>\n </div>\n );\n}\n\nexport const VidstackProvider = forwardRef<VideoPlayerRef, VidstackProviderProps>(\n (\n {\n source,\n aspectRatio = 16 / 9,\n autoPlay = false,\n muted = false,\n loop = false,\n playsInline = true,\n controls = true,\n className,\n showInfo = false,\n theme = 'default',\n errorFallback,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n },\n ref\n ) => {\n const playerRef = useRef<MediaPlayerInstance | null>(null);\n const [hasError, setHasError] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string>('Video cannot be played');\n const lastSavedTimeRef = useRef<number>(0);\n const hasRestoredPositionRef = useRef(false);\n\n // Cache hooks\n const {\n getPosterUrl,\n cachePosterUrl,\n saveVideoPosition,\n getVideoPosition,\n } = useVideoCache();\n\n // Get source key for position caching\n const sourceKey = useMemo(() => {\n switch (source.type) {\n case 'youtube':\n return `youtube:${source.id}`;\n case 'vimeo':\n return `vimeo:${source.id}`;\n case 'hls':\n case 'dash':\n case 'url':\n return `url:${source.url}`;\n default:\n return null;\n }\n }, [source]);\n\n // Generate poster if not provided, with caching\n const posterUrl = useMemo(() => {\n if (source.poster) return source.poster;\n if (!source.title) return undefined;\n\n // Check cache first\n const cached = getPosterUrl(source.title);\n if (cached) return cached;\n\n // Generate and cache\n const url = generateOgImageUrl({ title: source.title });\n cachePosterUrl(source.title, url);\n return url;\n }, [source.poster, source.title, getPosterUrl, cachePosterUrl]);\n\n // Get Vidstack-compatible source URL\n const vidstackSrc = useMemo(() => getVidstackSrc(source), [source]);\n\n // Debug: Log video source\n useEffect(() => {\n const srcString = typeof vidstackSrc === 'string' ? vidstackSrc : (vidstackSrc as { src: string }).src;\n videoDebug.load(srcString, source.type);\n }, [vidstackSrc, source.type]);\n\n // Retry function\n const retry = useCallback(() => {\n setHasError(false);\n setErrorMessage('Video cannot be played');\n // Force reload by updating key would be needed, but for now just reset state\n const player = playerRef.current;\n if (player) {\n player.currentTime = 0;\n player.play();\n }\n }, []);\n\n // Expose player methods via ref\n useImperativeHandle(\n ref,\n () => {\n const player = playerRef.current;\n\n return {\n play: () => player?.play(),\n pause: () => player?.pause(),\n togglePlay: () => {\n if (player) {\n player.paused ? player.play() : player.pause();\n }\n },\n seekTo: (time: number) => {\n if (player) player.currentTime = time;\n },\n setVolume: (volume: number) => {\n if (player) player.volume = Math.max(0, Math.min(1, volume));\n },\n toggleMute: () => {\n if (player) player.muted = !player.muted;\n },\n enterFullscreen: () => player?.enterFullscreen(),\n exitFullscreen: () => player?.exitFullscreen(),\n get currentTime() {\n return player?.currentTime ?? 0;\n },\n get duration() {\n return player?.duration ?? 0;\n },\n get paused() {\n return player?.paused ?? true;\n },\n };\n },\n []\n );\n\n const handlePlay = () => onPlay?.();\n\n const handlePause = useCallback(() => {\n // Save position on pause\n const player = playerRef.current;\n if (sourceKey && player && player.currentTime > 0) {\n saveVideoPosition(sourceKey, player.currentTime);\n lastSavedTimeRef.current = player.currentTime;\n }\n onPause?.();\n }, [sourceKey, saveVideoPosition, onPause]);\n\n const handleEnded = () => onEnded?.();\n\n const handleError = (detail: unknown) => {\n const error = detail as { message?: string };\n const msg = error?.message || 'Video playback error';\n videoDebug.error('Vidstack error', { message: msg });\n setHasError(true);\n setErrorMessage(msg);\n onError?.(msg);\n };\n\n const handleLoadStart = () => onLoadStart?.();\n\n const handleCanPlay = useCallback(() => {\n const player = playerRef.current;\n if (player) {\n videoDebug.state('canplay', { duration: player.duration });\n // Log buffer state if media element is available\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n }\n setHasError(false);\n\n // Restore position from cache (only once per source)\n if (sourceKey && player && !hasRestoredPositionRef.current) {\n const cachedPosition = getVideoPosition(sourceKey);\n if (cachedPosition && cachedPosition > 0) {\n const duration = player.duration;\n // Only restore if position is valid (not at the end)\n if (cachedPosition < duration - 1) {\n videoDebug.debug(`Restoring position: ${cachedPosition}s`);\n player.currentTime = cachedPosition;\n }\n }\n hasRestoredPositionRef.current = true;\n }\n\n onCanPlay?.();\n }, [sourceKey, getVideoPosition, onCanPlay]);\n\n const handleTimeUpdate = useCallback(() => {\n const player = playerRef.current;\n if (!player) return;\n\n // Save position every 5 seconds\n if (sourceKey && player.currentTime > 0) {\n const timeSinceLastSave = player.currentTime - lastSavedTimeRef.current;\n if (timeSinceLastSave >= 5 || timeSinceLastSave < 0) {\n saveVideoPosition(sourceKey, player.currentTime);\n lastSavedTimeRef.current = player.currentTime;\n }\n }\n\n onTimeUpdate?.(player.currentTime, player.duration);\n }, [sourceKey, saveVideoPosition, onTimeUpdate]);\n\n // Reset position restoration flag when source changes\n useEffect(() => {\n hasRestoredPositionRef.current = false;\n lastSavedTimeRef.current = 0;\n }, [sourceKey]);\n\n // Debug: Log player events\n useEffect(() => {\n const player = playerRef.current;\n if (!player) return;\n\n const handleSeeking = () => {\n videoDebug.event('seeking', { currentTime: player.currentTime });\n };\n\n const handleSeeked = () => {\n videoDebug.event('seeked', { currentTime: player.currentTime });\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n };\n\n const handleWaiting = () => {\n videoDebug.warn('WAITING - buffering...');\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n };\n\n const handleStalled = () => {\n videoDebug.warn('STALLED - network issue');\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n };\n\n player.addEventListener('seeking', handleSeeking);\n player.addEventListener('seeked', handleSeeked);\n player.addEventListener('waiting', handleWaiting);\n player.addEventListener('stalled', handleStalled);\n\n return () => {\n player.removeEventListener('seeking', handleSeeking);\n player.removeEventListener('seeked', handleSeeked);\n player.removeEventListener('waiting', handleWaiting);\n player.removeEventListener('stalled', handleStalled);\n };\n }, [vidstackSrc]);\n\n // Determine layout mode\n const isFillMode = aspectRatio === 'fill';\n const computedAspectRatio = aspectRatio === 'auto' || aspectRatio === 'fill' ? undefined : aspectRatio;\n\n // Render error fallback\n const renderErrorFallback = () => {\n const fallbackProps: ErrorFallbackProps = { error: errorMessage, retry };\n\n if (typeof errorFallback === 'function') {\n return errorFallback(fallbackProps);\n }\n\n if (errorFallback) {\n return errorFallback;\n }\n\n return <DefaultErrorFallback {...fallbackProps} />;\n };\n\n // Container styles based on mode\n const containerStyles = isFillMode\n ? { width: '100%', height: '100%' }\n : { aspectRatio: computedAspectRatio };\n\n return (\n <div className={cn(isFillMode ? 'w-full h-full' : 'w-full', className)}>\n <div\n className={cn(\n 'relative w-full rounded-sm bg-black overflow-hidden',\n isFillMode && 'h-full',\n theme === 'minimal' && 'rounded-none',\n theme === 'modern' && 'rounded-xl shadow-2xl'\n )}\n style={containerStyles}\n >\n {hasError ? (\n renderErrorFallback()\n ) : (\n <MediaPlayer\n ref={playerRef}\n title={source.title || 'Video'}\n src={vidstackSrc}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n playsInline={playsInline}\n onPlay={handlePlay}\n onPause={handlePause}\n onEnded={handleEnded}\n onError={handleError}\n onLoadStart={handleLoadStart}\n onCanPlay={handleCanPlay}\n onTimeUpdate={handleTimeUpdate}\n className=\"w-full h-full\"\n >\n <MediaProvider />\n\n {posterUrl && (\n <Poster\n className=\"vds-poster\"\n src={posterUrl}\n alt={source.title || 'Video poster'}\n style={{ objectFit: 'cover' }}\n />\n )}\n\n {controls && <DefaultVideoLayout icons={defaultLayoutIcons} thumbnails={posterUrl} />}\n </MediaPlayer>\n )}\n </div>\n\n {showInfo && source.title && (\n <div className=\"mt-4 space-y-2\">\n <h3 className=\"text-xl font-semibold text-foreground\">{source.title}</h3>\n </div>\n )}\n </div>\n );\n }\n);\n\nVidstackProvider.displayName = 'VidstackProvider';\n","'use client';\n\n/**\n * useVideoPlayerSettings - Hook for persisted video player settings\n *\n * Provides volume and loop settings that persist in localStorage.\n * Use this hook in video player providers to apply saved settings.\n *\n * @example\n * const { settings, updateVolume, updateLoop } = useVideoPlayerSettings();\n *\n * // Apply to video element\n * videoRef.current.volume = settings.volume;\n * videoRef.current.loop = settings.isLooping;\n *\n * // Save when user changes\n * const handleVolumeChange = (vol: number) => {\n * videoRef.current.volume = vol;\n * updateVolume(vol);\n * };\n */\n\nimport { useCallback } from 'react';\nimport { useVideoPlayerSettings as useSettings } from '../../../stores/mediaCache';\n\nexport interface VideoPlayerSettingsReturn {\n /** Current settings */\n settings: {\n volume: number;\n isLooping: boolean;\n };\n /** Update volume (0-1) */\n updateVolume: (volume: number) => void;\n /** Update loop setting */\n updateLoop: (isLooping: boolean) => void;\n /** Update multiple settings at once */\n updateSettings: (settings: { volume?: number; isLooping?: boolean }) => void;\n}\n\nexport function useVideoPlayerSettings(): VideoPlayerSettingsReturn {\n const { settings, saveSettings } = useSettings();\n\n const updateVolume = useCallback(\n (volume: number) => {\n saveSettings({ volume: Math.max(0, Math.min(1, volume)) });\n },\n [saveSettings]\n );\n\n const updateLoop = useCallback(\n (isLooping: boolean) => {\n saveSettings({ isLooping });\n },\n [saveSettings]\n );\n\n const updateSettings = useCallback(\n (newSettings: { volume?: number; isLooping?: boolean }) => {\n saveSettings(newSettings);\n },\n [saveSettings]\n );\n\n return {\n settings,\n updateVolume,\n updateLoop,\n updateSettings,\n };\n}\n","/**\n * NativeProvider - Lightweight native HTML5 video player\n * For demo videos, background videos, autoplay loop muted scenarios\n */\n\n'use client';\n\nimport React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { Preloader, AspectRatio } from '@djangocfg/ui-core';\nimport { useVideoPlayerSettings } from '../hooks/useVideoPlayerSettings';\n\nimport type { NativeProviderProps, VideoPlayerRef } from '../types';\nimport { videoDebug } from '../utils/debug';\n\n/**\n * Get video URL from source\n */\nfunction getVideoUrl(source: NativeProviderProps['source']): string {\n switch (source.type) {\n case 'url':\n return source.url;\n case 'data-url':\n return source.data;\n default:\n return '';\n }\n}\n\nexport const NativeProvider = forwardRef<VideoPlayerRef, NativeProviderProps>(\n (\n {\n source,\n aspectRatio = 16 / 9,\n autoPlay = true,\n muted = true,\n loop = true,\n playsInline = true,\n preload = 'auto',\n controls = false,\n disableContextMenu = true,\n showPreloader = true,\n preloaderTimeout = 5000,\n className,\n videoClassName,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n },\n ref\n ) => {\n const [isLoading, setIsLoading] = useState(showPreloader);\n const videoRef = useRef<HTMLVideoElement>(null);\n\n // Persisted player settings\n const { settings: savedSettings, updateVolume } = useVideoPlayerSettings();\n\n const videoUrl = getVideoUrl(source);\n\n // Debug: Log video source\n useEffect(() => {\n videoDebug.load(videoUrl, source.type);\n }, [videoUrl, source.type]);\n\n // Expose video element methods via ref\n useImperativeHandle(\n ref,\n () => ({\n play: () => videoRef.current?.play(),\n pause: () => videoRef.current?.pause(),\n togglePlay: () => {\n const video = videoRef.current;\n if (video) {\n video.paused ? video.play() : video.pause();\n }\n },\n seekTo: (time: number) => {\n if (videoRef.current) videoRef.current.currentTime = time;\n },\n setVolume: (volume: number) => {\n if (videoRef.current) videoRef.current.volume = Math.max(0, Math.min(1, volume));\n },\n toggleMute: () => {\n if (videoRef.current) videoRef.current.muted = !videoRef.current.muted;\n },\n enterFullscreen: () => videoRef.current?.requestFullscreen(),\n exitFullscreen: () => document.exitFullscreen(),\n get currentTime() {\n return videoRef.current?.currentTime ?? 0;\n },\n get duration() {\n return videoRef.current?.duration ?? 0;\n },\n get paused() {\n return videoRef.current?.paused ?? true;\n },\n }),\n []\n );\n\n useEffect(() => {\n if (!showPreloader) return;\n\n const video = videoRef.current;\n if (!video) return;\n\n // Check if video is already loaded\n if (video.readyState >= 3) {\n setIsLoading(false);\n return;\n }\n\n const hideLoader = () => setIsLoading(false);\n\n video.addEventListener('canplay', hideLoader);\n video.addEventListener('loadeddata', hideLoader);\n video.addEventListener('playing', hideLoader);\n\n // Fallback: hide loader after timeout\n const timeout = setTimeout(hideLoader, preloaderTimeout);\n\n return () => {\n video.removeEventListener('canplay', hideLoader);\n video.removeEventListener('loadeddata', hideLoader);\n video.removeEventListener('playing', hideLoader);\n clearTimeout(timeout);\n };\n }, [showPreloader, preloaderTimeout]);\n\n // Debug: Log video events\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleLoadedMetadata = () => {\n videoDebug.state('loadedmetadata', { duration: video.duration });\n };\n\n const handleCanPlayDebug = () => {\n videoDebug.state('canplay', { duration: video.duration, buffered: video.buffered.length });\n videoDebug.buffer(video.buffered, video.duration);\n // Apply saved volume\n video.volume = savedSettings.volume;\n };\n\n const handleSeeking = () => {\n videoDebug.event('seeking', { currentTime: video.currentTime });\n };\n\n const handleSeeked = () => {\n videoDebug.event('seeked', { currentTime: video.currentTime });\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleWaiting = () => {\n videoDebug.warn('WAITING - buffering...');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleStalled = () => {\n videoDebug.warn('STALLED - network issue');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n video.addEventListener('canplay', handleCanPlayDebug);\n video.addEventListener('seeking', handleSeeking);\n video.addEventListener('seeked', handleSeeked);\n video.addEventListener('waiting', handleWaiting);\n video.addEventListener('stalled', handleStalled);\n\n return () => {\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n video.removeEventListener('canplay', handleCanPlayDebug);\n video.removeEventListener('seeking', handleSeeking);\n video.removeEventListener('seeked', handleSeeked);\n video.removeEventListener('waiting', handleWaiting);\n video.removeEventListener('stalled', handleStalled);\n };\n }, [savedSettings.volume]);\n\n // Persist volume when user changes it via native controls\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleVolumeChange = () => {\n updateVolume(video.volume);\n };\n\n video.addEventListener('volumechange', handleVolumeChange);\n return () => video.removeEventListener('volumechange', handleVolumeChange);\n }, [updateVolume]);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (disableContextMenu) {\n e.preventDefault();\n }\n };\n\n const handleError = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n const video = e.currentTarget;\n const errorMsg = video.error?.message || 'Video playback error';\n videoDebug.error('Video error', { code: video.error?.code, message: errorMsg });\n setIsLoading(false);\n onError?.(errorMsg);\n };\n\n const handleTimeUpdate = () => {\n const video = videoRef.current;\n if (video && onTimeUpdate) {\n onTimeUpdate(video.currentTime, video.duration);\n }\n };\n\n // Determine if we should use AspectRatio wrapper or fill mode\n const isFillMode = aspectRatio === 'fill';\n const computedAspectRatio = aspectRatio === 'auto' || aspectRatio === 'fill' ? undefined : aspectRatio;\n\n // Video content\n const videoContent = (\n <>\n {/* Preloader */}\n {showPreloader && isLoading && (\n <div\n className={cn(\n 'absolute inset-0 flex items-center justify-center bg-muted/30 backdrop-blur-sm z-10'\n )}\n >\n <Preloader size=\"lg\" spinnerClassName=\"text-white\" />\n </div>\n )}\n\n {/* Video */}\n <video\n ref={videoRef}\n className={cn('w-full h-full object-cover', videoClassName)}\n src={videoUrl}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n playsInline={playsInline}\n preload={preload}\n controls={controls}\n poster={source.poster}\n onContextMenu={handleContextMenu}\n onLoadStart={onLoadStart}\n onCanPlay={onCanPlay}\n onPlay={onPlay}\n onPause={onPause}\n onPlaying={() => setIsLoading(false)}\n onEnded={onEnded}\n onError={handleError}\n onTimeUpdate={handleTimeUpdate}\n />\n </>\n );\n\n // Fill mode - no AspectRatio wrapper\n if (isFillMode) {\n return (\n <div className={cn('relative w-full h-full overflow-hidden', className)}>\n {videoContent}\n </div>\n );\n }\n\n // Normal mode with AspectRatio\n return (\n <div className={cn('relative overflow-hidden', className)}>\n <AspectRatio ratio={computedAspectRatio}>\n {videoContent}\n </AspectRatio>\n </div>\n );\n }\n);\n\nNativeProvider.displayName = 'NativeProvider';\n","/**\n * StreamProvider - HTTP Range streaming and Blob video player\n * Supports:\n * - HTTP Range requests with authorization (for large files)\n * - Blob/ArrayBuffer sources\n * - Data URL sources\n * - Fill parent container mode\n * - Custom error fallback\n */\n\n'use client';\n\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { Preloader, AspectRatio } from '@djangocfg/ui-core';\nimport { useMediaCacheStore, generateContentKey } from '../../../stores/mediaCache';\nimport { useVideoPlayerSettings } from '../hooks/useVideoPlayerSettings';\n\nimport type { StreamProviderProps, VideoPlayerRef, StreamSource, BlobSource, DataUrlSource, ErrorFallbackProps } from '../types';\nimport { videoDebug } from '../utils/debug';\n\n/** Default error fallback UI */\nfunction DefaultErrorFallback({ error }: ErrorFallbackProps) {\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center gap-4 text-white\">\n <svg\n className=\"w-16 h-16 text-muted-foreground\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n <p className=\"text-lg\">{error || 'Video cannot be previewed'}</p>\n </div>\n );\n}\n\nexport const StreamProvider = forwardRef<VideoPlayerRef, StreamProviderProps>(\n (\n {\n source,\n aspectRatio = 16 / 9,\n autoPlay = false,\n muted = false,\n loop = false,\n playsInline = true,\n preload = 'metadata',\n controls = true,\n disableContextMenu = false,\n showPreloader = true,\n preloaderTimeout = 10000,\n className,\n videoClassName,\n errorFallback,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n onBufferProgress,\n },\n ref\n ) => {\n const [videoUrl, setVideoUrl] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string>('Video cannot be previewed');\n const videoRef = useRef<HTMLVideoElement>(null);\n const contentKeyRef = useRef<string | null>(null);\n const lastSavedTimeRef = useRef<number>(0);\n\n // Get stable function references from store (not from hook to avoid re-renders)\n const getOrCreateBlobUrl = useMediaCacheStore.getState().getOrCreateBlobUrl;\n const releaseBlobUrl = useMediaCacheStore.getState().releaseBlobUrl;\n const getOrCreateStreamUrl = useMediaCacheStore.getState().getOrCreateStreamUrl;\n const saveVideoPosition = useMediaCacheStore.getState().saveVideoPosition;\n const getVideoPosition = useMediaCacheStore.getState().getVideoPosition;\n\n // Persisted player settings\n const { settings: savedSettings, updateVolume } = useVideoPlayerSettings();\n\n // Retry function for error fallback\n // Regenerates URL for stream sources to get fresh token/session\n const retry = useCallback(() => {\n setHasError(false);\n setIsLoading(true);\n\n // For stream sources, regenerate URL bypassing cache\n if (source.type === 'stream') {\n const streamSource = source as StreamSource;\n const freshUrl = streamSource.getStreamUrl(streamSource.sessionId, streamSource.path);\n setVideoUrl(freshUrl);\n return;\n }\n\n // For other sources, just reload\n const video = videoRef.current;\n if (video && videoUrl) {\n video.load();\n }\n }, [source, videoUrl]);\n\n // Expose video element methods via ref\n useImperativeHandle(\n ref,\n () => ({\n play: () => videoRef.current?.play(),\n pause: () => videoRef.current?.pause(),\n togglePlay: () => {\n const video = videoRef.current;\n if (video) {\n video.paused ? video.play() : video.pause();\n }\n },\n seekTo: (time: number) => {\n if (videoRef.current) videoRef.current.currentTime = time;\n },\n setVolume: (volume: number) => {\n if (videoRef.current) videoRef.current.volume = Math.max(0, Math.min(1, volume));\n },\n toggleMute: () => {\n if (videoRef.current) videoRef.current.muted = !videoRef.current.muted;\n },\n enterFullscreen: () => videoRef.current?.requestFullscreen(),\n exitFullscreen: () => document.exitFullscreen(),\n get currentTime() {\n return videoRef.current?.currentTime ?? 0;\n },\n get duration() {\n return videoRef.current?.duration ?? 0;\n },\n get paused() {\n return videoRef.current?.paused ?? true;\n },\n }),\n []\n );\n\n // Track unmount for cleanup\n const isMountedRef = useRef(true);\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n // Release blob URL only on actual unmount\n if (contentKeyRef.current) {\n useMediaCacheStore.getState().releaseBlobUrl(contentKeyRef.current);\n contentKeyRef.current = null;\n }\n };\n }, []);\n\n // Create video URL based on source type with caching\n useEffect(() => {\n // Release previous blob URL if source changed\n if (contentKeyRef.current) {\n const newKey = source.type === 'blob'\n ? generateContentKey((source as BlobSource).data)\n : null;\n if (newKey !== contentKeyRef.current) {\n releaseBlobUrl(contentKeyRef.current);\n contentKeyRef.current = null;\n }\n }\n\n setHasError(false);\n setIsLoading(true);\n\n switch (source.type) {\n case 'stream': {\n const streamSource = source as StreamSource;\n // Use cached stream URL\n const url = getOrCreateStreamUrl(\n streamSource.sessionId,\n streamSource.path,\n streamSource.getStreamUrl\n );\n videoDebug.load(url, 'stream');\n setVideoUrl(url);\n break;\n }\n\n case 'blob': {\n const blobSource = source as BlobSource;\n // Generate content key for caching\n const contentKey = generateContentKey(blobSource.data);\n contentKeyRef.current = contentKey;\n // Use cached blob URL\n const url = getOrCreateBlobUrl(\n contentKey,\n blobSource.data,\n blobSource.mimeType || 'video/mp4'\n );\n videoDebug.load(url, 'blob');\n setVideoUrl(url);\n break;\n }\n\n case 'data-url': {\n const dataUrlSource = source as DataUrlSource;\n videoDebug.load(dataUrlSource.data.slice(0, 50) + '...', 'data-url');\n setVideoUrl(dataUrlSource.data);\n break;\n }\n\n default:\n videoDebug.error('Invalid video source type', { type: (source as { type: string }).type });\n setVideoUrl(null);\n setHasError(true);\n setErrorMessage('Invalid video source');\n }\n\n // No cleanup here - cleanup happens in unmount effect above\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [source]);\n\n // Get source key for position caching\n const getSourceKey = useCallback(() => {\n switch (source.type) {\n case 'stream':\n return `stream:${(source as StreamSource).sessionId}:${(source as StreamSource).path}`;\n case 'blob':\n return contentKeyRef.current ? `blob:${contentKeyRef.current}` : null;\n case 'data-url':\n return `data:${(source as DataUrlSource).data.slice(0, 50)}`;\n default:\n return null;\n }\n }, [source]);\n\n // Restore cached playback position and settings when video is ready\n const handleCanPlay = useCallback(() => {\n const video = videoRef.current;\n if (video) {\n videoDebug.state('canplay', { duration: video.duration, buffered: video.buffered.length });\n videoDebug.buffer(video.buffered, video.duration);\n\n // Apply saved volume (user preference)\n video.volume = savedSettings.volume;\n }\n setIsLoading(false);\n\n // Restore position from cache\n const sourceKey = getSourceKey();\n if (sourceKey && video) {\n const cachedPosition = getVideoPosition(sourceKey);\n if (cachedPosition && cachedPosition > 0) {\n const duration = video.duration;\n // Only restore if position is valid (not at the end)\n if (cachedPosition < duration - 1) {\n videoDebug.debug(`Restoring position: ${cachedPosition}s`);\n video.currentTime = cachedPosition;\n }\n }\n }\n\n onCanPlay?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getSourceKey, onCanPlay, savedSettings.volume]);\n\n // Save playback position periodically\n const handleTimeUpdate = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n\n // Save position every 5 seconds\n const sourceKey = getSourceKey();\n if (sourceKey && video.currentTime > 0) {\n const timeSinceLastSave = video.currentTime - lastSavedTimeRef.current;\n if (timeSinceLastSave >= 5 || timeSinceLastSave < 0) {\n saveVideoPosition(sourceKey, video.currentTime);\n lastSavedTimeRef.current = video.currentTime;\n }\n }\n\n onTimeUpdate?.(video.currentTime, video.duration);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getSourceKey, onTimeUpdate]);\n\n // Save position on pause\n const handlePause = useCallback(() => {\n const video = videoRef.current;\n const sourceKey = getSourceKey();\n if (sourceKey && video && video.currentTime > 0) {\n saveVideoPosition(sourceKey, video.currentTime);\n lastSavedTimeRef.current = video.currentTime;\n }\n onPause?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getSourceKey, onPause]);\n\n // Handle buffer progress\n const handleProgress = useCallback(() => {\n const video = videoRef.current;\n if (!video || !onBufferProgress) return;\n\n // Get the buffered time ranges\n if (video.buffered.length > 0) {\n // Get the end of the last buffered range\n const bufferedEnd = video.buffered.end(video.buffered.length - 1);\n const duration = video.duration;\n\n if (duration > 0 && !isNaN(bufferedEnd)) {\n onBufferProgress(bufferedEnd, duration);\n }\n }\n }, [onBufferProgress]);\n\n // Preloader timeout\n useEffect(() => {\n if (!showPreloader || !isLoading) return;\n\n const timeout = setTimeout(() => {\n setIsLoading(false);\n }, preloaderTimeout);\n\n return () => clearTimeout(timeout);\n }, [showPreloader, isLoading, preloaderTimeout]);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (disableContextMenu) {\n e.preventDefault();\n }\n };\n\n const handleLoadedData = () => {\n setIsLoading(false);\n };\n\n const handleError = () => {\n const video = videoRef.current;\n if (video) {\n videoDebug.error('Video error', { code: video.error?.code, message: video.error?.message });\n }\n setIsLoading(false);\n setHasError(true);\n setErrorMessage('Failed to load video');\n onError?.('Video playback error');\n };\n\n // Debug: Log video events\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleLoadedMetadata = () => {\n videoDebug.state('loadedmetadata', { duration: video.duration });\n };\n\n const handleSeeking = () => {\n videoDebug.event('seeking', { currentTime: video.currentTime });\n };\n\n const handleSeeked = () => {\n videoDebug.event('seeked', { currentTime: video.currentTime });\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleWaiting = () => {\n videoDebug.warn('WAITING - buffering...');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleStalled = () => {\n videoDebug.warn('STALLED - network issue');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n video.addEventListener('seeking', handleSeeking);\n video.addEventListener('seeked', handleSeeked);\n video.addEventListener('waiting', handleWaiting);\n video.addEventListener('stalled', handleStalled);\n\n return () => {\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n video.removeEventListener('seeking', handleSeeking);\n video.removeEventListener('seeked', handleSeeked);\n video.removeEventListener('waiting', handleWaiting);\n video.removeEventListener('stalled', handleStalled);\n };\n }, [videoUrl]);\n\n // Persist volume when user changes it via native controls\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleVolumeChange = () => {\n updateVolume(video.volume);\n };\n\n video.addEventListener('volumechange', handleVolumeChange);\n return () => video.removeEventListener('volumechange', handleVolumeChange);\n }, [videoUrl, updateVolume]);\n\n // Determine if we should use AspectRatio wrapper or fill mode\n const isFillMode = aspectRatio === 'fill';\n const computedAspectRatio = aspectRatio === 'auto' || aspectRatio === 'fill' ? undefined : aspectRatio;\n\n // Render error fallback\n const renderErrorFallback = () => {\n const fallbackProps: ErrorFallbackProps = { error: errorMessage, retry };\n\n if (typeof errorFallback === 'function') {\n return errorFallback(fallbackProps);\n }\n\n if (errorFallback) {\n return errorFallback;\n }\n\n return <DefaultErrorFallback {...fallbackProps} />;\n };\n\n // Error state\n if (!videoUrl || hasError) {\n if (isFillMode) {\n return (\n <div className={cn('relative w-full h-full overflow-hidden bg-black', className)}>\n {renderErrorFallback()}\n </div>\n );\n }\n\n return (\n <div className={cn('relative overflow-hidden bg-black', className)}>\n <AspectRatio ratio={computedAspectRatio}>\n {renderErrorFallback()}\n </AspectRatio>\n </div>\n );\n }\n\n // Video content\n const videoContent = (\n <>\n {/* Loading indicator */}\n {showPreloader && isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50 z-10\">\n <Preloader size=\"lg\" spinnerClassName=\"text-white\" />\n </div>\n )}\n\n {/* Video element */}\n <video\n ref={videoRef}\n src={videoUrl}\n className={cn(\n 'w-full h-full object-contain',\n isLoading && 'opacity-0',\n videoClassName\n )}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n playsInline={playsInline}\n preload={preload}\n controls={controls}\n crossOrigin=\"anonymous\"\n poster={source.poster}\n onContextMenu={handleContextMenu}\n onLoadStart={onLoadStart}\n onCanPlay={handleCanPlay}\n onLoadedData={handleLoadedData}\n onPlay={onPlay}\n onPause={handlePause}\n onEnded={onEnded}\n onError={handleError}\n onTimeUpdate={handleTimeUpdate}\n onProgress={handleProgress}\n />\n </>\n );\n\n // Fill mode - no AspectRatio wrapper\n if (isFillMode) {\n return (\n <div className={cn('relative w-full h-full overflow-hidden bg-black', className)}>\n {videoContent}\n </div>\n );\n }\n\n // Normal mode with AspectRatio\n return (\n <div className={cn('relative overflow-hidden bg-black', className)}>\n <AspectRatio ratio={computedAspectRatio}>\n {videoContent}\n </AspectRatio>\n </div>\n );\n }\n);\n\nStreamProvider.displayName = 'StreamProvider';\n","/**\n * VideoPlayerContext - Context for streaming configuration\n * Simplifies streaming API by providing getStreamUrl globally\n */\n\n'use client';\n\nimport React, { createContext, useContext, useMemo } from 'react';\n\nimport type { VideoPlayerContextValue, VideoPlayerProviderProps } from '../types';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst VideoPlayerContext = createContext<VideoPlayerContextValue | null>(null);\n\n/**\n * Provider for VideoPlayer streaming configuration\n *\n * @example\n * // In your app layout or FileWorkspace\n * <VideoPlayerProvider\n * sessionId={sessionId}\n * getStreamUrl={terminalClient.terminal_media.streamStreamRetrieveUrl}\n * >\n * <VideoPlayer source={{ type: 'stream', path: '/video.mp4' }} />\n * </VideoPlayerProvider>\n */\nexport function VideoPlayerProvider({\n children,\n getStreamUrl,\n sessionId,\n}: VideoPlayerProviderProps) {\n const value = useMemo(\n () => ({ getStreamUrl, sessionId }),\n [getStreamUrl, sessionId]\n );\n\n return (\n <VideoPlayerContext.Provider value={value}>\n {children}\n </VideoPlayerContext.Provider>\n );\n}\n\n/**\n * Hook to access VideoPlayer context\n */\nexport function useVideoPlayerContext(): VideoPlayerContextValue | null {\n return useContext(VideoPlayerContext);\n}\n","/**\n * Video source and player mode resolvers\n */\n\nimport type { VideoSourceUnion, PlayerMode, SimpleStreamSource, StreamSource, VideoPlayerContextValue } from '../types';\n\n/**\n * Determine which provider to use based on source type\n */\nexport function resolvePlayerMode(\n source: VideoSourceUnion,\n mode: PlayerMode = 'auto'\n): 'vidstack' | 'native' | 'streaming' {\n if (mode !== 'auto') {\n return mode;\n }\n\n switch (source.type) {\n case 'youtube':\n case 'vimeo':\n case 'hls':\n case 'dash':\n return 'vidstack';\n\n case 'stream':\n case 'blob':\n return 'streaming';\n\n case 'data-url':\n case 'url':\n default:\n return 'native';\n }\n}\n\n/**\n * Check if source is a simplified stream source (without getStreamUrl)\n */\nexport function isSimpleStreamSource(\n source: VideoSourceUnion | SimpleStreamSource | undefined | null\n): source is SimpleStreamSource {\n return source != null && source.type === 'stream' && !('getStreamUrl' in source);\n}\n\n/**\n * Resolve simplified stream source to full stream source using context\n */\nexport function resolveStreamSource(\n source: SimpleStreamSource,\n context: VideoPlayerContextValue | null\n): StreamSource | null {\n if (!context?.getStreamUrl) {\n console.warn(\n 'VideoPlayer: Stream source requires getStreamUrl. ' +\n 'Either provide it in source or wrap with VideoPlayerProvider.'\n );\n return null;\n }\n\n const sessionId = source.sessionId || context.sessionId;\n if (!sessionId) {\n console.warn('VideoPlayer: Stream source requires sessionId.');\n return null;\n }\n\n return {\n type: 'stream',\n sessionId,\n path: source.path,\n getStreamUrl: context.getStreamUrl,\n mimeType: source.mimeType,\n title: source.title,\n poster: source.poster,\n };\n}\n","/**\n * File source resolution utilities\n */\n\nimport type { VideoSourceUnion, ResolveFileSourceOptions } from '../types';\n\n/**\n * Resolve file content to VideoSourceUnion\n * Useful for FileWorkspace/file manager integrations\n *\n * @example\n * const source = resolveFileSource({\n * content: file.content,\n * path: file.path,\n * mimeType: file.mimeType,\n * sessionId: sessionId,\n * loadMethod: file.loadMethod,\n * getStreamUrl: terminalClient.terminal_media.streamStreamRetrieveUrl\n * });\n *\n * <VideoPlayer source={source} />\n */\nexport function resolveFileSource(options: ResolveFileSourceOptions): VideoSourceUnion | null {\n const {\n content,\n path,\n mimeType,\n sessionId,\n loadMethod,\n getStreamUrl,\n title,\n poster,\n } = options;\n\n const contentSize = content\n ? typeof content === 'string'\n ? content.length\n : content.byteLength\n : 0;\n const hasContent = contentSize > 0;\n\n // Priority 1: HTTP Range streaming for large files\n if (loadMethod === 'http_stream' && !hasContent && sessionId && getStreamUrl) {\n return {\n type: 'stream',\n sessionId,\n path,\n getStreamUrl,\n mimeType,\n title,\n poster,\n };\n }\n\n // Priority 2: Data URL (base64 string)\n if (typeof content === 'string' && hasContent) {\n return {\n type: 'data-url',\n data: content,\n title,\n poster,\n };\n }\n\n // Priority 3: ArrayBuffer → Blob\n if (content instanceof ArrayBuffer && hasContent) {\n return {\n type: 'blob',\n data: content,\n mimeType: mimeType || 'video/mp4',\n title,\n poster,\n };\n }\n\n // No valid content\n return null;\n}\n","/**\n * VideoPlayer - Unified Video Player Component\n *\n * Supports multiple modes:\n * - vidstack: Full-featured player (YouTube, Vimeo, HLS, DASH)\n * - native: Lightweight HTML5 player\n * - streaming: HTTP Range streaming with auth / Blob sources\n *\n * @example\n * // YouTube video\n * <VideoPlayer source={{ type: 'youtube', id: 'dQw4w9WgXcQ' }} />\n *\n * @example\n * // HLS stream\n * <VideoPlayer source={{ type: 'hls', url: 'https://example.com/video.m3u8' }} />\n *\n * @example\n * // HTTP Range streaming with auth (full source)\n * <VideoPlayer\n * source={{\n * type: 'stream',\n * sessionId: 'abc123',\n * path: '/videos/movie.mp4',\n * getStreamUrl: (id, path) => `/api/stream/${id}?path=${path}&token=${token}`\n * }}\n * />\n *\n * @example\n * // HTTP Range streaming (simplified, using VideoPlayerProvider context)\n * <VideoPlayerProvider sessionId={sessionId} getStreamUrl={getStreamUrl}>\n * <VideoPlayer source={{ type: 'stream', path: '/videos/movie.mp4' }} />\n * </VideoPlayerProvider>\n *\n * @example\n * // Blob/ArrayBuffer\n * <VideoPlayer source={{ type: 'blob', data: arrayBuffer, mimeType: 'video/mp4' }} />\n */\n\n'use client';\n\nimport React, { forwardRef, useMemo } from 'react';\n\nimport { VidstackProvider, NativeProvider, StreamProvider } from '../providers';\nimport { useVideoPlayerContext } from '../context';\nimport { resolvePlayerMode, isSimpleStreamSource, resolveStreamSource } from '../utils';\n\nimport type { VideoPlayerProps, VideoPlayerRef, VideoSourceUnion, VidstackProviderProps, NativeProviderProps, StreamProviderProps, SimpleStreamSource } from '../types';\n\nexport const VideoPlayer = forwardRef<VideoPlayerRef, VideoPlayerProps & { source: VideoSourceUnion | SimpleStreamSource }>(\n (\n {\n source: rawSource,\n mode = 'auto',\n aspectRatio = 16 / 9,\n autoPlay = false,\n muted = false,\n loop = false,\n playsInline = true,\n controls = true,\n preload = 'metadata',\n theme = 'default',\n showInfo = false,\n className,\n videoClassName,\n disableContextMenu = false,\n showPreloader = true,\n preloaderTimeout = 5000,\n errorFallback,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n },\n ref\n ) => {\n // Get context for simplified stream sources\n const context = useVideoPlayerContext();\n\n // Resolve simplified stream source to full source using context\n const source = useMemo(() => {\n if (isSimpleStreamSource(rawSource)) {\n const resolved = resolveStreamSource(rawSource, context);\n if (!resolved) {\n // Return a special error source that will trigger error fallback\n return null;\n }\n return resolved;\n }\n return rawSource;\n }, [rawSource, context]);\n\n // Handle unresolved source\n if (!source) {\n // Render error state\n const errorMessage = 'Stream source requires VideoPlayerProvider with getStreamUrl and sessionId';\n\n if (typeof errorFallback === 'function') {\n return (\n <div className={className} style={{ aspectRatio: aspectRatio === 'fill' ? undefined : aspectRatio }}>\n {errorFallback({ error: errorMessage })}\n </div>\n );\n }\n\n if (errorFallback) {\n return (\n <div className={className} style={{ aspectRatio: aspectRatio === 'fill' ? undefined : aspectRatio }}>\n {errorFallback}\n </div>\n );\n }\n\n // Default error UI\n return (\n <div\n className={className}\n style={{\n aspectRatio: aspectRatio === 'fill' ? undefined : aspectRatio,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'black',\n color: 'white',\n }}\n >\n <p>{errorMessage}</p>\n </div>\n );\n }\n\n // Determine which provider to use\n const resolvedMode = resolvePlayerMode(source, mode);\n\n // Common props for all providers\n const commonProps = {\n aspectRatio,\n autoPlay,\n muted,\n loop,\n playsInline,\n controls,\n preload,\n className,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n };\n\n // Render appropriate provider\n switch (resolvedMode) {\n case 'vidstack':\n return (\n <VidstackProvider\n ref={ref}\n source={source as VidstackProviderProps['source']}\n theme={theme}\n showInfo={showInfo}\n errorFallback={errorFallback}\n {...commonProps}\n />\n );\n\n case 'streaming':\n return (\n <StreamProvider\n ref={ref}\n source={source as StreamProviderProps['source']}\n videoClassName={videoClassName}\n disableContextMenu={disableContextMenu}\n showPreloader={showPreloader}\n preloaderTimeout={preloaderTimeout}\n errorFallback={errorFallback}\n {...commonProps}\n />\n );\n\n case 'native':\n default:\n return (\n <NativeProvider\n ref={ref}\n source={source as NativeProviderProps['source']}\n videoClassName={videoClassName}\n disableContextMenu={disableContextMenu}\n showPreloader={showPreloader}\n preloaderTimeout={preloaderTimeout}\n {...commonProps}\n />\n );\n }\n }\n);\n\nVideoPlayer.displayName = 'VideoPlayer';\n","/**\n * Custom Video Controls for Vidstack Player\n */\n\n'use client';\n\nimport { Maximize, Minimize, Pause, Play, Volume2, VolumeX } from 'lucide-react';\nimport React from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useMediaRemote, useMediaStore } from '@vidstack/react';\n\nimport type { MediaPlayerInstance } from '@vidstack/react';\ninterface VideoControlsProps {\n player: React.RefObject<MediaPlayerInstance | null>;\n className?: string;\n}\n\nexport function VideoControls({ player, className }: VideoControlsProps) {\n const store = useMediaStore(player);\n const remote = useMediaRemote();\n\n const isPaused = store.paused;\n const isMuted = store.muted;\n const isFullscreen = store.fullscreen;\n const currentTime = store.currentTime;\n const duration = store.duration;\n const volume = store.volume;\n\n const formatTime = (seconds: number): string => {\n if (!seconds || seconds < 0) return '0:00';\n const minutes = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${minutes}:${secs.toString().padStart(2, '0')}`;\n };\n\n const handleProgressClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!duration) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const percentage = clickX / rect.width;\n const newTime = percentage * duration;\n remote.seek(newTime);\n };\n\n const handleVolumeChange = (e: React.MouseEvent<HTMLDivElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const percentage = Math.max(0, Math.min(1, clickX / rect.width));\n remote.changeVolume(percentage);\n if (percentage > 0 && isMuted) {\n remote.toggleMuted();\n }\n };\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n return (\n <div\n className={cn(\n \"absolute inset-0 flex flex-col justify-end transition-opacity duration-300\",\n \"bg-gradient-to-t from-black/80 via-black/20 to-transparent\",\n \"opacity-0 group-hover:opacity-100 focus-within:opacity-100\",\n \"pointer-events-none group-hover:pointer-events-auto\",\n className\n )}\n >\n {/* Progress Bar */}\n <div className=\"px-4 pb-2 pointer-events-auto\">\n <div\n className=\"h-1.5 bg-white/20 rounded-full cursor-pointer hover:h-2 transition-all group\"\n onClick={handleProgressClick}\n >\n <div\n className=\"h-full bg-primary rounded-full transition-all relative group-hover:bg-primary/90\"\n style={{ width: `${progress}%` }}\n >\n <div className=\"absolute right-0 top-1/2 -translate-y-1/2 w-3 h-3 bg-white rounded-full opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n </div>\n </div>\n\n {/* Control Bar */}\n <div className=\"flex items-center gap-4 px-4 pb-4 pointer-events-auto\">\n {/* Play/Pause */}\n <button\n onClick={() => remote.togglePaused()}\n className=\"text-white hover:text-primary transition-colors p-1.5 hover:bg-white/10 rounded-full\"\n >\n {isPaused ? <Play className=\"h-6 w-6\" /> : <Pause className=\"h-6 w-6\" />}\n </button>\n\n {/* Time */}\n <div className=\"text-white text-sm font-medium\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </div>\n\n <div className=\"flex-1\" />\n\n {/* Volume Control */}\n <div className=\"flex items-center gap-2 group/volume\">\n <button\n onClick={() => remote.toggleMuted()}\n className=\"text-white hover:text-primary transition-colors p-1.5 hover:bg-white/10 rounded-full\"\n >\n {isMuted || volume === 0 ? (\n <VolumeX className=\"h-5 w-5\" />\n ) : (\n <Volume2 className=\"h-5 w-5\" />\n )}\n </button>\n\n <div\n className=\"w-0 group-hover/volume:w-20 transition-all overflow-hidden\"\n >\n <div\n className=\"h-1.5 bg-white/20 rounded-full cursor-pointer hover:h-2 transition-all\"\n onClick={handleVolumeChange}\n >\n <div\n className=\"h-full bg-white rounded-full transition-all\"\n style={{ width: `${volume * 100}%` }}\n />\n </div>\n </div>\n </div>\n\n {/* Fullscreen */}\n <button\n onClick={() => isFullscreen ? remote.exitFullscreen() : remote.enterFullscreen()}\n className=\"text-white hover:text-primary transition-colors p-1.5 hover:bg-white/10 rounded-full\"\n >\n {isFullscreen ? <Minimize className=\"h-5 w-5\" /> : <Maximize className=\"h-5 w-5\" />}\n </button>\n </div>\n </div>\n );\n}\n","/**\n * VideoErrorFallback - Pre-built error fallback with download button\n * For use with VideoPlayer errorFallback prop\n */\n\n'use client';\n\nimport React from 'react';\nimport { FileVideo, RefreshCw } from 'lucide-react';\n\nimport { cn, Button, DownloadButton } from '../../_shared';\n\nimport type { ErrorFallbackProps } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface VideoErrorFallbackProps extends ErrorFallbackProps {\n /** URL for download button (if provided, shows download button) */\n downloadUrl?: string;\n /** Filename for download */\n downloadFilename?: string;\n /** File size to display */\n fileSize?: string;\n /** Show retry button */\n showRetry?: boolean;\n /** Custom className */\n className?: string;\n /** Custom icon */\n icon?: React.ReactNode;\n /** Custom title (defaults to error message) */\n title?: string;\n /** Custom description */\n description?: string;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Pre-built error fallback component for VideoPlayer\n *\n * @example\n * // Basic usage\n * <VideoPlayer\n * source={source}\n * errorFallback={(props) => (\n * <VideoErrorFallback\n * {...props}\n * downloadUrl={getDownloadUrl()}\n * downloadFilename=\"video.mp4\"\n * />\n * )}\n * />\n *\n * @example\n * // With file size\n * <VideoErrorFallback\n * error=\"Failed to load video\"\n * downloadUrl=\"/api/download/video.mp4\"\n * fileSize=\"125 MB\"\n * showRetry\n * retry={() => reloadVideo()}\n * />\n */\nexport function VideoErrorFallback({\n error,\n retry,\n downloadUrl,\n downloadFilename,\n fileSize,\n showRetry = true,\n className,\n icon,\n title,\n description,\n}: VideoErrorFallbackProps) {\n const displayTitle = title || error || 'Video cannot be previewed';\n\n return (\n <div\n className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center gap-4 bg-black/90 text-white p-6',\n className\n )}\n >\n {/* Icon */}\n {icon || <FileVideo className=\"w-16 h-16 text-muted-foreground\" />}\n\n {/* Title */}\n <p className=\"text-lg font-medium text-center\">{displayTitle}</p>\n\n {/* Description / File size */}\n {(description || fileSize) && (\n <p className=\"text-sm text-muted-foreground text-center\">\n {description || fileSize}\n </p>\n )}\n\n {/* Actions */}\n <div className=\"flex items-center gap-3 mt-2\">\n {/* Retry button */}\n {showRetry && retry && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={retry}\n className=\"gap-2\"\n >\n <RefreshCw className=\"w-4 h-4\" />\n Retry\n </Button>\n )}\n\n {/* Download button */}\n {downloadUrl && (\n <DownloadButton\n url={downloadUrl}\n filename={downloadFilename}\n variant=\"default\"\n size=\"sm\"\n >\n Download to view\n </DownloadButton>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Factory for common use cases\n// ============================================================================\n\nexport interface CreateVideoErrorFallbackOptions {\n /** Function to get download URL from source */\n getDownloadUrl?: (source: unknown) => string | undefined;\n /** Function to get filename from source */\n getFilename?: (source: unknown) => string | undefined;\n /** Function to get file size from source */\n getFileSize?: (source: unknown) => string | undefined;\n /** Show retry button */\n showRetry?: boolean;\n}\n\n/**\n * Factory to create error fallback function for VideoPlayer\n *\n * @example\n * const errorFallback = createVideoErrorFallback({\n * getDownloadUrl: (source) => source.downloadUrl,\n * getFilename: (source) => source.filename,\n * showRetry: true,\n * });\n *\n * <VideoPlayer source={source} errorFallback={errorFallback} />\n */\nexport function createVideoErrorFallback(\n options: CreateVideoErrorFallbackOptions\n): (props: ErrorFallbackProps, source?: unknown) => React.ReactNode {\n return (props: ErrorFallbackProps, source?: unknown) => (\n <VideoErrorFallback\n {...props}\n downloadUrl={options.getDownloadUrl?.(source)}\n downloadFilename={options.getFilename?.(source)}\n fileSize={options.getFileSize?.(source)}\n showRetry={options.showRetry}\n />\n );\n}\n"]}
|
|
@@ -185,5 +185,5 @@ var JsonTreeComponent = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ title, data,
|
|
|
185
185
|
var JsonTree_default = JsonTreeComponent;
|
|
186
186
|
|
|
187
187
|
exports.JsonTree_default = JsonTree_default;
|
|
188
|
-
//# sourceMappingURL=chunk-
|
|
189
|
-
//# sourceMappingURL=chunk-
|
|
188
|
+
//# sourceMappingURL=chunk-EGYUND4E.cjs.map
|
|
189
|
+
//# sourceMappingURL=chunk-EGYUND4E.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/JsonTree/index.tsx"],"names":["__name","useState","jsxs","jsx","Button","Fragment","ChevronUp","ChevronDown","CopyButton","Download","JSONTree"],"mappings":"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","file":"chunk-EGYUND4E.cjs","sourcesContent":["'use client';\n\nimport { ChevronDown, ChevronUp, Download } from 'lucide-react';\nimport React, { useState } from 'react';\nimport { CommonExternalProps, JSONTree } from 'react-json-tree';\n\nimport { Button, CopyButton } from '@djangocfg/ui-core/components';\n\nexport type { Language } from 'prism-react-renderer';\n\nexport interface JsonTreeConfig {\n /** Maximum depth to expand automatically (default: 2) */\n maxAutoExpandDepth?: number;\n /** Maximum items in array to auto-expand (default: 10) */\n maxAutoExpandArrayItems?: number;\n /** Maximum object keys to auto-expand (default: 5) */\n maxAutoExpandObjectKeys?: number;\n /** Maximum string length before truncation (default: 200) */\n maxStringLength?: number;\n /** Collection limit for performance (default: 50) */\n collectionLimit?: number;\n /** Whether to show collection info (array length, object keys count) */\n showCollectionInfo?: boolean;\n /** Whether to show expand/collapse all buttons */\n showExpandControls?: boolean;\n /** Whether to show copy/download buttons */\n showActionButtons?: boolean;\n /** Custom CSS classes for the container */\n className?: string;\n /** Whether to preserve object key order (default: true) */\n preserveKeyOrder?: boolean;\n}\n\nexport interface JsonTreeComponentProps {\n title?: string;\n data: unknown;\n config?: JsonTreeConfig;\n /** Override for react-json-tree props */\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nconst JsonTreeComponent = ({ title, data, config = {}, jsonTreeProps = {} }: JsonTreeComponentProps) => {\n // State for expand/collapse all\n const [expandAll, setExpandAll] = useState<boolean | null>(null);\n const [renderKey, setRenderKey] = useState(0);\n \n // Default configuration\n const {\n maxAutoExpandDepth = 2,\n maxAutoExpandArrayItems = 10,\n maxAutoExpandObjectKeys = 5,\n maxStringLength = 200,\n collectionLimit = 50,\n showCollectionInfo = true,\n showExpandControls = true,\n showActionButtons = true,\n className = '',\n preserveKeyOrder = true,\n } = config;\n \n // JSON Tree theme optimized for dark theme\n const jsonTreeTheme = {\n scheme: 'djangocfg-dark',\n base00: 'transparent', // Background\n base01: '#1a1a1a', // Lighter background\n base02: '#2a2a2a', // Selection background\n base03: '#6b7280', // Comments, invisibles\n base04: '#9ca3af', // Dark foreground\n base05: '#e5e7eb', // Default foreground\n base06: '#f3f4f6', // Light foreground\n base07: '#ffffff', // Lightest foreground\n base08: '#ef4444', // Red - for null, undefined\n base09: '#f97316', // Orange - for numbers\n base0A: '#eab308', // Yellow - for strings\n base0B: '#22c55e', // Green - for booleans (true)\n base0C: '#06b6d4', // Cyan - for dates, regex\n base0D: '#3b82f6', // Blue - for keys\n base0E: '#a855f7', // Purple - for functions\n base0F: '#f43f5e', // Pink - for deprecations\n };\n\n // Smart expansion logic\n const shouldExpandNodeInitially = (keyPath: readonly (string | number)[], nodeData: unknown, level: number) => {\n // If user explicitly clicked \"Expand All\", expand everything\n if (expandAll === true) return true;\n\n // If user explicitly clicked \"Collapse All\", collapse everything\n if (expandAll === false) return false;\n\n // Default auto-expansion (expandAll === null)\n // Always expand up to maxAutoExpandDepth\n if (level <= maxAutoExpandDepth) return true;\n\n // For arrays, expand if they have less than maxAutoExpandArrayItems\n if (Array.isArray(nodeData) && nodeData.length <= maxAutoExpandArrayItems) return true;\n\n // For objects, expand if they have less than maxAutoExpandObjectKeys\n if (nodeData && typeof nodeData === 'object' && !Array.isArray(nodeData)) {\n const keys = Object.keys(nodeData);\n return keys.length <= maxAutoExpandObjectKeys;\n }\n\n return false;\n };\n\n // Collection info display\n const getItemString = showCollectionInfo \n ? (nodeType: string, nodeData: unknown) => {\n if (nodeType === 'Array') {\n const length = Array.isArray(nodeData) ? nodeData.length : 0;\n return length > 0 ? <span className=\"text-muted-foreground text-sm\">({length} items)</span> : null;\n }\n if (nodeType === 'Object') {\n const keys = nodeData && typeof nodeData === 'object' ? Object.keys(nodeData) : [];\n return keys.length > 0 ? <span className=\"text-muted-foreground text-sm\">({keys.length} keys)</span> : null;\n }\n return null;\n }\n : () => null;\n\n // Value processing for better display\n const postprocessValue = (value: unknown) => {\n // Truncate very long strings\n if (typeof value === 'string' && value.length > maxStringLength) {\n return value.substring(0, maxStringLength) + '... (truncated)';\n }\n return value;\n };\n\n // Custom node detection for special formatting\n const isCustomNode = (value: unknown) => {\n // Mark URLs as custom nodes for special styling\n if (typeof value === 'string' && (value.startsWith('http://') || value.startsWith('https://'))) {\n return true;\n }\n return false;\n };\n\n // JSON string for copy/download\n const jsonString = JSON.stringify(data, null, 2);\n\n // Action handlers\n const handleDownload = () => {\n const blob = new Blob([jsonString], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'data.json';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n return (\n <div className={`relative border border-border rounded-sm h-full overflow-hidden ${className}`}>\n {/* Header with title and controls */}\n {(title || showExpandControls || showActionButtons) && (\n <div className=\"p-4 border-b border-border bg-muted/50 rounded-t-sm\">\n <div className=\"flex items-center justify-between\">\n {title && (\n <h6 className=\"text-lg font-semibold text-foreground\">{title}</h6>\n )}\n \n {(showExpandControls || showActionButtons) && (\n <div className=\"flex items-center space-x-2\">\n {/* Expand/Collapse Controls */}\n {showExpandControls && (\n <Button\n variant={expandAll === true ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => {\n const newState = expandAll === true ? false : true;\n setExpandAll(newState);\n setRenderKey(prev => prev + 1);\n }}\n className=\"h-8 px-2\"\n >\n {expandAll === true ? (\n <>\n <ChevronUp className=\"h-3 w-3\" />\n <span className=\"ml-1 text-xs\">Collapse All</span>\n </>\n ) : (\n <>\n <ChevronDown className=\"h-3 w-3\" />\n <span className=\"ml-1 text-xs\">Expand All</span>\n </>\n )}\n </Button>\n )}\n \n {/* Action Buttons */}\n {showActionButtons && (\n <>\n <CopyButton\n value={jsonString}\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 px-2\"\n iconClassName=\"h-3 w-3\"\n >\n Copy\n </CopyButton>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleDownload}\n className=\"h-8 px-2\"\n >\n <Download className=\"h-3 w-3\" />\n <span className=\"ml-1 text-xs hidden sm:inline\">Download</span>\n </Button>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* JSON Tree Content */}\n <div className=\"h-full overflow-auto p-4\">\n <JSONTree\n key={renderKey} // Force re-render when expand/collapse state changes\n data={data}\n theme={jsonTreeTheme}\n invertTheme={false}\n hideRoot={true}\n shouldExpandNodeInitially={shouldExpandNodeInitially}\n getItemString={getItemString}\n postprocessValue={postprocessValue}\n isCustomNode={isCustomNode}\n collectionLimit={collectionLimit}\n sortObjectKeys={!preserveKeyOrder}\n {...jsonTreeProps}\n />\n </div>\n </div>\n );\n};\n\nexport default JsonTreeComponent; "]}
|