strataplayer 1.0.3 → 1.0.4
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/strataplayer.es.js.map +1 -1
- package/dist/strataplayer.umd.js.map +1 -1
- package/dist/style.css +1 -0
- package/package.json +1 -1
- package/dist/logo.png +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strataplayer.es.js","sources":["../core/EventBus.ts","../core/NanoStore.ts","../core/AudioEngine.ts","../core/StrataCore.ts","../plugins/HlsPlugin.ts","../utils/playerUtils.ts","../ui/hooks/useTransition.tsx","../ui/Icons.tsx","../ui/components/NotificationContainer.tsx","../ui/components/SubtitleOverlay.tsx","../ui/components/Menu.tsx","../ui/components/SettingsPrimitives.tsx","../ui/components/SubtitleMenu.tsx","../ui/StrataPlayer.tsx","../lib.ts"],"sourcesContent":["\nexport type EventCallback<T = any> = (data: T) => void;\n\nexport class EventBus {\n private events: Map<string, EventCallback[]>;\n\n constructor() {\n this.events = new Map();\n }\n\n on<T>(event: string, callback: EventCallback<T>): () => void {\n if (!this.events.has(event)) {\n this.events.set(event, []);\n }\n this.events.get(event)?.push(callback);\n\n // Return unsubscriber\n return () => this.off(event, callback);\n }\n\n off<T>(event: string, callback: EventCallback<T>): void {\n const subscribers = this.events.get(event);\n if (subscribers) {\n this.events.set(\n event,\n subscribers.filter((cb) => cb !== callback)\n );\n }\n }\n\n emit<T>(event: string, data?: T): void {\n const subscribers = this.events.get(event);\n if (subscribers) {\n subscribers.forEach((cb) => cb(data));\n }\n }\n\n destroy() {\n this.events.clear();\n }\n}\n","\nexport type Listener<T> = (state: T, prevState: T) => void;\n\nexport class NanoStore<T> {\n private state: T;\n private listeners: Set<Listener<T>>;\n\n constructor(initialState: T) {\n this.state = initialState;\n this.listeners = new Set();\n }\n\n get(): T {\n return this.state;\n }\n\n setState(partial: Partial<T> | ((prev: T) => Partial<T>)) {\n const prevState = this.state;\n const update = typeof partial === 'function' ? (partial as any)(prevState) : partial;\n this.state = { ...prevState, ...update };\n \n this.listeners.forEach((listener) => listener(this.state, prevState));\n }\n\n subscribe(listener: Listener<T>): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n destroy() {\n this.listeners.clear();\n }\n}\n","\nexport class AudioEngine {\n private context: AudioContext | null = null;\n private source: MediaElementAudioSourceNode | null = null;\n private gainNode: GainNode | null = null;\n private video: HTMLVideoElement;\n private isInitialized = false;\n\n constructor(video: HTMLVideoElement) {\n this.video = video;\n }\n\n /**\n * Initialize the AudioContext. Must be called after user interaction.\n */\n init() {\n if (this.isInitialized) return;\n \n const AudioContextClass = window.AudioContext || (window as any).webkitAudioContext;\n if (!AudioContextClass) return;\n\n this.context = new AudioContext();\n this.gainNode = this.context.createGain();\n \n // Connect video -> gain -> destination\n try {\n this.source = this.context.createMediaElementSource(this.video);\n this.source.connect(this.gainNode);\n this.gainNode.connect(this.context.destination);\n this.isInitialized = true;\n } catch (e) {\n console.warn(\"StrataPlayer: Failed to initialize AudioEngine\", e);\n }\n }\n\n setGain(value: number) {\n // Lazy init on first boost attempt\n if (!this.isInitialized) this.init();\n \n if (this.gainNode && this.context) {\n this.gainNode.gain.value = value;\n \n // Web Audio context might be suspended by browser policy\n if (this.context.state === 'suspended') {\n this.context.resume();\n }\n }\n }\n\n destroy() {\n if (this.context) {\n this.context.close();\n }\n this.isInitialized = false;\n }\n}\n","\nimport { EventBus } from './EventBus';\nimport { NanoStore } from './NanoStore';\nimport { AudioEngine } from './AudioEngine';\n\nexport interface Notification {\n id: string;\n message: string;\n type: 'info' | 'success' | 'warning' | 'error' | 'loading';\n duration?: number; // ms, if null then persistent\n progress?: number; // 0-100\n}\n\nexport interface SubtitleSettings {\n useNative: boolean; // \"Native video subtitle\"\n fixCapitalization: boolean;\n backgroundOpacity: number; // 0-100\n backgroundBlur: boolean;\n backgroundBlurAmount: number; // px\n textSize: number; // % (100 = 1em)\n textStyle: 'none' | 'outline' | 'raised' | 'depressed' | 'shadow';\n isBold: boolean;\n textColor: string;\n verticalOffset: number; // px from bottom\n}\n\nexport const DEFAULT_SUBTITLE_SETTINGS: SubtitleSettings = {\n useNative: false,\n fixCapitalization: false,\n backgroundOpacity: 50,\n backgroundBlur: false,\n backgroundBlurAmount: 4,\n textSize: 100,\n textStyle: 'shadow',\n isBold: false,\n textColor: '#ffffff',\n verticalOffset: 40,\n};\n\nexport type PlayerTheme = 'default' | 'pixel' | 'game' | 'hacker';\n\nexport interface PlayerSource {\n url: string;\n type?: 'hls' | 'mp4' | 'webm' | 'dash' | string;\n name?: string;\n}\n\nexport interface PlayerState {\n isPlaying: boolean;\n isBuffering: boolean;\n currentTime: number;\n duration: number;\n buffered: { start: number; end: number }[];\n volume: number;\n isMuted: boolean;\n audioGain: number;\n playbackRate: number;\n qualityLevels: { height: number; bitrate: number; index: number }[];\n currentQuality: number;\n audioTracks: { label: string; language: string; index: number }[];\n currentAudioTrack: number;\n error: string | null;\n isFullscreen: boolean;\n isPip: boolean;\n subtitleTracks: { label: string; language: string; index: number }[];\n currentSubtitle: number;\n subtitleOffset: number; // in seconds\n subtitleSettings: SubtitleSettings;\n activeCues: string[]; // For custom rendering\n viewMode: 'normal' | 'theater' | 'pip';\n notifications: Notification[];\n // Appearance\n iconSize: 'small' | 'medium' | 'large';\n themeColor: string;\n theme: PlayerTheme;\n // Sources\n sources: PlayerSource[];\n currentSourceIndex: number;\n}\n\nexport interface StrataConfig {\n // Playback\n volume?: number;\n muted?: boolean;\n playbackRate?: number;\n audioGain?: number;\n\n // Appearance\n theme?: PlayerTheme;\n themeColor?: string;\n iconSize?: 'small' | 'medium' | 'large';\n\n // Subtitles\n subtitleSettings?: Partial<SubtitleSettings>;\n\n // System\n disablePersistence?: boolean;\n}\n\nconst STORAGE_KEY = 'strata-settings-v3';\n\nexport const DEFAULT_STATE: PlayerState = {\n isPlaying: false,\n isBuffering: false,\n currentTime: 0,\n duration: 0,\n buffered: [],\n volume: 1,\n isMuted: false,\n audioGain: 1,\n playbackRate: 1,\n qualityLevels: [],\n currentQuality: -1,\n audioTracks: [],\n currentAudioTrack: -1,\n error: null,\n isFullscreen: false,\n isPip: false,\n subtitleTracks: [],\n currentSubtitle: -1,\n subtitleOffset: 0,\n subtitleSettings: DEFAULT_SUBTITLE_SETTINGS,\n activeCues: [],\n viewMode: 'normal',\n notifications: [],\n iconSize: 'medium',\n themeColor: '#6366f1',\n theme: 'default',\n sources: [],\n currentSourceIndex: -1,\n};\n\n// Helper to merge Defaults -> LocalStorage -> Config\nexport const getResolvedState = (config: StrataConfig = {}): PlayerState => {\n let saved: any = {};\n if (!config.disablePersistence && typeof window !== 'undefined') {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) saved = JSON.parse(raw);\n } catch (e) { /* ignore */ }\n }\n\n const mergedSubtitleSettings = {\n ...DEFAULT_SUBTITLE_SETTINGS,\n ...(saved.subtitleSettings || {}),\n ...(config.subtitleSettings || {})\n };\n\n return {\n ...DEFAULT_STATE,\n ...saved, // Load saved first\n // Override with config if present (not undefined)\n volume: config.volume ?? saved.volume ?? DEFAULT_STATE.volume,\n isMuted: config.muted ?? saved.isMuted ?? DEFAULT_STATE.isMuted,\n playbackRate: config.playbackRate ?? saved.playbackRate ?? DEFAULT_STATE.playbackRate,\n audioGain: config.audioGain ?? saved.audioGain ?? DEFAULT_STATE.audioGain,\n theme: config.theme ?? saved.theme ?? DEFAULT_STATE.theme,\n themeColor: config.themeColor ?? saved.themeColor ?? DEFAULT_STATE.themeColor,\n iconSize: config.iconSize ?? saved.iconSize ?? DEFAULT_STATE.iconSize,\n subtitleSettings: mergedSubtitleSettings\n };\n};\n\nexport interface IPlugin {\n name: string;\n init(core: StrataCore): void;\n destroy?(): void;\n}\n\nexport interface TextTrackConfig {\n kind: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';\n label: string;\n src: string;\n srcLang: string;\n default?: boolean;\n}\n\nexport class StrataCore {\n public video: HTMLVideoElement;\n public container: HTMLElement | null = null;\n public events: EventBus;\n public store: NanoStore<PlayerState>;\n private plugins: Map<string, IPlugin> = new Map();\n private audioEngine: AudioEngine;\n private config: StrataConfig;\n\n // Retry Logic\n private retryCount = 0;\n private maxRetries = 5;\n private retryTimer: any = null;\n private currentSource: PlayerSource | null = null;\n private currentSrc: string = '';\n private currentTracks: TextTrackConfig[] = [];\n\n // Cast\n private castInitialized = false;\n\n private boundCueChange: () => void;\n private boundFullscreenChange: () => void;\n\n constructor(config: StrataConfig = {}, videoElement?: HTMLVideoElement) {\n this.config = config;\n this.video = videoElement || document.createElement('video');\n this.video.crossOrigin = \"anonymous\";\n this.events = new EventBus();\n\n // Initialize Store with resolved state\n const initialState = getResolvedState(config);\n this.store = new NanoStore(initialState);\n\n this.audioEngine = new AudioEngine(this.video);\n this.boundCueChange = this.handleCueChange.bind(this);\n\n // Bind fullscreen listener once\n this.boundFullscreenChange = () => {\n this.store.setState({ isFullscreen: !!document.fullscreenElement });\n };\n\n // Apply initial state to video element\n this.video.volume = initialState.volume;\n this.video.muted = initialState.isMuted;\n this.video.playbackRate = initialState.playbackRate;\n if (initialState.audioGain > 1) {\n this.audioEngine.setGain(initialState.audioGain);\n }\n\n this.initVideoListeners();\n this.initCast();\n\n // Persistence Subscriber\n if (!config.disablePersistence) {\n this.store.subscribe((state) => {\n const settings = {\n volume: state.volume,\n isMuted: state.isMuted,\n playbackRate: state.playbackRate,\n subtitleSettings: state.subtitleSettings,\n iconSize: state.iconSize,\n themeColor: state.themeColor,\n theme: state.theme\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\n });\n }\n }\n\n private initVideoListeners() {\n const s = (partial: Partial<PlayerState>) => this.store.setState(partial);\n\n this.video.addEventListener('play', () => s({ isPlaying: true }));\n this.video.addEventListener('pause', () => s({ isPlaying: false }));\n this.video.addEventListener('ended', () => s({ isPlaying: false }));\n this.video.addEventListener('waiting', () => s({ isBuffering: true }));\n this.video.addEventListener('playing', () => s({ isBuffering: false }));\n this.video.addEventListener('loadeddata', () => {\n s({ isBuffering: false });\n // Success load resets retry count\n this.retryCount = 0;\n this.removeNotification('retry');\n // Clear error if we recovered\n if (this.store.get().error) {\n s({ error: null });\n }\n });\n this.video.addEventListener('canplay', () => s({ isBuffering: false }));\n\n this.video.addEventListener('timeupdate', () => {\n if (!this.video.seeking) {\n s({ currentTime: this.video.currentTime });\n }\n });\n\n this.video.addEventListener('seeked', () => s({ currentTime: this.video.currentTime }));\n this.video.addEventListener('durationchange', () => s({ duration: this.video.duration }));\n this.video.addEventListener('volumechange', () => s({ volume: this.video.volume, isMuted: this.video.muted }));\n this.video.addEventListener('ratechange', () => s({ playbackRate: this.video.playbackRate }));\n this.video.addEventListener('error', () => this.handleError());\n this.video.addEventListener('progress', this.updateBuffer.bind(this));\n this.video.addEventListener('enterpictureinpicture', () => s({ isPip: true }));\n this.video.addEventListener('leavepictureinpicture', () => s({ isPip: false }));\n\n // Global fullscreen listener to catch Esc key or browser button\n document.addEventListener('fullscreenchange', this.boundFullscreenChange);\n\n this.video.textTracks.addEventListener('addtrack', this.updateSubtitles.bind(this));\n this.video.textTracks.addEventListener('removetrack', this.updateSubtitles.bind(this));\n }\n\n public triggerError(message: string, isFatal: boolean = false) {\n if (isFatal) {\n this.handleError(message);\n } else {\n this.notify({ type: 'warning', message: `Warning: ${message}`, duration: 5000 });\n }\n }\n\n private handleError(customMessage?: string) {\n const error = this.video.error;\n const message = customMessage || error?.message || (error ? `Code ${error.code}` : 'Unknown Error');\n\n this.removeNotification('retry');\n\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n const delay = Math.pow(2, this.retryCount - 1) * 1500;\n\n this.notify({\n id: 'retry',\n type: 'loading',\n message: `Error: ${message}. Retrying (${this.retryCount}/${this.maxRetries})...`,\n });\n\n console.warn(`[StrataPlayer] Error: ${message}. Retrying in ${delay}ms...`);\n\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.retryTimer = setTimeout(() => {\n if (this.currentSource) {\n this.load(this.currentSource, this.currentTracks, true); // True = isRetry\n\n const time = this.store.get().currentTime;\n if (time > 0) {\n const onCanPlay = () => {\n this.video.currentTime = time;\n this.video.removeEventListener('canplay', onCanPlay);\n };\n this.video.addEventListener('canplay', onCanPlay);\n }\n }\n }, delay);\n } else {\n // Final failure\n this.removeNotification('retry');\n const finalMsg = `Failed to play after ${this.maxRetries} attempts: ${message}`;\n this.store.setState({ error: finalMsg });\n }\n }\n\n private updateBuffer() {\n const buffered: { start: number; end: number }[] = [];\n for (let i = 0; i < this.video.buffered.length; i++) {\n buffered.push({\n start: this.video.buffered.start(i),\n end: this.video.buffered.end(i)\n });\n }\n this.store.setState({ buffered });\n }\n\n private updateSubtitles() {\n setTimeout(() => {\n const tracks = Array.from(this.video.textTracks)\n .filter(t => t.kind === 'subtitles' || t.kind === 'captions')\n .map((track, index) => ({\n label: track.label || track.language || `Track ${index + 1}`,\n language: track.language,\n index: index\n }));\n this.store.setState({ subtitleTracks: tracks });\n\n // Restore persisted selection if applicable and tracks exist\n const state = this.store.get();\n if (state.currentSubtitle !== -1 && tracks.length > 0 && state.currentSubtitle < tracks.length) {\n this.setSubtitle(state.currentSubtitle);\n }\n }, 50);\n }\n\n // --- Utility ---\n\n async fetchWithRetry(url: string, retries = 3): Promise<Response> {\n for (let i = 0; i < retries; i++) {\n try {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res;\n } catch (e) {\n if (i === retries - 1) throw e;\n await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i)));\n }\n }\n throw new Error('Fetch failed');\n }\n\n // --- Core Methods ---\n\n attach(container: HTMLElement) {\n this.container = container;\n if (!this.container.contains(this.video)) {\n this.video.style.width = '100%';\n this.video.style.height = '100%';\n this.video.style.objectFit = 'contain';\n this.video.style.backgroundColor = 'black';\n this.container.appendChild(this.video);\n }\n }\n\n use(plugin: IPlugin) {\n if (this.plugins.has(plugin.name)) return;\n plugin.init(this);\n this.plugins.set(plugin.name, plugin);\n }\n\n setSources(sources: PlayerSource[], tracks: TextTrackConfig[] = []) {\n this.store.setState({ sources });\n this.currentTracks = tracks;\n if (sources.length > 0) {\n this.load(sources[0], tracks);\n }\n }\n\n switchSource(index: number) {\n const sources = this.store.get().sources;\n if (index >= 0 && index < sources.length) {\n const time = this.video.currentTime;\n const wasPlaying = !this.video.paused;\n\n this.load(sources[index], this.currentTracks);\n\n const onCanPlay = () => {\n this.video.currentTime = time;\n if (wasPlaying) this.video.play();\n this.video.removeEventListener('canplay', onCanPlay);\n };\n this.video.addEventListener('canplay', onCanPlay);\n }\n }\n\n load(source: PlayerSource | string, tracks: TextTrackConfig[] = [], isRetry = false) {\n if (this.retryTimer) clearTimeout(this.retryTimer);\n\n // Normalize string input to PlayerSource\n const srcObj: PlayerSource = typeof source === 'string' ? { url: source, type: 'auto' } : source;\n\n if (!isRetry) {\n this.retryCount = 0;\n this.store.setState({ error: null });\n this.removeNotification('retry');\n }\n\n this.currentSrc = srcObj.url;\n this.currentSource = srcObj;\n this.currentTracks = tracks;\n\n // Update index state if part of playlist\n const allSources = this.store.get().sources;\n const index = allSources.findIndex(s => s.url === srcObj.url);\n this.store.setState({\n isBuffering: true,\n qualityLevels: [],\n currentQuality: -1, // Reset quality to Auto on source switch\n audioTracks: [],\n currentAudioTrack: -1, // Reset audio track\n // subtitleTracks and currentSubtitle are purposely preserved\n currentSourceIndex: index\n });\n\n // Determine type if auto\n let type = srcObj.type || 'auto';\n if (type === 'auto') {\n if (srcObj.url.includes('.m3u8')) type = 'hls';\n else if (srcObj.url.includes('.mpd')) type = 'dash';\n else type = 'mp4';\n }\n\n // Emit load event with source details so plugins can decide to act\n this.events.emit('load', { url: srcObj.url, type });\n\n const oldTracks = this.video.getElementsByTagName('track');\n while (oldTracks.length > 0) {\n oldTracks[0].remove();\n }\n\n if (tracks.length > 0) {\n tracks.forEach(t => {\n this.fetchWithRetry(t.src).then(() => {\n this.addTextTrackInternal(t.src, t.label, t.srcLang, t.default);\n }).catch(e => {\n this.notify({ type: 'warning', message: `Failed to load subtitle: ${t.label}`, duration: 4000 });\n });\n });\n }\n\n // If it's standard MP4/WebM, set src directly. Plugins handle HLS/Dash.\n if (type === 'mp4' || type === 'webm' || type === 'ogg') {\n this.video.src = srcObj.url;\n }\n }\n\n public addTextTrack(file: File, label: string) {\n const reader = new FileReader();\n reader.onload = (e) => {\n if (!e.target?.result) return;\n let content = e.target.result as string;\n if (file.name.toLowerCase().endsWith('.srt') || !content.trim().startsWith('WEBVTT')) {\n content = content.replace(/(\\d{2}:\\d{2}:\\d{2}),(\\d{3})/g, '$1.$2');\n if (!content.trim().startsWith('WEBVTT')) {\n content = 'WEBVTT\\n\\n' + content;\n }\n }\n const blob = new Blob([content], { type: 'text/vtt' });\n const url = URL.createObjectURL(blob);\n this.addTextTrackInternal(url, label, 'user', true);\n\n setTimeout(() => {\n const tracks = this.store.get().subtitleTracks;\n const newTrackIndex = tracks.findIndex(t => t.label === label);\n if (newTrackIndex !== -1) {\n this.setSubtitle(newTrackIndex);\n this.notify({ type: 'success', message: 'Subtitle uploaded', duration: 3000 });\n }\n }, 200);\n };\n reader.onerror = () => {\n this.notify({ type: 'error', message: 'Failed to read file', duration: 3000 });\n };\n reader.readAsText(file);\n }\n\n private addTextTrackInternal(src: string, label: string, lang: string = '', isDefault: boolean = false) {\n const track = document.createElement('track');\n track.kind = 'subtitles';\n track.label = label;\n track.src = src;\n track.srclang = lang;\n if (isDefault) track.default = true;\n this.video.appendChild(track);\n this.updateSubtitles();\n }\n\n play() { return this.video.play(); }\n pause() { return this.video.pause(); }\n togglePlay() { this.video.paused ? this.play() : this.pause(); }\n\n seek(time: number) {\n if (isNaN(time)) return;\n const t = Math.max(0, Math.min(time, this.video.duration));\n this.store.setState({ currentTime: t });\n this.video.currentTime = t;\n }\n\n skip(seconds: number) {\n this.seek(this.video.currentTime + seconds);\n }\n\n setVolume(vol: number) {\n const safeVol = Math.max(0, Math.min(vol, 1));\n this.video.volume = safeVol;\n if (safeVol > 0 && this.video.muted) this.video.muted = false;\n if (safeVol === 0) this.video.muted = true;\n }\n\n toggleMute() {\n this.video.muted = !this.video.muted;\n }\n\n setAudioGain(gain: number) {\n this.store.setState({ audioGain: gain });\n this.audioEngine.setGain(gain);\n }\n\n setQuality(index: number) {\n this.store.setState({ currentQuality: index });\n this.events.emit('quality-request', index);\n }\n\n setAudioTrack(index: number) {\n this.store.setState({ currentAudioTrack: index });\n this.events.emit('audio-track-request', index);\n }\n\n toggleFullscreen() {\n if (!this.container) return;\n if (!document.fullscreenElement) {\n this.container.requestFullscreen().catch(err => console.error(err));\n // State update happens in the event listener\n } else {\n document.exitFullscreen();\n // State update happens in the event listener\n }\n }\n\n togglePip() {\n if (document.pictureInPictureElement) {\n document.exitPictureInPicture();\n } else if (this.video !== document.pictureInPictureElement && (this.video as any).requestPictureInPicture) {\n (this.video as any).requestPictureInPicture();\n }\n }\n\n private initCast() {\n const w = window as any;\n const initializeCastApi = () => {\n if (this.castInitialized) return;\n try {\n if (w.cast && w.cast.framework && w.chrome && w.chrome.cast) {\n const CastContext = w.cast.framework.CastContext;\n CastContext.getInstance().setOptions({\n receiverApplicationId: w.chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,\n autoJoinPolicy: w.chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED\n });\n this.castInitialized = true;\n }\n } catch (e) {\n console.warn('Cast Init Error or already initialized', e);\n }\n };\n\n if (w.cast && w.cast.framework) {\n initializeCastApi();\n } else {\n w.__onGCastApiAvailable = (isAvailable: boolean) => {\n if (isAvailable) initializeCastApi();\n };\n }\n }\n\n requestCast() {\n const w = window as any;\n if (w.cast && w.cast.framework) {\n try {\n if (!this.castInitialized) this.initCast();\n w.cast.framework.CastContext.getInstance().requestSession()\n .then(() => {\n this.loadMediaToCast();\n })\n .catch((e: any) => {\n if (e !== 'cancel') this.notify({ type: 'error', message: 'Cast failed: ' + e, duration: 3000 });\n });\n } catch (e) {\n this.notify({ type: 'warning', message: 'Cast not available yet', duration: 3000 });\n }\n } else {\n this.notify({ type: 'warning', message: 'Cast API not loaded', duration: 3000 });\n }\n }\n\n private loadMediaToCast() {\n const w = window as any;\n try {\n const castSession = w.cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n const mediaInfo = new w.chrome.cast.media.MediaInfo(this.currentSrc, this.currentSrc.includes('.m3u8') ? 'application/x-mpegurl' : 'video/mp4');\n const request = new w.chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(() => {\n this.notify({ type: 'success', message: 'Casting...', duration: 3000 });\n }).catch((e: any) => console.error('Cast load error', e));\n } catch (e) {\n console.error(\"Failed to load media into Cast session\", e);\n }\n }\n\n private handleCueChange() {\n const state = this.store.get();\n if (state.currentSubtitle === -1) {\n this.store.setState({ activeCues: [] });\n return;\n }\n\n // Find active track\n const tracks = Array.from(this.video.textTracks).filter(t => t.kind === 'subtitles' || t.kind === 'captions');\n const track = tracks[state.currentSubtitle];\n\n if (track && track.activeCues) {\n const cues = Array.from(track.activeCues).map((c: any) => c.text);\n this.store.setState({ activeCues: cues });\n } else {\n this.store.setState({ activeCues: [] });\n }\n }\n\n setSubtitle(index: number) {\n // Remove listeners from old tracks\n Array.from(this.video.textTracks).forEach(t => {\n t.removeEventListener('cuechange', this.boundCueChange);\n t.mode = 'hidden'; // Reset to hidden before applying new state\n });\n\n this.store.setState({ currentSubtitle: index, subtitleOffset: 0, activeCues: [] });\n\n if (index !== -1) {\n // Find active track in the filtered list logic\n const tracks = Array.from(this.video.textTracks).filter(t => t.kind === 'subtitles' || t.kind === 'captions');\n const track = tracks[index];\n if (track) {\n const settings = this.store.get().subtitleSettings;\n // If using Native, mode = showing. If custom, mode = hidden (but not disabled, so cues update)\n track.mode = settings.useNative ? 'showing' : 'hidden';\n track.addEventListener('cuechange', this.boundCueChange);\n\n // Initial trigger\n this.handleCueChange();\n }\n }\n }\n\n updateSubtitleSettings(settings: Partial<SubtitleSettings>) {\n const current = this.store.get().subtitleSettings;\n const newSettings = { ...current, ...settings };\n this.store.setState({ subtitleSettings: newSettings });\n\n // If switching native/custom, re-apply track mode\n if (settings.useNative !== undefined) {\n this.setSubtitle(this.store.get().currentSubtitle);\n }\n }\n\n resetSubtitleSettings() {\n this.store.setState({ subtitleSettings: DEFAULT_SUBTITLE_SETTINGS });\n this.setSubtitle(this.store.get().currentSubtitle); // Re-apply modes\n }\n\n setSubtitleOffset(offset: number) {\n const currentOffset = this.store.get().subtitleOffset;\n const delta = offset - currentOffset;\n\n if (Math.abs(delta) < 0.001) return;\n\n Array.from(this.video.textTracks).forEach((track) => {\n // If custom (hidden) or native (showing), we adjust cues\n if ((track.mode === 'showing' || track.mode === 'hidden') && track.cues) {\n Array.from(track.cues).forEach((cue: any) => {\n cue.startTime += delta;\n cue.endTime += delta;\n });\n }\n });\n\n this.store.setState({ subtitleOffset: offset });\n this.notify({ type: 'info', message: `Subtitle Offset: ${offset > 0 ? '+' : ''}${offset.toFixed(1)}s`, duration: 1500 });\n }\n\n async download() { /* same as before */\n if (!this.video.src) return;\n const src = this.video.src;\n if (src.includes('blob:') || src.includes('.m3u8')) {\n this.notify({ type: 'warning', message: 'Stream download not supported in browser.', duration: 4000 });\n return;\n }\n const notifId = this.notify({ type: 'loading', message: 'Preparing download...', progress: 0 });\n try {\n const response = await this.fetchWithRetry(src);\n if (!response.body) throw new Error('No body');\n const reader = response.body.getReader();\n const contentLength = response.headers.get('Content-Length');\n const total = contentLength ? parseInt(contentLength, 10) : 0;\n let loaded = 0;\n const chunks = [];\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n loaded += value.length;\n if (total) {\n const percent = Math.round((loaded / total) * 100);\n this.notify({ id: notifId, type: 'loading', message: `Downloading... ${percent}%`, progress: percent });\n }\n }\n const blob = new Blob(chunks);\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.style.display = 'none';\n a.href = url;\n a.download = src.split('/').pop()?.split('?')[0] || 'video.mp4';\n document.body.appendChild(a);\n a.click();\n window.URL.revokeObjectURL(url);\n document.body.removeChild(a);\n this.notify({ id: notifId, type: 'success', message: 'Saved!', duration: 3000 });\n } catch (e: any) {\n this.notify({ id: notifId, type: 'error', message: 'Download failed.', duration: 4000 });\n window.open(src, '_blank');\n }\n }\n\n notify(n: Omit<Notification, 'id'> & { id?: string }) {\n const id = n.id || Math.random().toString(36).substr(2, 9);\n const newNotification: Notification = { ...n, id };\n this.store.setState({ notifications: [newNotification] });\n if (n.duration) setTimeout(() => this.removeNotification(id), n.duration);\n return id;\n }\n\n removeNotification(id: string) {\n const current = this.store.get().notifications;\n this.store.setState({ notifications: current.filter(n => n.id !== id) });\n }\n\n setAppearance(settings: { iconSize?: 'small' | 'medium' | 'large', themeColor?: string, theme?: PlayerTheme }) {\n this.store.setState(prev => ({\n ...prev,\n ...settings\n }));\n }\n\n destroy() {\n if (this.retryTimer) clearTimeout(this.retryTimer);\n document.removeEventListener('fullscreenchange', this.boundFullscreenChange);\n this.video.pause();\n this.video.src = '';\n const oldTracks = this.video.getElementsByTagName('track');\n while (oldTracks.length > 0) oldTracks[0].remove();\n this.events.destroy();\n this.store.destroy();\n this.plugins.forEach(p => p.destroy && p.destroy());\n this.plugins.clear();\n this.video.remove();\n this.audioEngine.destroy();\n }\n}\n","\nimport { StrataCore, IPlugin } from '../core/StrataCore';\nimport Hls from 'hls.js';\n\nexport class HlsPlugin implements IPlugin {\n name = 'HlsPlugin';\n private hls: Hls | null = null;\n private core: StrataCore | null = null;\n\n init(core: StrataCore) {\n this.core = core;\n\n // Listen for load requests\n this.core.events.on('load', (data: { url: string, type: string }) => {\n // Only proceed if type matches HLS\n if (data.type === 'hls' || data.url.includes('.m3u8')) {\n if (Hls.isSupported()) {\n this.loadHls(data.url);\n } else if (this.core!.video.canPlayType('application/vnd.apple.mpegurl')) {\n // Native HLS fallback (Safari) - Core sets src, we do nothing\n // Core already handles setting video.src if standard\n this.core!.video.src = data.url;\n }\n } else {\n // If we had an active HLS instance but switched to MP4, destroy it\n if (this.hls) {\n this.hls.destroy();\n this.hls = null;\n }\n }\n });\n\n // Listen for quality changes from UI\n this.core.events.on('quality-request', (index: number) => {\n if (this.hls) {\n this.hls.currentLevel = index;\n }\n });\n\n // Listen for audio track changes from UI\n this.core.events.on('audio-track-request', (index: number) => {\n if (this.hls) {\n this.hls.audioTrack = index;\n }\n });\n }\n\n private loadHls(url: string) {\n if (this.hls) {\n this.hls.destroy();\n }\n\n this.hls = new Hls({\n autoStartLoad: true,\n startLevel: -1, // Auto\n capLevelToPlayerSize: true, // Performance opt\n });\n\n this.hls.loadSource(url);\n this.hls.attachMedia(this.core!.video);\n\n this.hls.on(Hls.Events.MANIFEST_PARSED, (event: any, data: any) => {\n const levels = data.levels.map((lvl: any, idx: number) => ({\n height: lvl.height,\n bitrate: lvl.bitrate,\n index: idx\n }));\n this.core!.store.setState({ qualityLevels: levels });\n });\n\n // Handle Audio Tracks\n this.hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, (event: any, data: any) => {\n const tracks = data.audioTracks.map((track: any, idx: number) => ({\n label: track.name || track.lang || `Audio ${idx + 1}`,\n language: track.lang || '',\n index: idx\n }));\n this.core!.store.setState({\n audioTracks: tracks,\n currentAudioTrack: this.hls!.audioTrack\n });\n });\n\n this.hls.on(Hls.Events.LEVEL_SWITCHED, (event: any, data: any) => {\n // Update current quality only if in auto mode to show what's playing\n // If manual, state is already set\n });\n\n this.hls.on(Hls.Events.ERROR, (event: any, data: any) => {\n if (data.fatal) {\n // Pass fatal errors to Core to handle the retry loop visibly\n const msg = data.details || 'Unknown HLS Error';\n this.core!.triggerError(msg, true);\n\n // Cleanup if needed, but core.load() will eventually destroy and re-init this plugin\n }\n });\n }\n\n destroy() {\n if (this.hls) {\n this.hls.destroy();\n this.hls = null;\n }\n }\n}\n","\r\nexport const formatTime = (seconds: number) => {\r\n if (isNaN(seconds)) return '00:00';\r\n const h = Math.floor(seconds / 3600);\r\n const m = Math.floor((seconds % 3600) / 60);\r\n const s = Math.floor(seconds % 60);\r\n if (h > 0) return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\r\n return `${m}:${s.toString().padStart(2, '0')}`;\r\n};\r\n\r\nconst fetchVttWithRetry = async (url: string, retries = 3): Promise<string> => {\r\n for (let i = 0; i < retries; i++) {\r\n try {\r\n const res = await fetch(url);\r\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\r\n return await res.text();\r\n } catch (e) {\r\n if (i === retries - 1) throw e;\r\n await new Promise(r => setTimeout(r, 1000));\r\n }\r\n }\r\n throw new Error('Failed');\r\n}\r\n\r\nexport interface ThumbnailCue {\r\n start: number;\r\n end: number;\r\n url: string;\r\n x: number;\r\n y: number;\r\n w: number;\r\n h: number;\r\n}\r\n\r\nexport const parseVTT = async (url: string, notify: (msg: any) => void): Promise<ThumbnailCue[]> => {\r\n try {\r\n const text = await fetchVttWithRetry(url);\r\n const lines = text.split('\\n');\r\n const cues: ThumbnailCue[] = [];\r\n let start: number | null = null;\r\n let end: number | null = null;\r\n const baseUrl = url.substring(0, url.lastIndexOf('/') + 1);\r\n const parseTime = (t: string) => {\r\n const parts = t.split(':');\r\n let s = 0;\r\n if (parts.length === 3) {\r\n s += parseFloat(parts[0]) * 3600;\r\n s += parseFloat(parts[1]) * 60;\r\n s += parseFloat(parts[2]);\r\n } else {\r\n s += parseFloat(parts[0]) * 60;\r\n s += parseFloat(parts[1]);\r\n }\r\n return s;\r\n };\r\n for (let line of lines) {\r\n line = line.trim();\r\n if (line.includes('-->')) {\r\n const times = line.split('-->');\r\n start = parseTime(times[0].trim());\r\n end = parseTime(times[1].trim());\r\n } else if (start !== null && end !== null && line.length > 0) {\r\n let [urlPart, hash] = line.split('#');\r\n if (!urlPart.match(/^https?:\\/\\//) && !urlPart.startsWith('data:')) urlPart = baseUrl + urlPart;\r\n let x = 0, y = 0, w = 0, h = 0;\r\n if (hash && hash.startsWith('xywh=')) {\r\n const coords = hash.replace('xywh=', '').split(',');\r\n if (coords.length === 4) {\r\n x = parseInt(coords[0]); y = parseInt(coords[1]); w = parseInt(coords[2]); h = parseInt(coords[3]);\r\n }\r\n }\r\n if (w > 0 && h > 0) cues.push({ start, end, url: urlPart, x, y, w, h });\r\n start = null; end = null;\r\n }\r\n }\r\n return cues;\r\n } catch (e: any) {\r\n notify({ type: 'warning', message: `Failed to load thumbnails`, duration: 4000 });\r\n return [];\r\n }\r\n};\r\n","\r\nimport { useState, useEffect } from 'react';\r\n\r\n// Hook to manage CSS transitions for mounting/unmounting\r\nexport const useTransition = (isActive: boolean, duration: number = 200) => {\r\n const [isMounted, setIsMounted] = useState(isActive);\r\n const [isVisible, setIsVisible] = useState(false);\r\n\r\n useEffect(() => {\r\n if (isActive) {\r\n setIsMounted(true);\r\n // Double RAF ensures the browser paints the initial state before applying the active state\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n setIsVisible(true);\r\n });\r\n });\r\n } else {\r\n setIsVisible(false);\r\n const timer = setTimeout(() => {\r\n setIsMounted(false);\r\n }, duration);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [isActive, duration]);\r\n\r\n return { isMounted, isVisible };\r\n};\r\n","\n// Re-export icons from lucide-react for consistency\nimport {\n Play,\n Pause,\n Volume2,\n Volume1,\n VolumeX,\n Maximize,\n Minimize,\n Settings,\n Check,\n PictureInPicture,\n Subtitles,\n Download,\n ArrowLeft,\n Upload,\n Loader2,\n RotateCcw,\n RotateCw,\n Cast,\n Users,\n Clock,\n Minus,\n Plus,\n SlidersHorizontal,\n Type,\n Palette,\n Eye,\n MoveVertical,\n RefreshCcw,\n Bold,\n CaseUpper,\n Droplet\n} from 'lucide-react';\n\nexport const PlayIcon = Play;\nexport const PauseIcon = Pause;\nexport const VolumeHighIcon = Volume2;\nexport const VolumeLowIcon = Volume1;\nexport const VolumeMuteIcon = VolumeX;\nexport const MaximizeIcon = Maximize;\nexport const MinimizeIcon = Minimize;\nexport const SettingsIcon = Settings;\nexport const CheckIcon = Check;\nexport const PipIcon = PictureInPicture;\nexport const SubtitleIcon = Subtitles;\nexport const DownloadIcon = Download;\nexport const UploadIcon = Upload;\nexport const ArrowLeftIcon = ArrowLeft;\nexport const LoaderIcon = Loader2;\nexport const CastIcon = Cast;\nexport const UsersIcon = Users;\nexport const ClockIcon = Clock;\nexport const MinusIcon = Minus;\nexport const PlusIcon = Plus;\nexport const CustomizeIcon = SlidersHorizontal;\nexport const TypeIcon = Type;\nexport const PaletteIcon = Palette;\nexport const EyeIcon = Eye;\nexport const MoveVerticalIcon = MoveVertical;\nexport const ResetIcon = RefreshCcw;\nexport const BoldIcon = Bold;\nexport const CaseUpperIcon = CaseUpper;\nexport const BlurIcon = Droplet;\n\n// Custom 10s Skip Icons using Lucide base\nexport const Replay10Icon = ({ className }: { className?: string }) => (\n <div className={`relative flex items-center justify-center ${className}`}>\n <RotateCcw className=\"w-full h-full\" strokeWidth={2} />\n <span className=\"absolute inset-0 flex items-center justify-center text-[32%] font-bold select-none mt-[1px]\">10</span>\n </div>\n);\n\nexport const Forward10Icon = ({ className }: { className?: string }) => (\n <div className={`relative flex items-center justify-center ${className}`}>\n <RotateCw className=\"w-full h-full\" strokeWidth={2} />\n <span className=\"absolute inset-0 flex items-center justify-center text-[32%] font-bold select-none mt-[1px]\">10</span>\n </div>\n);\n\nexport const StrataLogo = ({ className }: { className?: string }) => {\n // Use Vite's BASE_URL env variable to construct the path relative to the deployment root.\n // In dev, this is \"/\", so result is \"/logo.png\".\n // In prod, this is \"/StrataPlayer/\", so result is \"/StrataPlayer/logo.png\".\n const base = import.meta.env?.BASE_URL || '/';\n const src = `${base}logo.png`;\n\n return <img src={src} alt=\"StrataPlayer Logo\" className={className} />;\n};\n","\r\nimport React from 'react';\r\nimport { PlayerState } from '../../core/StrataCore';\r\nimport { LoaderIcon } from '../Icons';\r\n\r\nexport const NotificationContainer = ({ notifications }: { notifications: PlayerState['notifications'] }) => {\r\n return (\r\n <div className=\"absolute top-4 left-4 z-50 flex flex-col gap-2 pointer-events-none font-sans\">\r\n {notifications.map((n) => (\r\n <div\r\n key={n.id}\r\n className={`\r\n bg-zinc-950/80 backdrop-blur-md border border-white/10 text-white px-4 py-3 rounded-lg shadow-xl text-sm font-medium flex items-center gap-3 animate-in slide-in-from-left-2 fade-in duration-300 max-w-sm\r\n ${n.type === 'error' ? 'border-red-500/50 text-red-100' : ''}\r\n ${n.type === 'warning' ? 'border-amber-500/50 text-amber-100' : ''}\r\n `}\r\n >\r\n {n.type === 'loading' && <LoaderIcon className=\"w-4 h-4 animate-spin text-[var(--accent)]\" />}\r\n <div className=\"flex flex-col gap-1 w-full\">\r\n <span>{n.message}</span>\r\n {typeof n.progress === 'number' && (\r\n <div className=\"h-1 w-full bg-white/10 rounded-full overflow-hidden\">\r\n <div className=\"h-full bg-[var(--accent)] transition-all duration-300\" style={{ width: `${n.progress}%` }}></div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n","\r\nimport React from 'react';\r\nimport { SubtitleSettings } from '../../core/StrataCore';\r\n\r\nexport const SubtitleOverlay = ({ cues, settings }: { cues: string[], settings: SubtitleSettings }) => {\r\n if (settings.useNative || cues.length === 0) return null;\r\n\r\n const getTextShadow = () => {\r\n switch (settings.textStyle) {\r\n case 'outline': return '0px 0px 4px black, 0px 0px 4px black'; // Simplified stroke\r\n case 'raised': return '0 -1px 1px black, 0 -2px 2px black'; // Pseudo 3D raised\r\n case 'depressed': return '0 1px 1px white, 0 2px 2px black'; // Pseudo 3D depressed\r\n case 'shadow': return '2px 2px 2px rgba(0,0,0,0.8)';\r\n default: return 'none';\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n className=\"absolute inset-x-0 flex flex-col items-center justify-end text-center z-10 pointer-events-none transition-all duration-200\"\r\n style={{\r\n bottom: `${settings.verticalOffset}px`\r\n }}\r\n >\r\n {cues.map((text, i) => (\r\n <div\r\n key={i}\r\n className=\"mb-1 inline-block max-w-[80%]\"\r\n style={{\r\n fontSize: `${settings.textSize}%`,\r\n color: settings.textColor,\r\n fontWeight: settings.isBold ? 'bold' : 'normal',\r\n textTransform: settings.fixCapitalization ? 'capitalize' : 'none',\r\n textShadow: getTextShadow(),\r\n lineHeight: 1.4\r\n }}\r\n >\r\n <span\r\n className=\"px-2 py-0.5 rounded\"\r\n style={{\r\n backgroundColor: `rgba(0, 0, 0, ${settings.backgroundOpacity / 100})`,\r\n backdropFilter: settings.backgroundBlur ? `blur(${settings.backgroundBlurAmount}px)` : 'none',\r\n }}\r\n dangerouslySetInnerHTML={{ __html: text }} // VTT supports some HTML-like tags\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n","\r\nimport React, { useRef } from 'react';\r\nimport { ArrowLeftIcon, CheckIcon } from '../Icons';\r\n\r\nexport const Menu = ({ children, onClose, align = 'right', maxHeight, className }: { children?: React.ReactNode; onClose: () => void; align?: 'right' | 'center'; maxHeight?: number; className?: string }) => {\r\n const ref = useRef<HTMLDivElement>(null);\r\n\r\n const positionClasses = align === 'center' ? 'left-1/2 -translate-x-1/2 origin-bottom' : 'right-0 origin-bottom-right';\r\n\r\n const styleObj = maxHeight ? { maxHeight: `${maxHeight}px` } : {};\r\n\r\n return (\r\n <div\r\n className={`absolute bottom-full mb-4 ${positionClasses} bg-[var(--bg-panel)] backdrop-blur-xl border-[length:var(--border-width)] border-white/10 shadow-2xl overflow-hidden w-[300px] max-w-[calc(100vw-32px)] text-sm z-50 ring-1 ring-white/5 font-[family-name:var(--font-main)] flex flex-col p-1.5 transition-all duration-300 ease-out ${className}`}\r\n style={{ ...styleObj, borderRadius: 'var(--radius-lg)' }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"overflow-y-auto hide-scrollbar flex-1\" style={{ borderRadius: 'var(--radius)' }}>\r\n <div ref={ref}>{children}</div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const MenuItem = ({ label, value, active, onClick, hasSubmenu, icon }: any) => (\r\n <button\r\n onClick={onClick}\r\n className=\"w-full flex items-center justify-between px-3 py-2.5 hover:bg-white/10 transition-colors text-left text-zinc-200 active:bg-white/5 focus:outline-none focus:bg-white/10 group overflow-hidden my-0.5\"\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <div className=\"flex items-center gap-3 overflow-hidden\">\r\n {icon && <span className=\"text-zinc-400 shrink-0 group-hover:text-zinc-300 transition-colors\">{icon}</span>}\r\n <span className={`font-medium truncate text-sm ${active ? 'text-[var(--accent)]' : ''}`} title={label}>{label}</span>\r\n </div>\r\n <div className=\"flex items-center gap-2 text-zinc-400 shrink-0\">\r\n {value && <span className=\"text-xs font-medium truncate max-w-[60px]\" title={value}>{value}</span>}\r\n {active && <CheckIcon className=\"w-4 h-4 text-[var(--accent)] shrink-0\" />}\r\n {hasSubmenu && <span className=\"text-xs group-hover:translate-x-0.5 transition-transform text-zinc-500 shrink-0\">›</span>}\r\n </div>\r\n </button>\r\n);\r\n\r\nexport const MenuHeader = ({ label, onBack, rightAction }: { label: string, onBack: () => void, rightAction?: React.ReactNode }) => (\r\n <div\r\n className=\"px-3 py-2 mb-1 border-b border-white/5 font-bold text-zinc-400 uppercase text-[11px] tracking-wider flex justify-between items-center bg-white/5 sticky top-0 z-10 backdrop-blur-md\"\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <button\r\n className=\"flex items-center gap-2 hover:text-white transition-colors focus:outline-none\"\r\n onClick={onBack}\r\n >\r\n <ArrowLeftIcon className=\"w-3 h-3\" />\r\n <span>{label}</span>\r\n </button>\r\n {rightAction}\r\n </div>\r\n);\r\n\r\nexport const MenuDivider = () => <div className=\"h-px bg-white/5 mx-2 my-1\"></div>;\r\n","\r\nimport React from 'react';\r\n\r\nexport const Toggle = ({ label, checked, onChange, icon }: any) => (\r\n <div\r\n className=\"flex items-center justify-between py-2.5 px-3 hover:bg-white/5 group transition-colors\"\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n {icon && <span className=\"text-zinc-500 group-hover:text-zinc-400 transition-colors\">{icon}</span>}\r\n <span className=\"text-sm text-zinc-300 font-medium group-hover:text-white transition-colors\">{label}</span>\r\n </div>\r\n <button\r\n onClick={() => onChange(!checked)}\r\n className={`w-11 h-6 shrink-0 transition-colors relative focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-zinc-900 ${checked ? 'bg-[var(--accent)]' : 'bg-zinc-700'}`}\r\n style={{\r\n '--tw-ring-color': 'var(--accent)',\r\n borderRadius: 'var(--radius-full)',\r\n borderWidth: 'var(--border-width)',\r\n borderColor: 'rgba(255,255,255,0.1)'\r\n } as React.CSSProperties}\r\n >\r\n <div\r\n className={`absolute top-1/2 -translate-y-1/2 left-0.5 bg-white w-4 h-4 transition-transform shadow-sm ${checked ? 'translate-x-5' : 'translate-x-0'}`}\r\n style={{ borderRadius: 'var(--radius-full)' }}\r\n />\r\n </button>\r\n </div>\r\n);\r\n\r\nexport const Slider = ({ label, value, min, max, step, onChange, formatValue, icon }: any) => (\r\n <div\r\n className=\"py-2.5 px-3 hover:bg-white/5 group transition-colors\"\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <div className=\"flex justify-between items-center mb-2\">\r\n <div className=\"flex items-center gap-3\">\r\n {icon && <span className=\"text-zinc-500 group-hover:text-zinc-400 transition-colors\">{icon}</span>}\r\n <span className=\"text-xs font-bold text-zinc-400 uppercase tracking-wider group-hover:text-zinc-300 transition-colors\">{label}</span>\r\n </div>\r\n <span\r\n className=\"text-[10px] font-mono font-medium text-zinc-300 bg-white/10 px-1.5 py-0.5 tabular-nums\"\r\n style={{ borderRadius: 'var(--radius-sm)' }}\r\n >{formatValue ? formatValue(value) : value}</span>\r\n </div>\r\n <div className=\"relative h-4 flex items-center px-1\">\r\n <input\r\n type=\"range\"\r\n min={min} max={max} step={step}\r\n value={value}\r\n onChange={(e) => onChange(parseFloat(e.target.value))}\r\n className=\"w-full h-1.5 appearance-none cursor-pointer focus:outline-none focus:ring-2 strata-range-input\"\r\n style={{\r\n borderRadius: 'var(--radius-full)',\r\n background: `linear-gradient(to right, var(--accent) 0%, var(--accent) ${(value - min) / (max - min) * 100}%, #3f3f46 ${(value - min) / (max - min) * 100}%, #3f3f46 100%)`,\r\n '--tw-ring-color': 'var(--accent)'\r\n } as React.CSSProperties}\r\n />\r\n <style>{`\r\n .strata-range-input::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n height: 14px;\r\n width: 14px;\r\n background: #ffffff;\r\n cursor: pointer;\r\n box-shadow: 0 1px 3px rgba(0,0,0,0.5);\r\n transition: transform 0.1s;\r\n border-radius: var(--radius-full);\r\n border: var(--border-width) solid rgba(0,0,0,0.1);\r\n }\r\n .strata-range-input::-webkit-slider-thumb:hover {\r\n transform: scale(1.1);\r\n }\r\n /* Pixel theme specific overrides are handled by global css */\r\n `}</style>\r\n </div>\r\n </div>\r\n);\r\n\r\nexport const Select = ({ label, value, options, onChange, icon }: any) => (\r\n <div\r\n className=\"py-2.5 px-3 hover:bg-white/5 group transition-colors\"\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n {icon && <span className=\"text-zinc-500 group-hover:text-zinc-400 transition-colors\">{icon}</span>}\r\n <span className=\"text-xs font-bold text-zinc-400 uppercase tracking-wider group-hover:text-zinc-300 transition-colors\">{label}</span>\r\n </div>\r\n <div className=\"relative\">\r\n <select\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n className=\"w-full bg-zinc-800 border-[length:var(--border-width)] border-white/10 px-3 py-2 text-sm text-zinc-200 focus:outline-none focus:ring-2 appearance-none hover:bg-zinc-700 transition-colors cursor-pointer\"\r\n style={{ '--tw-ring-color': 'var(--accent)', borderRadius: 'var(--radius)' } as React.CSSProperties}\r\n >\r\n {options.map((opt: any) => (\r\n <option key={opt.value} value={opt.value}>{opt.label}</option>\r\n ))}\r\n </select>\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-zinc-400\">\r\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 1L5 5L9 1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" /></svg>\r\n </div>\r\n </div>\r\n </div>\r\n);\r\n\r\nexport const SettingsGroup = ({ title, children }: any) => (\r\n <div className=\"py-2\">\r\n {title && <h4 className=\"px-3 text-[10px] font-bold text-[var(--accent)] uppercase tracking-wider mb-1 mt-2\">{title}</h4>}\r\n <div className=\"space-y-0.5\">\r\n {children}\r\n </div>\r\n </div>\r\n);\r\n","\r\nimport React, { useState, useRef } from 'react';\r\nimport { SubtitleSettings } from '../../core/StrataCore';\r\nimport { Menu, MenuItem, MenuHeader } from './Menu';\r\nimport { SettingsGroup, Toggle, Slider, Select } from './SettingsPrimitives';\r\nimport {\r\n UploadIcon, CustomizeIcon, ResetIcon, ClockIcon,\r\n MinusIcon, PlusIcon, MoveVerticalIcon, TypeIcon,\r\n PaletteIcon, BoldIcon, CaseUpperIcon, EyeIcon, BlurIcon\r\n} from '../Icons';\r\n\r\nexport const SubtitleMenu = ({ tracks, current, onSelect, onUpload, onClose, settings, onSettingsChange, onReset, offset, maxHeight, animationClass }: any) => {\r\n const [view, setView] = useState<'main' | 'customize'>('main');\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n return (\r\n <Menu onClose={onClose} align=\"right\" maxHeight={maxHeight} className={animationClass}>\r\n {view === 'main' && (\r\n <div className=\"animate-in slide-in-from-left-4 fade-in duration-200\">\r\n <div className=\"px-3 py-2 mb-1 border-b border-white/5 font-bold text-zinc-400 uppercase text-[11px] tracking-wider flex justify-between items-center bg-white/5 rounded-lg\">\r\n <span>Subtitles</span>\r\n </div>\r\n <div>\r\n <MenuItem\r\n label=\"Upload Subtitle\"\r\n icon={<UploadIcon className=\"w-4 h-4\" />}\r\n onClick={() => fileInputRef.current?.click()}\r\n />\r\n <input type=\"file\" accept=\".vtt,.srt\" ref={fileInputRef} className=\"hidden\" onChange={(e) => { if (e.target.files?.[0]) onUpload(e.target.files[0]); }} />\r\n <MenuItem\r\n label=\"Customize\"\r\n icon={<CustomizeIcon className=\"w-4 h-4\" />}\r\n onClick={() => setView('customize')}\r\n hasSubmenu\r\n />\r\n <div className=\"h-px bg-white/5 mx-2 my-1\"></div>\r\n <MenuItem\r\n label=\"Off\"\r\n active={current === -1}\r\n onClick={() => { onSelect(-1); onClose(); }}\r\n />\r\n {tracks.map((track: any) => (\r\n <MenuItem\r\n key={track.index}\r\n label={track.label}\r\n value={track.language}\r\n active={current === track.index}\r\n onClick={() => { onSelect(track.index); onClose(); }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {view === 'customize' && (\r\n <div className=\"animate-in slide-in-from-right-4 fade-in duration-200\">\r\n <MenuHeader\r\n label=\"Customize\"\r\n onBack={() => setView('main')}\r\n rightAction={\r\n <button onClick={onReset} className=\"p-1.5 text-zinc-400 hover:text-white transition-colors rounded-md hover:bg-white/10\" title=\"Reset All\">\r\n <ResetIcon className=\"w-4 h-4\" />\r\n </button>\r\n }\r\n />\r\n\r\n <div className=\"pb-1\">\r\n <SettingsGroup>\r\n <Toggle\r\n label=\"Native Video Subtitle\"\r\n checked={settings.useNative}\r\n onChange={(val: boolean) => onSettingsChange({ useNative: val })}\r\n />\r\n </SettingsGroup>\r\n\r\n {!settings.useNative && (\r\n <>\r\n <SettingsGroup title=\"Sync & Position\">\r\n <div className=\"py-2.5 px-3 rounded-lg hover:bg-white/5 group transition-colors\">\r\n <div className=\"flex justify-between items-center mb-2\">\r\n <div className=\"flex items-center gap-3\">\r\n <ClockIcon className=\"w-4 h-4 text-zinc-500 group-hover:text-zinc-400 transition-colors\" />\r\n <span className=\"text-xs font-bold text-zinc-400 uppercase tracking-wider group-hover:text-zinc-300 transition-colors\">Sync Offset</span>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => { const player = (window as any)._strataPlayer; if (player) player.setSubtitleOffset(Math.round((offset - 0.1) * 10) / 10); }}\r\n className=\"w-8 h-8 flex items-center justify-center bg-zinc-800 rounded-lg hover:bg-zinc-700 text-zinc-300 transition-colors active:scale-95\"\r\n >\r\n <MinusIcon className=\"w-4 h-4\" />\r\n </button>\r\n <div className=\"flex-1 bg-zinc-900 border border-white/5 rounded-lg h-8 flex items-center justify-center text-xs font-mono font-medium text-[var(--accent)]\">\r\n {offset > 0 ? '+' : ''}{offset?.toFixed(1) || '0.0'}s\r\n </div>\r\n <button\r\n onClick={() => { const player = (window as any)._strataPlayer; if (player) player.setSubtitleOffset(Math.round((offset + 0.1) * 10) / 10); }}\r\n className=\"w-8 h-8 flex items-center justify-center bg-zinc-800 rounded-lg hover:bg-zinc-700 text-zinc-300 transition-colors active:scale-95\"\r\n >\r\n <PlusIcon className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <Slider\r\n label=\"Vertical Position\"\r\n icon={<MoveVerticalIcon className=\"w-4 h-4\" />}\r\n value={settings.verticalOffset}\r\n min={0} max={200} step={5}\r\n onChange={(val: number) => onSettingsChange({ verticalOffset: val })}\r\n formatValue={(v: number) => `${v}px`}\r\n />\r\n </SettingsGroup>\r\n\r\n <SettingsGroup title=\"Appearance\">\r\n <Slider\r\n label=\"Text Size\"\r\n icon={<TypeIcon className=\"w-4 h-4\" />}\r\n value={settings.textSize}\r\n min={50} max={200} step={10}\r\n onChange={(val: number) => onSettingsChange({ textSize: val })}\r\n formatValue={(v: number) => `${v}%`}\r\n />\r\n\r\n <div className=\"py-2.5 px-3 rounded-lg hover:bg-white/5 group transition-colors\">\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <PaletteIcon className=\"w-4 h-4 text-zinc-500 group-hover:text-zinc-400 transition-colors\" />\r\n <span className=\"text-xs font-bold text-zinc-400 uppercase tracking-wider group-hover:text-zinc-300 transition-colors\">Text Color</span>\r\n </div>\r\n <div className=\"flex items-center justify-between gap-2 p-1 bg-zinc-800/50 rounded-lg\">\r\n {['#ffffff', '#ffff00', '#00ffff', '#ff00ff', '#ff0000', '#00ff00'].map(c => (\r\n <button\r\n key={c}\r\n onClick={() => onSettingsChange({ textColor: c })}\r\n className={`w-6 h-6 rounded-full border border-white/10 transition-transform hover:scale-110 ${settings.textColor === c ? 'ring-2 scale-110' : ''}`}\r\n style={{ backgroundColor: c, '--tw-ring-color': 'var(--accent)' } as any}\r\n />\r\n ))}\r\n <div className=\"w-px h-6 bg-white/10 mx-1\"></div>\r\n <div className=\"relative w-6 h-6 rounded-full overflow-hidden ring-1 ring-white/20 cursor-pointer\">\r\n <input\r\n type=\"color\"\r\n value={settings.textColor}\r\n onChange={(e) => onSettingsChange({ textColor: e.target.value })}\r\n className=\"absolute inset-[-4px] w-[150%] h-[150%] cursor-pointer p-0 border-0\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Select\r\n label=\"Text Style\"\r\n value={settings.textStyle}\r\n options={[\r\n { label: 'None', value: 'none' },\r\n { label: 'Outline', value: 'outline' },\r\n { label: 'Raised', value: 'raised' },\r\n { label: 'Depressed', value: 'depressed' },\r\n { label: 'Drop Shadow', value: 'shadow' },\r\n ]}\r\n onChange={(val: string) => onSettingsChange({ textStyle: val })}\r\n />\r\n\r\n <div className=\"grid grid-cols-2 gap-2 mt-1 px-1\">\r\n <Toggle label=\"Bold\" icon={<BoldIcon className=\"w-4 h-4\" />} checked={settings.isBold} onChange={(v: boolean) => onSettingsChange({ isBold: v })} />\r\n <Toggle label=\"Fix Caps\" icon={<CaseUpperIcon className=\"w-4 h-4\" />} checked={settings.fixCapitalization} onChange={(v: boolean) => onSettingsChange({ fixCapitalization: v })} />\r\n </div>\r\n </SettingsGroup>\r\n\r\n <SettingsGroup title=\"Background\">\r\n <Slider\r\n label=\"Opacity\"\r\n icon={<EyeIcon className=\"w-4 h-4\" />}\r\n value={settings.backgroundOpacity}\r\n min={0} max={100} step={5}\r\n onChange={(val: number) => onSettingsChange({ backgroundOpacity: val })}\r\n formatValue={(v: number) => `${v}%`}\r\n />\r\n\r\n <Toggle label=\"Blur Background\" icon={<BlurIcon className=\"w-4 h-4\" />} checked={settings.backgroundBlur} onChange={(v: boolean) => onSettingsChange({ backgroundBlur: v })} />\r\n\r\n {settings.backgroundBlur && (\r\n <Slider\r\n label=\"Blur Intensity\"\r\n value={settings.backgroundBlurAmount}\r\n min={0} max={20} step={1}\r\n onChange={(val: number) => onSettingsChange({ backgroundBlurAmount: val })}\r\n formatValue={(v: number) => `${v}px`}\r\n />\r\n )}\r\n </SettingsGroup>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </Menu>\r\n );\r\n};\r\n","\nimport React, { useEffect, useRef, useState, useSyncExternalStore, useCallback, useMemo } from 'react';\nimport { StrataCore, PlayerState, TextTrackConfig, SubtitleSettings, PlayerTheme, StrataConfig, getResolvedState, DEFAULT_STATE, IPlugin, PlayerSource } from '../core/StrataCore';\nimport { HlsPlugin } from '../plugins/HlsPlugin';\nimport { formatTime, parseVTT, ThumbnailCue } from '../utils/playerUtils';\nimport { useTransition } from './hooks/useTransition';\nimport { NotificationContainer } from './components/NotificationContainer';\nimport { SubtitleOverlay } from './components/SubtitleOverlay';\nimport { Menu, MenuItem, MenuHeader, MenuDivider } from './components/Menu';\nimport { SubtitleMenu } from './components/SubtitleMenu';\nimport { SettingsGroup } from './components/SettingsPrimitives';\nimport {\n PlayIcon, PauseIcon, VolumeHighIcon, VolumeLowIcon, VolumeMuteIcon,\n MaximizeIcon, MinimizeIcon, SettingsIcon, PipIcon,\n SubtitleIcon, DownloadIcon, Replay10Icon, Forward10Icon,\n LoaderIcon, CastIcon, UsersIcon, PaletteIcon, CheckIcon,\n CustomizeIcon\n} from './Icons';\n\ndeclare module 'react' {\n namespace JSX {\n interface IntrinsicElements {\n 'google-cast-launcher': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n// --- Main Player Component ---\n\ninterface StrataPlayerProps extends StrataConfig {\n src?: string; // Optional if sources are provided\n sources?: PlayerSource[]; // Array of sources\n poster?: string;\n autoPlay?: boolean;\n thumbnails?: string; // URL to VTT thumbnails\n textTracks?: TextTrackConfig[];\n plugins?: IPlugin[]; // Allow injecting plugins from outside\n}\n\nconst THEME_COLORS = [\n { label: 'Strata', value: '#6366f1' },\n { label: 'Emerald', value: '#10b981' },\n { label: 'Rose', value: '#f43f5e' },\n { label: 'Amber', value: '#f59e0b' },\n { label: 'Sky', value: '#0ea5e9' },\n { label: 'Violet', value: '#8b5cf6' },\n];\n\nconst THEMES: { label: string, value: PlayerTheme, color: string }[] = [\n { label: 'Default', value: 'default', color: '#6366f1' },\n { label: 'Pixel', value: 'pixel', color: '#ef4444' },\n { label: 'Game', value: 'game', color: '#eab308' },\n { label: 'Hacker', value: 'hacker', color: '#22c55e' },\n];\n\nexport const StrataPlayer = (props: StrataPlayerProps) => {\n const { src, sources, poster, autoPlay, thumbnails, textTracks, plugins, ...config } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [player, setPlayer] = useState<StrataCore | null>(null);\n const [hasPlayed, setHasPlayed] = useState(false);\n const [playerHeight, setPlayerHeight] = useState(0);\n\n // Resolve initial state based on props + defaults + localStorage BEFORE mounting\n // This prevents layout shift or theme flash on first render\n const initialState = useMemo(() => getResolvedState(config), []);\n\n const state = useSyncExternalStore<PlayerState>(\n useCallback((cb) => player ? player.store.subscribe(cb) : () => { }, [player]),\n () => player ? player.store.get() : initialState,\n () => initialState\n );\n\n const [showControls, setShowControls] = useState(true);\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [subtitleMenuOpen, setSubtitleMenuOpen] = useState(false);\n const [activeMenu, setActiveMenu] = useState<'main' | 'quality' | 'speed' | 'audio' | 'boost' | 'party' | 'appearance' | 'sources'>('main');\n\n // Transition States\n const settingsTransition = useTransition(settingsOpen, 200);\n const subtitleTransition = useTransition(subtitleMenuOpen, 200);\n\n // Seek & Scrubbing State\n const [isScrubbing, setIsScrubbing] = useState(false);\n const [scrubbingTime, setScrubbingTime] = useState(0);\n const [isVolumeScrubbing, setIsVolumeScrubbing] = useState(false);\n const [isVolumeHovered, setIsVolumeHovered] = useState(false);\n const [thumbnailCues, setThumbnailCues] = useState<ThumbnailCue[]>([]);\n const [hoverTime, setHoverTime] = useState<number | null>(null);\n const [hoverPos, setHoverPos] = useState<number>(0);\n const [currentThumbnail, setCurrentThumbnail] = useState<ThumbnailCue | null>(null);\n const [seekAnimation, setSeekAnimation] = useState<{ type: 'forward' | 'rewind', id: number } | null>(null);\n const [skipTrigger, setSkipTrigger] = useState<'forward' | 'rewind' | null>(null);\n const clickTimeoutRef = useRef<any>(null);\n const controlsTimeoutRef = useRef<any>(null);\n const progressBarRef = useRef<HTMLDivElement>(null);\n const volumeBarRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const core = new StrataCore(config);\n (window as any)._strataPlayer = core; // Hack for menu access to offset\n\n // Register plugins\n if (plugins && plugins.length > 0) {\n plugins.forEach(p => core.use(p));\n } else {\n // Fallback default HLS plugin if none provided (for backward compat)\n core.use(new HlsPlugin());\n }\n\n core.attach(containerRef.current);\n setPlayer(core);\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setPlayerHeight(entry.contentRect.height);\n }\n });\n observer.observe(containerRef.current);\n\n return () => {\n observer.disconnect();\n core.destroy();\n setPlayer(null);\n (window as any)._strataPlayer = null;\n };\n }, []);\n\n // Reactive Prop Updates\n useEffect(() => {\n if (!player) return;\n // Update appearance if props change\n const updates: any = {};\n if (config.theme !== undefined && config.theme !== state.theme) updates.theme = config.theme;\n if (config.themeColor !== undefined && config.themeColor !== state.themeColor) updates.themeColor = config.themeColor;\n if (config.iconSize !== undefined && config.iconSize !== state.iconSize) updates.iconSize = config.iconSize;\n\n if (Object.keys(updates).length > 0) {\n player.setAppearance(updates);\n }\n\n // Update volume/mute if controlled props change\n if (config.volume !== undefined && Math.abs(config.volume - state.volume) > 0.01) player.setVolume(config.volume);\n if (config.muted !== undefined && config.muted !== state.isMuted) {\n if (config.muted) player.video.muted = true;\n else { player.video.muted = false; }\n // State update happens via listener\n }\n }, [player, config.theme, config.themeColor, config.iconSize, config.volume, config.muted]);\n\n useEffect(() => {\n if (!player) return;\n\n const tracks = textTracks || [];\n\n // Priority: Sources Array > Single Src\n if (sources && sources.length > 0) {\n setHasPlayed(false);\n player.setSources(sources, tracks);\n } else if (src) {\n setHasPlayed(false);\n player.setSources([{ url: src, type: 'auto' }], tracks);\n }\n\n }, [src, sources, textTracks, player]);\n\n useEffect(() => {\n // We handle poster manually to support cover\n // if (player && poster) player.video.poster = poster;\n }, [player, poster]);\n\n useEffect(() => {\n if (player && autoPlay) {\n player.video.muted = true;\n player.store.setState({ isMuted: true });\n player.play().catch(() => { });\n }\n }, [player, autoPlay]);\n\n useEffect(() => {\n if (state.isPlaying && !hasPlayed) setHasPlayed(true);\n }, [state.isPlaying, hasPlayed]);\n\n useEffect(() => {\n if (thumbnails && player) {\n parseVTT(thumbnails, player.notify.bind(player)).then(setCues => setThumbnailCues(setCues));\n } else setThumbnailCues([]);\n }, [thumbnails, player]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!player) return;\n if (document.activeElement?.tagName === 'INPUT') return;\n switch (e.key.toLowerCase()) {\n case ' ': case 'k': e.preventDefault(); player.togglePlay(); break;\n case 'arrowright': e.preventDefault(); player.skip(5); break;\n case 'arrowleft': e.preventDefault(); player.skip(-5); break;\n case 'arrowup': e.preventDefault(); player.setVolume(player.video.volume + 0.1); break;\n case 'arrowdown': e.preventDefault(); player.setVolume(player.video.volume - 0.1); break;\n case 'f': e.preventDefault(); player.toggleFullscreen(); break;\n case 'm': e.preventDefault(); player.toggleMute(); break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [player]);\n\n const handleMouseMove = () => {\n setShowControls(true);\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\n if (settingsOpen || subtitleMenuOpen) return;\n controlsTimeoutRef.current = setTimeout(() => {\n if (!state.isPlaying || settingsOpen || subtitleMenuOpen) return;\n setShowControls(false);\n }, 2500);\n };\n\n useEffect(() => {\n if (!settingsOpen && !subtitleMenuOpen && state.isPlaying) handleMouseMove();\n else if (settingsOpen || subtitleMenuOpen) { setShowControls(true); if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current); }\n }, [settingsOpen, subtitleMenuOpen, state.isPlaying]);\n\n const calculateTimeFromEvent = (e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent) => {\n if (!progressBarRef.current || !state.duration) return 0;\n const rect = progressBarRef.current.getBoundingClientRect();\n const clientX = 'touches' in e ? (e as TouchEvent).touches[0].clientX : (e as MouseEvent).clientX;\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return pct * state.duration;\n };\n\n const handleSeekStart = (e: React.MouseEvent | React.TouchEvent) => {\n setIsScrubbing(true);\n setScrubbingTime(calculateTimeFromEvent(e));\n const handleMove = (moveEvent: MouseEvent | TouchEvent) => setScrubbingTime(calculateTimeFromEvent(moveEvent));\n const handleUp = (upEvent: MouseEvent | TouchEvent) => {\n player?.seek(calculateTimeFromEvent(upEvent));\n setIsScrubbing(false);\n document.removeEventListener('mousemove', handleMove); document.removeEventListener('touchmove', handleMove);\n document.removeEventListener('mouseup', handleUp); document.removeEventListener('touchend', handleUp);\n };\n document.addEventListener('mousemove', handleMove); document.addEventListener('touchmove', handleMove);\n document.addEventListener('mouseup', handleUp); document.addEventListener('touchend', handleUp);\n };\n\n const calculateVolumeFromEvent = (e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent) => {\n if (!volumeBarRef.current) return 0;\n const rect = volumeBarRef.current.getBoundingClientRect();\n const clientX = 'touches' in e ? (e as TouchEvent).touches[0].clientX : (e as MouseEvent).clientX;\n return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n };\n\n const handleVolumeStart = (e: React.MouseEvent | React.TouchEvent) => {\n if (!player) return;\n setIsVolumeScrubbing(true);\n player.setVolume(calculateVolumeFromEvent(e));\n const handleMove = (moveEvent: MouseEvent | TouchEvent) => player.setVolume(calculateVolumeFromEvent(moveEvent));\n const handleUp = () => {\n setIsVolumeScrubbing(false);\n document.removeEventListener('mousemove', handleMove); document.removeEventListener('touchmove', handleMove);\n document.removeEventListener('mouseup', handleUp); document.removeEventListener('touchend', handleUp);\n };\n document.addEventListener('mousemove', handleMove); document.addEventListener('touchmove', handleMove);\n document.addEventListener('mouseup', handleUp); document.addEventListener('touchend', handleUp);\n };\n\n const handleProgressMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!state.duration) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const percent = (e.clientX - rect.left) / rect.width;\n const time = percent * state.duration;\n setHoverPos(percent * 100);\n setHoverTime(time);\n if (thumbnailCues.length > 0) setCurrentThumbnail(thumbnailCues.find(c => time >= c.start && time < c.end) || null);\n };\n\n const triggerSkip = (direction: 'forward' | 'rewind') => {\n if (!player) return;\n player.skip(direction === 'forward' ? 10 : -10);\n setSkipTrigger(direction);\n setTimeout(() => setSkipTrigger(null), 300);\n };\n\n const handleContainerClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (settingsOpen) setSettingsOpen(false);\n if (subtitleMenuOpen) setSubtitleMenuOpen(false);\n if (!player) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const width = rect.width;\n const now = Date.now();\n\n if (clickTimeoutRef.current) {\n clearTimeout(clickTimeoutRef.current);\n clickTimeoutRef.current = null;\n if (x < width * 0.35) { triggerSkip('rewind'); setSeekAnimation({ type: 'rewind', id: now }); }\n else if (x > width * 0.65) { triggerSkip('forward'); setSeekAnimation({ type: 'forward', id: now }); }\n else player.toggleFullscreen();\n } else {\n clickTimeoutRef.current = setTimeout(() => {\n player.togglePlay();\n clickTimeoutRef.current = null;\n }, 250);\n }\n };\n\n const VolIcon = state.isMuted || state.volume === 0 ? VolumeMuteIcon : state.volume < 0.5 ? VolumeLowIcon : VolumeHighIcon;\n\n // Calculate max height for menus based on player height\n // ~120px gives room for controls (bottom) and some margin (top)\n const menuMaxHeight = Math.max(100, playerHeight - 120);\n\n // Icon Size Logic\n const getIconClass = () => {\n switch (state.iconSize) {\n case 'small': return 'w-4 h-4';\n case 'large': return 'w-6 h-6';\n default: return 'w-5 h-5';\n }\n }\n const getButtonClass = () => {\n switch (state.iconSize) {\n case 'small': return 'p-1.5';\n case 'large': return 'p-2.5';\n default: return 'p-2';\n }\n }\n const iconClass = getIconClass();\n const btnClass = getButtonClass();\n\n const getCenterSizes = () => {\n switch (state.iconSize) {\n case 'small':\n return {\n playBtn: 'w-14 h-14',\n playIcon: 'w-6 h-6',\n skipBtn: 'w-10 h-10',\n skipIcon: 'w-5 h-5'\n };\n case 'large':\n return {\n playBtn: 'w-24 h-24',\n playIcon: 'w-12 h-12',\n skipBtn: 'w-16 h-16',\n skipIcon: 'w-8 h-8'\n };\n default: // medium\n return {\n playBtn: 'w-20 h-20',\n playIcon: 'w-9 h-9',\n skipBtn: 'w-12 h-12',\n skipIcon: 'w-6 h-6'\n };\n }\n }\n const center = getCenterSizes();\n\n return (\n <div\n ref={containerRef}\n className=\"group relative w-full h-full bg-black overflow-hidden select-none font-[family-name:var(--font-main)] outline-none touch-none rounded-[var(--radius)] text-zinc-100\"\n onMouseMove={handleMouseMove}\n onMouseLeave={() => { if (state.isPlaying && !settingsOpen && !subtitleMenuOpen) setShowControls(false); }}\n tabIndex={0}\n role=\"region\"\n aria-label=\"Video Player\"\n data-theme={state.theme}\n style={{ '--accent': state.themeColor } as React.CSSProperties}\n >\n <style>{`\n [data-theme=\"default\"] {\n --radius: 0.75rem;\n --radius-lg: 0.75rem;\n --radius-sm: 0.375rem;\n --radius-full: 9999px;\n --font-main: \"Inter\", sans-serif;\n --border-width: 0px;\n --bg-panel: rgba(9, 9, 11, 0.95);\n --tooltip-bg: #ffffff;\n --tooltip-text: #000000;\n --tooltip-border: 0px solid transparent;\n }\n [data-theme=\"pixel\"] {\n --radius: 0px;\n --radius-lg: 0px;\n --radius-sm: 0px;\n --radius-full: 0px;\n --font-main: \"Press Start 2P\", cursive;\n --border-width: 2px;\n --bg-panel: #000000;\n --tooltip-bg: #000000;\n --tooltip-text: #ffffff;\n --tooltip-border: 2px solid #ffffff;\n image-rendering: pixelated;\n }\n [data-theme=\"game\"] {\n --radius: 4px;\n --radius-lg: 6px;\n --radius-sm: 2px;\n --radius-full: 4px;\n --font-main: \"Cinzel\", serif;\n --border-width: 1px;\n --bg-panel: #0a0a0a;\n --tooltip-bg: #1a1a1a;\n --tooltip-text: #ffffff;\n --tooltip-border: 1px solid var(--accent);\n }\n [data-theme=\"hacker\"] {\n --radius: 0px;\n --radius-lg: 0px;\n --radius-sm: 0px;\n --radius-full: 0px;\n --font-main: \"JetBrains Mono\", monospace;\n --border-width: 1px;\n --bg-panel: #000000;\n --tooltip-bg: #000000;\n --tooltip-text: var(--accent);\n --tooltip-border: 1px solid var(--accent);\n text-shadow: 0 0 5px var(--accent);\n }\n \n /* Specific Theme Overrides */\n [data-theme=\"pixel\"] .strata-control-btn {\n border: 2px solid white;\n background: black;\n }\n [data-theme=\"pixel\"] .strata-control-btn:hover {\n background: white;\n color: black;\n }\n [data-theme=\"pixel\"] .strata-range-input::-webkit-slider-thumb {\n border-radius: 0 !important;\n height: 16px !important;\n width: 16px !important;\n box-shadow: none !important;\n }\n \n [data-theme=\"hacker\"] .strata-scanlines {\n background: linear-gradient(\n to bottom,\n rgba(255,255,255,0),\n rgba(255,255,255,0) 50%,\n rgba(0,0,0,0.2) 50%,\n rgba(0,0,0,0.2)\n );\n background-size: 100% 4px;\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 40;\n }\n\n .strata-tooltip {\n background-color: var(--tooltip-bg);\n color: var(--tooltip-text);\n border: var(--tooltip-border);\n border-radius: var(--radius-sm);\n font-family: var(--font-main);\n }\n `}</style>\n\n {state.theme === 'hacker' && <div className=\"strata-scanlines\" />}\n\n {!player && <div className=\"absolute inset-0 flex items-center justify-center bg-zinc-950 z-50\"><LoaderIcon className=\"w-10 h-10 text-[var(--accent)] animate-spin\" /></div>}\n {player && (\n <>\n <NotificationContainer notifications={state.notifications} />\n <SubtitleOverlay cues={state.activeCues} settings={state.subtitleSettings} />\n <div className=\"absolute inset-0 z-0\" onClick={handleContainerClick} aria-hidden=\"true\" />\n\n {/* Custom Poster Overlay */}\n {poster && !hasPlayed && (\n <div\n className=\"absolute inset-0 bg-cover bg-center z-[5] pointer-events-none\"\n style={{ backgroundImage: `url(${poster})` }}\n />\n )}\n\n {seekAnimation && (\n <div key={seekAnimation.id} className={`absolute top-0 bottom-0 flex items-center justify-center w-[35%] z-20 bg-white/5 backdrop-blur-[1px] animate-out fade-out duration-500 ${seekAnimation.type === 'rewind' ? 'left-0 rounded-r-[4rem]' : 'right-0 rounded-l-[4rem]'}`} onAnimationEnd={() => setSeekAnimation(null)}>\n <div className=\"flex flex-col items-center text-white drop-shadow-lg\">\n {seekAnimation.type === 'rewind' ? <Replay10Icon className=\"w-12 h-12 animate-pulse\" /> : <Forward10Icon className=\"w-12 h-12 animate-pulse\" />}\n <span className=\"font-bold text-sm mt-2 font-mono\">{seekAnimation.type === 'rewind' ? '-10s' : '+10s'}</span>\n </div>\n </div>\n )}\n {state.isBuffering && <div className=\"absolute inset-0 flex items-center justify-center z-20 pointer-events-none\"><LoaderIcon className=\"w-12 h-12 text-[var(--accent)] animate-spin drop-shadow-lg\" /></div>}\n {state.error && <div className=\"absolute inset-0 flex items-center justify-center z-30 bg-black/90 backdrop-blur-md animate-in fade-in\"><div className=\"flex flex-col items-center gap-4 text-red-500 p-8 max-w-md text-center\"><span className=\"text-5xl mb-2\">⚠️</span><h3 className=\"text-xl font-bold text-white\">Playback Error</h3><p className=\"text-zinc-400 text-sm\">{state.error}</p><button onClick={() => player.load(player.store.get().sources[player.store.get().currentSourceIndex] || { url: src || '' }, textTracks)} className=\"px-6 py-2 bg-[var(--accent)] text-white font-medium rounded-full hover:opacity-90 transition-opacity mt-4 shadow-lg\">Try Again</button></div></div>}\n {((!state.isPlaying && !state.isBuffering && !state.error) || showControls) && !state.isBuffering ? (\n <div className={`absolute inset-0 flex items-center justify-center z-10 transition-opacity duration-300 pointer-events-none ${showControls || !state.isPlaying ? 'opacity-100' : 'opacity-0'}`}>\n <div className=\"flex items-center gap-8 md:gap-16 pointer-events-auto\">\n <button onClick={(e) => { e.stopPropagation(); setSettingsOpen(false); setSubtitleMenuOpen(false); triggerSkip('rewind'); }} className={`group flex items-center justify-center rounded-full bg-black/40 hover:bg-black/60 border border-white/10 transition-all active:scale-110 text-white/90 focus:outline-none backdrop-blur-sm ${center.skipBtn}`}><Replay10Icon className={center.skipIcon} /></button>\n <button onClick={(e) => { e.stopPropagation(); setSettingsOpen(false); setSubtitleMenuOpen(false); player.togglePlay(); }} className={`group relative flex items-center justify-center rounded-full bg-white/10 hover:bg-[var(--accent)] border border-white/10 shadow-2xl transition-all hover:scale-105 active:scale-110 duration-75 focus:outline-none backdrop-blur-md ${center.playBtn}`}>{state.isPlaying ? <PauseIcon className={`${center.playIcon} text-white fill-current`} /> : <PlayIcon className={`${center.playIcon} text-white ml-1 fill-current`} />}</button>\n <button onClick={(e) => { e.stopPropagation(); setSettingsOpen(false); setSubtitleMenuOpen(false); triggerSkip('forward'); }} className={`group flex items-center justify-center rounded-full bg-black/40 hover:bg-black/60 border border-white/10 transition-all active:scale-110 text-white/90 focus:outline-none backdrop-blur-sm ${center.skipBtn}`}><Forward10Icon className={center.skipIcon} /></button>\n </div>\n </div>\n ) : null}\n <div className={`absolute inset-x-0 bottom-0 z-30 transition-all duration-300 px-4 md:px-6 pb-4 md:pb-6 pt-24 bg-gradient-to-t from-black/95 via-black/70 to-transparent ${showControls ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'}`} onClick={(e) => { if (e.target === e.currentTarget) { setSettingsOpen(false); setSubtitleMenuOpen(false); } e.stopPropagation(); }}>\n <div\n ref={progressBarRef}\n className=\"relative w-full h-3 group/slider mb-3 cursor-pointer touch-none flex items-center\"\n onMouseMove={handleProgressMove}\n onMouseLeave={() => { setHoverTime(null); setCurrentThumbnail(null); }}\n onMouseDown={handleSeekStart}\n onTouchStart={handleSeekStart}\n >\n {hoverTime !== null && (<div className=\"absolute bottom-full mb-1.5 flex flex-col items-center transform -translate-x-1/2 z-40 pointer-events-none transition-opacity duration-150\" style={{ left: `clamp(70px, ${hoverPos}%, calc(100% - 70px))` }}>{currentThumbnail && (<div className=\"bg-black/90 border border-white/10 shadow-2xl overflow-hidden backdrop-blur-sm\" style={{ width: `${currentThumbnail.w * 0.5}px`, height: `${currentThumbnail.h * 0.5}px`, borderRadius: 'var(--radius)' }}><div style={{ backgroundImage: `url(\"${currentThumbnail.url}\")`, width: `${currentThumbnail.w}px`, height: `${currentThumbnail.h}px`, backgroundPosition: `-${currentThumbnail.x}px -${currentThumbnail.y}px`, backgroundRepeat: 'no-repeat', transform: 'scale(0.5)', transformOrigin: 'top left' }} /></div>)}<div className=\"strata-tooltip px-2 py-0.5 text-[11px] font-bold font-mono shadow-lg tabular-nums mt-1\">{formatTime(hoverTime)}</div></div>)}\n\n {/* Track */}\n <div className=\"w-full h-1 bg-white/20 overflow-hidden relative backdrop-blur-sm border-[length:var(--border-width)] border-white/10\" style={{ borderRadius: 'var(--radius-full)' }}>\n {state.duration > 0 && state.buffered.map((range, i) => (<div key={i} className=\"absolute top-0 bottom-0 bg-white/20\" style={{ left: `${(range.start / state.duration) * 100}%`, width: `${((range.end - range.start) / state.duration) * 100}%` }} />))}\n <div className=\"absolute left-0 top-0 bottom-0 bg-[var(--accent)]\" style={{ width: `${((isScrubbing ? scrubbingTime : state.currentTime) / state.duration) * 100}%` }} />\n </div>\n\n {/* Thumb */}\n <div\n className=\"absolute top-1/2 -translate-y-1/2 -translate-x-1/2 w-3.5 h-3.5 bg-white shadow-md scale-0 group-hover/slider:scale-100 transition-transform duration-100 z-10\"\n style={{\n left: `${((isScrubbing ? scrubbingTime : state.currentTime) / state.duration) * 100}%`,\n borderRadius: 'var(--radius-full)'\n }}\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <button onClick={() => player.togglePlay()} className={`strata-control-btn text-zinc-300 hover:text-white transition-colors hover:bg-white/10 focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}>{state.isPlaying ? <PauseIcon className={`${iconClass} fill-current`} /> : <PlayIcon className={`${iconClass} fill-current`} />}</button>\n\n <div className=\"flex items-center gap-2 group/vol relative\" onMouseEnter={() => setIsVolumeHovered(true)} onMouseLeave={() => setIsVolumeHovered(false)}>\n <button onClick={() => player.toggleMute()} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}><VolIcon className={iconClass} /></button>\n <div className={`relative h-8 flex items-center transition-all duration-300 ease-out overflow-hidden ${isVolumeHovered || isVolumeScrubbing ? 'w-28 opacity-100 ml-1' : 'w-0 opacity-0'}`}>\n <div ref={volumeBarRef} className=\"relative w-full h-full flex items-center cursor-pointer px-2\" onMouseDown={handleVolumeStart} onTouchStart={handleVolumeStart}>\n <div className=\"w-full h-1 bg-white/20 overflow-hidden\" style={{ borderRadius: 'var(--radius-full)' }}>\n <div className=\"h-full bg-white\" style={{ width: `${(state.isMuted ? 0 : state.volume) * 100}%`, borderRadius: 'var(--radius-full)' }}></div>\n </div>\n <div className=\"absolute h-3 w-3 bg-white shadow-md top-1/2 -translate-y-1/2 pointer-events-none\" style={{ left: `calc(${(state.isMuted ? 0 : state.volume) * 100}% * 0.85 + 4px)`, borderRadius: 'var(--radius-full)' }} />\n </div>\n </div>\n {(isVolumeHovered || isVolumeScrubbing) && (\n <div\n className=\"strata-tooltip absolute bottom-full mb-2 px-1.5 py-0.5 rounded text-[10px] font-bold font-mono shadow-lg pointer-events-none whitespace-nowrap z-50 transform -translate-x-1/2\"\n style={{ left: `calc(52px + ${(state.isMuted ? 0 : state.volume) * 80}px)` }}\n >\n {state.isMuted ? '0%' : `${Math.round(state.volume * 100)}%`}\n </div>\n )}\n </div>\n\n <div className=\"text-xs font-medium text-zinc-400 font-mono select-none hidden sm:block tabular-nums\">{formatTime(isScrubbing ? scrubbingTime : state.currentTime)} <span className=\"text-zinc-600\">/</span> {formatTime(state.duration)}</div>\n </div>\n <div className=\"flex items-center gap-1\">\n <div className=\"relative\">\n <button onClick={(e) => { e.stopPropagation(); setSubtitleMenuOpen(!subtitleMenuOpen); setSettingsOpen(false); }} className={`strata-control-btn transition-colors focus:outline-none ${btnClass} ${subtitleMenuOpen ? 'text-[var(--accent)] bg-white/10' : 'text-zinc-300 hover:text-white hover:bg-white/10'}`} style={{ borderRadius: 'var(--radius)' }}><SubtitleIcon className={iconClass} /></button>\n {subtitleTransition.isMounted && (<SubtitleMenu tracks={state.subtitleTracks} current={state.currentSubtitle} onSelect={(idx: number) => player.setSubtitle(idx)} onUpload={(file: File) => player.addTextTrack(file, file.name)} onClose={() => setSubtitleMenuOpen(false)} settings={state.subtitleSettings} onSettingsChange={(s: Partial<SubtitleSettings>) => player.updateSubtitleSettings(s)} onReset={() => player.resetSubtitleSettings()} offset={state.subtitleOffset} maxHeight={menuMaxHeight} animationClass={subtitleTransition.isVisible ? 'opacity-100 translate-y-0 scale-100' : 'opacity-0 translate-y-2 scale-95'} />)}\n </div>\n <button onClick={() => player.togglePip()} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 transition-colors hidden sm:block focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}><PipIcon className={iconClass} /></button>\n <button onClick={() => player.download()} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 transition-colors hidden sm:block focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}><DownloadIcon className={iconClass} /></button>\n <div className=\"relative\">\n <button onClick={(e) => { e.stopPropagation(); setSettingsOpen(!settingsOpen); setSubtitleMenuOpen(false); setActiveMenu('main'); }} className={`strata-control-btn transition-all duration-300 focus:outline-none ${btnClass} ${settingsOpen ? 'rotate-90 text-[var(--accent)] bg-white/10' : 'text-zinc-300 hover:text-white hover:bg-white/10'}`} style={{ borderRadius: 'var(--radius)' }}><SettingsIcon className={iconClass} /></button>\n {settingsTransition.isMounted && (<Menu onClose={() => setSettingsOpen(false)} align=\"right\" maxHeight={menuMaxHeight} className={settingsTransition.isVisible ? 'opacity-100 translate-y-0 scale-100' : 'opacity-0 translate-y-2 scale-95'}><div className=\"w-full\">\n\n {activeMenu === 'main' && (\n <div className=\"animate-in slide-in-from-left-4 fade-in duration-200\">\n <div className=\"px-3 py-2 mb-1 border-b border-white/5 font-bold text-zinc-400 uppercase text-[11px] tracking-wider flex justify-between items-center bg-white/5 sticky top-0 z-10 backdrop-blur-md\" style={{ borderRadius: 'var(--radius)' }}><span>Settings</span></div>\n {state.sources.length > 1 && <MenuItem label=\"Source\" value={state.sources[state.currentSourceIndex]?.name || `Source ${state.currentSourceIndex + 1}`} onClick={() => setActiveMenu('sources')} hasSubmenu />}\n <MenuItem label=\"Speed\" value={`${state.playbackRate}x`} onClick={() => setActiveMenu('speed')} hasSubmenu />\n <MenuItem label=\"Quality\" value={state.currentQuality === -1 ? 'Auto' : `${state.qualityLevels[state.currentQuality]?.height}p`} onClick={() => setActiveMenu('quality')} hasSubmenu />\n <MenuItem label=\"Audio\" value={state.audioTracks[state.currentAudioTrack]?.label || 'Default'} onClick={() => setActiveMenu('audio')} hasSubmenu />\n <MenuItem label=\"Audio Boost\" value={state.audioGain > 1 ? `${state.audioGain}x` : 'Off'} onClick={() => setActiveMenu('boost')} hasSubmenu />\n <MenuDivider />\n <MenuItem label=\"Watch Party\" icon={<UsersIcon className=\"w-4 h-4\" />} onClick={() => setActiveMenu('party')} hasSubmenu />\n <MenuItem label=\"Cast to Device\" icon={<CastIcon className=\"w-4 h-4\" />} onClick={() => { player.requestCast(); setSettingsOpen(false); }} />\n <MenuDivider />\n <MenuItem label=\"Appearance\" icon={<PaletteIcon className=\"w-4 h-4\" />} onClick={() => setActiveMenu('appearance')} hasSubmenu />\n </div>\n )}\n\n {['speed', 'quality', 'audio', 'boost', 'party', 'appearance', 'sources'].includes(activeMenu) && (\n <div className=\"animate-in slide-in-from-right-4 fade-in duration-200\">\n {activeMenu === 'sources' && (<><MenuHeader label=\"Select Source\" onBack={() => setActiveMenu('main')} />{state.sources.map((src, i) => (<MenuItem key={i} label={src.name || `Source ${i + 1}`} value={src.type} active={state.currentSourceIndex === i} onClick={() => player.switchSource(i)} />))}</>)}\n {activeMenu === 'speed' && (<><MenuHeader label=\"Speed\" onBack={() => setActiveMenu('main')} />{[0.5, 1, 1.5, 2].map(rate => (<MenuItem key={rate} label={`${rate}x`} active={state.playbackRate === rate} onClick={() => player.video.playbackRate = rate} />))}</>)}\n {activeMenu === 'quality' && (<><MenuHeader label=\"Quality\" onBack={() => setActiveMenu('main')} /><MenuItem label=\"Auto\" active={state.currentQuality === -1} onClick={() => player.setQuality(-1)} />{state.qualityLevels.map((lvl) => (<MenuItem key={lvl.index} label={`${lvl.height}p`} value={`${Math.round(lvl.bitrate / 1000)}k`} active={state.currentQuality === lvl.index} onClick={() => player.setQuality(lvl.index)} />))}</>)}\n {activeMenu === 'audio' && (<><MenuHeader label=\"Audio Track\" onBack={() => setActiveMenu('main')} />{state.audioTracks.length === 0 && <div className=\"px-4 py-3 text-zinc-500 text-xs text-center\">No tracks available</div>}{state.audioTracks.map((track) => (<MenuItem key={track.index} label={track.label} value={track.language} active={state.currentAudioTrack === track.index} onClick={() => player.setAudioTrack(track.index)} />))}</>)}\n {activeMenu === 'boost' && (<><MenuHeader label=\"Audio Boost\" onBack={() => setActiveMenu('main')} />{[1, 1.5, 2, 3].map(gain => (<MenuItem key={gain} label={gain === 1 ? 'Off' : `${gain}x`} active={state.audioGain === gain} onClick={() => player.setAudioGain(gain)} />))}</>)}\n {activeMenu === 'party' && (<><MenuHeader label=\"Watch Party\" onBack={() => setActiveMenu('main')} /><div className=\"p-4 space-y-3\"><p className=\"text-xs text-zinc-400 leading-relaxed\">Create a synchronized room on WatchParty.me to watch together.</p><a href={`https://www.watchparty.me/create?video=${encodeURIComponent(state.sources[state.currentSourceIndex]?.url || src || '')}`} target=\"_blank\" rel=\"noopener noreferrer\" className=\"flex items-center justify-center w-full py-2.5 bg-[var(--accent)] hover:opacity-90 text-white font-medium transition-opacity text-xs\" style={{ borderRadius: 'var(--radius)' }}>Create Room</a></div></>)}\n {activeMenu === 'appearance' && (\n <>\n <MenuHeader label=\"Appearance\" onBack={() => setActiveMenu('main')} />\n <div className=\"pb-1\">\n <SettingsGroup title=\"Theme\">\n <div className=\"grid grid-cols-2 gap-2 px-3\">\n {THEMES.map(theme => (\n <button\n key={theme.value}\n onClick={() => player.setAppearance({ theme: theme.value, themeColor: theme.color })}\n className={`py-2 text-xs font-bold uppercase tracking-wide transition-colors border-[length:var(--border-width)] border-white/10 ${state.theme === theme.value ? 'bg-[var(--accent)] text-white' : 'bg-white/5 text-zinc-400 hover:text-white'}`}\n style={{ borderRadius: 'var(--radius)' }}\n >\n {theme.label}\n </button>\n ))}\n </div>\n </SettingsGroup>\n\n <SettingsGroup title=\"Icon Size\">\n <div className=\"grid grid-cols-3 gap-1 px-3\">\n {(['small', 'medium', 'large'] as const).map(s => (\n <button\n key={s}\n onClick={() => player.setAppearance({ iconSize: s })}\n className={`py-1.5 text-xs font-medium transition-colors ${state.iconSize === s ? 'bg-white text-black' : 'bg-white/5 text-zinc-400 hover:text-zinc-200'}`}\n style={{ borderRadius: 'var(--radius)' }}\n >\n {s.charAt(0).toUpperCase() + s.slice(1)}\n </button>\n ))}\n </div>\n </SettingsGroup>\n\n <SettingsGroup title=\"Theme Color\">\n <div className=\"grid grid-cols-6 gap-2 px-3\">\n {THEME_COLORS.map(c => (\n <button\n key={c.value}\n title={c.label}\n onClick={() => player.setAppearance({ themeColor: c.value })}\n className={`w-6 h-6 transition-transform hover:scale-110 ${state.themeColor === c.value ? 'ring-2 ring-white scale-110' : 'ring-1 ring-white/10'}`}\n style={{ backgroundColor: c.value, borderRadius: 'var(--radius-full)' }}\n >\n {state.themeColor === c.value && <CheckIcon className=\"w-3 h-3 text-white mx-auto stroke-[3]\" />}\n </button>\n ))}\n </div>\n <div className=\"px-3 pt-4\">\n <div className=\"flex items-center gap-3 bg-white/5 p-2 hover:bg-white/10 transition-colors group\" style={{ borderRadius: 'var(--radius)' }}>\n <div className=\"relative w-6 h-6 overflow-hidden ring-1 ring-white/20\" style={{ borderRadius: 'var(--radius-full)' }}>\n <input\n type=\"color\"\n value={state.themeColor}\n onChange={(e) => player.setAppearance({ themeColor: e.target.value })}\n className=\"absolute inset-[-4px] w-[150%] h-[150%] cursor-pointer p-0 border-0\"\n />\n </div>\n <span className=\"text-xs text-zinc-400 font-medium group-hover:text-zinc-200\">Custom Color</span>\n <span className=\"text-[10px] font-mono text-zinc-500 ml-auto uppercase\">{state.themeColor}</span>\n </div>\n </div>\n </SettingsGroup>\n </div>\n </>\n )}\n </div>\n )}\n\n </div></Menu>)}\n </div>\n <button onClick={() => player.toggleFullscreen()} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 rounded-lg transition-transform hover:scale-110 focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}>{state.isFullscreen ? <MinimizeIcon className={iconClass} /> : <MaximizeIcon className={iconClass} />}</button>\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n );\n};\n","\r\nimport React from 'react';\r\nimport { createRoot } from 'react-dom/client';\r\nimport { StrataPlayer } from './ui/StrataPlayer';\r\nimport { StrataCore, PlayerState, PlayerSource, StrataConfig, TextTrackConfig } from './core/StrataCore';\r\nimport { HlsPlugin } from './plugins/HlsPlugin';\r\n\r\n// Export React Component\r\nexport { StrataPlayer };\r\n\r\n// Export Core & Plugins for advanced usage\r\nexport { StrataCore, HlsPlugin };\r\nexport type { PlayerState, PlayerSource, StrataConfig, TextTrackConfig };\r\n\r\n// Export Vanilla JS / Framework Agnostic Mounting Helper\r\nexport interface StrataPlayerInstance {\r\n unmount: () => void;\r\n update: (props: any) => void;\r\n}\r\n\r\nexport const mountStrataPlayer = (container: HTMLElement, props: any): StrataPlayerInstance => {\r\n const root = createRoot(container);\r\n\r\n // Initial Render\r\n root.render(React.createElement(StrataPlayer, props));\r\n\r\n return {\r\n unmount: () => {\r\n root.unmount();\r\n },\r\n update: (newProps: any) => {\r\n // Merge props or replace depending on needs, here we merge with original + new\r\n root.render(React.createElement(StrataPlayer, { ...props, ...newProps }));\r\n }\r\n };\r\n};\r\n"],"names":["EventBus","__publicField","event","callback","_a","subscribers","cb","data","NanoStore","initialState","partial","prevState","update","listener","AudioEngine","video","e","value","DEFAULT_SUBTITLE_SETTINGS","STORAGE_KEY","DEFAULT_STATE","getResolvedState","config","saved","raw","mergedSubtitleSettings","StrataCore","videoElement","state","settings","s","message","isFatal","customMessage","error","delay","time","onCanPlay","finalMsg","buffered","tracks","t","track","index","url","retries","i","res","r","container","plugin","sources","wasPlaying","source","isRetry","srcObj","type","oldTracks","file","label","reader","content","blob","newTrackIndex","src","lang","isDefault","seconds","vol","safeVol","gain","err","w","initializeCastApi","isAvailable","castSession","mediaInfo","request","cues","c","newSettings","offset","currentOffset","delta","cue","notifId","response","contentLength","total","loaded","chunks","done","percent","a","n","id","newNotification","current","prev","p","HlsPlugin","core","Hls","levels","lvl","idx","msg","formatTime","h","m","fetchVttWithRetry","parseVTT","notify","lines","start","end","baseUrl","parseTime","parts","line","times","urlPart","hash","x","y","coords","useTransition","isActive","duration","isMounted","setIsMounted","useState","isVisible","setIsVisible","useEffect","timer","PlayIcon","Play","PauseIcon","Pause","VolumeHighIcon","Volume2","VolumeLowIcon","Volume1","VolumeMuteIcon","VolumeX","MaximizeIcon","Maximize","MinimizeIcon","Minimize","SettingsIcon","Settings","CheckIcon","Check","PipIcon","PictureInPicture","SubtitleIcon","Subtitles","DownloadIcon","Download","UploadIcon","Upload","ArrowLeftIcon","ArrowLeft","LoaderIcon","Loader2","CastIcon","Cast","UsersIcon","Users","ClockIcon","Clock","MinusIcon","Minus","PlusIcon","Plus","CustomizeIcon","SlidersHorizontal","TypeIcon","Type","PaletteIcon","Palette","EyeIcon","Eye","MoveVerticalIcon","MoveVertical","ResetIcon","RefreshCcw","BoldIcon","Bold","CaseUpperIcon","CaseUpper","BlurIcon","Droplet","Replay10Icon","className","RotateCcw","Forward10Icon","RotateCw","NotificationContainer","notifications","jsxs","jsx","SubtitleOverlay","getTextShadow","text","Menu","children","onClose","align","maxHeight","ref","useRef","positionClasses","styleObj","MenuItem","active","onClick","hasSubmenu","icon","MenuHeader","onBack","rightAction","MenuDivider","Toggle","checked","onChange","Slider","min","max","step","formatValue","Select","options","opt","SettingsGroup","title","SubtitleMenu","onSelect","onUpload","onSettingsChange","onReset","animationClass","view","setView","fileInputRef","val","Fragment","player","v","THEME_COLORS","THEMES","StrataPlayer","props","poster","autoPlay","thumbnails","textTracks","plugins","containerRef","setPlayer","hasPlayed","setHasPlayed","playerHeight","setPlayerHeight","useMemo","useSyncExternalStore","useCallback","showControls","setShowControls","settingsOpen","setSettingsOpen","subtitleMenuOpen","setSubtitleMenuOpen","activeMenu","setActiveMenu","settingsTransition","subtitleTransition","isScrubbing","setIsScrubbing","scrubbingTime","setScrubbingTime","isVolumeScrubbing","setIsVolumeScrubbing","isVolumeHovered","setIsVolumeHovered","thumbnailCues","setThumbnailCues","hoverTime","setHoverTime","hoverPos","setHoverPos","currentThumbnail","setCurrentThumbnail","seekAnimation","setSeekAnimation","skipTrigger","setSkipTrigger","clickTimeoutRef","controlsTimeoutRef","progressBarRef","volumeBarRef","observer","entries","entry","updates","setCues","handleKeyDown","handleMouseMove","calculateTimeFromEvent","rect","clientX","handleSeekStart","handleMove","moveEvent","handleUp","upEvent","calculateVolumeFromEvent","handleVolumeStart","handleProgressMove","triggerSkip","direction","handleContainerClick","width","now","VolIcon","menuMaxHeight","getIconClass","getButtonClass","iconClass","btnClass","center","range","_b","_c","rate","_d","theme","mountStrataPlayer","root","createRoot","React","newProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"strataplayer.es.js","sources":["../core/EventBus.ts","../core/NanoStore.ts","../core/AudioEngine.ts","../core/StrataCore.ts","../plugins/HlsPlugin.ts","../utils/playerUtils.ts","../ui/hooks/useTransition.tsx","../ui/Icons.tsx","../ui/components/NotificationContainer.tsx","../ui/components/SubtitleOverlay.tsx","../ui/components/Menu.tsx","../ui/components/SettingsPrimitives.tsx","../ui/components/SubtitleMenu.tsx","../ui/StrataPlayer.tsx","../lib.ts"],"sourcesContent":["\nexport type EventCallback<T = any> = (data: T) => void;\n\nexport class EventBus {\n private events: Map<string, EventCallback[]>;\n\n constructor() {\n this.events = new Map();\n }\n\n on<T>(event: string, callback: EventCallback<T>): () => void {\n if (!this.events.has(event)) {\n this.events.set(event, []);\n }\n this.events.get(event)?.push(callback);\n\n // Return unsubscriber\n return () => this.off(event, callback);\n }\n\n off<T>(event: string, callback: EventCallback<T>): void {\n const subscribers = this.events.get(event);\n if (subscribers) {\n this.events.set(\n event,\n subscribers.filter((cb) => cb !== callback)\n );\n }\n }\n\n emit<T>(event: string, data?: T): void {\n const subscribers = this.events.get(event);\n if (subscribers) {\n subscribers.forEach((cb) => cb(data));\n }\n }\n\n destroy() {\n this.events.clear();\n }\n}\n","\nexport type Listener<T> = (state: T, prevState: T) => void;\n\nexport class NanoStore<T> {\n private state: T;\n private listeners: Set<Listener<T>>;\n\n constructor(initialState: T) {\n this.state = initialState;\n this.listeners = new Set();\n }\n\n get(): T {\n return this.state;\n }\n\n setState(partial: Partial<T> | ((prev: T) => Partial<T>)) {\n const prevState = this.state;\n const update = typeof partial === 'function' ? (partial as any)(prevState) : partial;\n this.state = { ...prevState, ...update };\n \n this.listeners.forEach((listener) => listener(this.state, prevState));\n }\n\n subscribe(listener: Listener<T>): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n destroy() {\n this.listeners.clear();\n }\n}\n","\nexport class AudioEngine {\n private context: AudioContext | null = null;\n private source: MediaElementAudioSourceNode | null = null;\n private gainNode: GainNode | null = null;\n private video: HTMLVideoElement;\n private isInitialized = false;\n\n constructor(video: HTMLVideoElement) {\n this.video = video;\n }\n\n /**\n * Initialize the AudioContext. Must be called after user interaction.\n */\n init() {\n if (this.isInitialized) return;\n \n const AudioContextClass = window.AudioContext || (window as any).webkitAudioContext;\n if (!AudioContextClass) return;\n\n this.context = new AudioContext();\n this.gainNode = this.context.createGain();\n \n // Connect video -> gain -> destination\n try {\n this.source = this.context.createMediaElementSource(this.video);\n this.source.connect(this.gainNode);\n this.gainNode.connect(this.context.destination);\n this.isInitialized = true;\n } catch (e) {\n console.warn(\"StrataPlayer: Failed to initialize AudioEngine\", e);\n }\n }\n\n setGain(value: number) {\n // Lazy init on first boost attempt\n if (!this.isInitialized) this.init();\n \n if (this.gainNode && this.context) {\n this.gainNode.gain.value = value;\n \n // Web Audio context might be suspended by browser policy\n if (this.context.state === 'suspended') {\n this.context.resume();\n }\n }\n }\n\n destroy() {\n if (this.context) {\n this.context.close();\n }\n this.isInitialized = false;\n }\n}\n","\nimport { EventBus } from './EventBus';\nimport { NanoStore } from './NanoStore';\nimport { AudioEngine } from './AudioEngine';\n\nexport interface Notification {\n id: string;\n message: string;\n type: 'info' | 'success' | 'warning' | 'error' | 'loading';\n duration?: number; // ms, if null then persistent\n progress?: number; // 0-100\n}\n\nexport interface SubtitleSettings {\n useNative: boolean; // \"Native video subtitle\"\n fixCapitalization: boolean;\n backgroundOpacity: number; // 0-100\n backgroundBlur: boolean;\n backgroundBlurAmount: number; // px\n textSize: number; // % (100 = 1em)\n textStyle: 'none' | 'outline' | 'raised' | 'depressed' | 'shadow';\n isBold: boolean;\n textColor: string;\n verticalOffset: number; // px from bottom\n}\n\nexport const DEFAULT_SUBTITLE_SETTINGS: SubtitleSettings = {\n useNative: false,\n fixCapitalization: false,\n backgroundOpacity: 50,\n backgroundBlur: false,\n backgroundBlurAmount: 4,\n textSize: 100,\n textStyle: 'shadow',\n isBold: false,\n textColor: '#ffffff',\n verticalOffset: 40,\n};\n\nexport type PlayerTheme = 'default' | 'pixel' | 'game' | 'hacker';\n\nexport interface PlayerSource {\n url: string;\n type?: 'hls' | 'mp4' | 'webm' | 'dash' | string;\n name?: string;\n}\n\nexport interface PlayerState {\n isPlaying: boolean;\n isBuffering: boolean;\n currentTime: number;\n duration: number;\n buffered: { start: number; end: number }[];\n volume: number;\n isMuted: boolean;\n audioGain: number;\n playbackRate: number;\n qualityLevels: { height: number; bitrate: number; index: number }[];\n currentQuality: number;\n audioTracks: { label: string; language: string; index: number }[];\n currentAudioTrack: number;\n error: string | null;\n isFullscreen: boolean;\n isPip: boolean;\n subtitleTracks: { label: string; language: string; index: number }[];\n currentSubtitle: number;\n subtitleOffset: number; // in seconds\n subtitleSettings: SubtitleSettings;\n activeCues: string[]; // For custom rendering\n viewMode: 'normal' | 'theater' | 'pip';\n notifications: Notification[];\n // Appearance\n iconSize: 'small' | 'medium' | 'large';\n themeColor: string;\n theme: PlayerTheme;\n // Sources\n sources: PlayerSource[];\n currentSourceIndex: number;\n}\n\nexport interface StrataConfig {\n // Playback\n volume?: number;\n muted?: boolean;\n playbackRate?: number;\n audioGain?: number;\n\n // Appearance\n theme?: PlayerTheme;\n themeColor?: string;\n iconSize?: 'small' | 'medium' | 'large';\n\n // Subtitles\n subtitleSettings?: Partial<SubtitleSettings>;\n\n // System\n disablePersistence?: boolean;\n}\n\nconst STORAGE_KEY = 'strata-settings-v3';\n\nexport const DEFAULT_STATE: PlayerState = {\n isPlaying: false,\n isBuffering: false,\n currentTime: 0,\n duration: 0,\n buffered: [],\n volume: 1,\n isMuted: false,\n audioGain: 1,\n playbackRate: 1,\n qualityLevels: [],\n currentQuality: -1,\n audioTracks: [],\n currentAudioTrack: -1,\n error: null,\n isFullscreen: false,\n isPip: false,\n subtitleTracks: [],\n currentSubtitle: -1,\n subtitleOffset: 0,\n subtitleSettings: DEFAULT_SUBTITLE_SETTINGS,\n activeCues: [],\n viewMode: 'normal',\n notifications: [],\n iconSize: 'medium',\n themeColor: '#6366f1',\n theme: 'default',\n sources: [],\n currentSourceIndex: -1,\n};\n\n// Helper to merge Defaults -> LocalStorage -> Config\nexport const getResolvedState = (config: StrataConfig = {}): PlayerState => {\n let saved: any = {};\n if (!config.disablePersistence && typeof window !== 'undefined') {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) saved = JSON.parse(raw);\n } catch (e) { /* ignore */ }\n }\n\n const mergedSubtitleSettings = {\n ...DEFAULT_SUBTITLE_SETTINGS,\n ...(saved.subtitleSettings || {}),\n ...(config.subtitleSettings || {})\n };\n\n return {\n ...DEFAULT_STATE,\n ...saved, // Load saved first\n // Override with config if present (not undefined)\n volume: config.volume ?? saved.volume ?? DEFAULT_STATE.volume,\n isMuted: config.muted ?? saved.isMuted ?? DEFAULT_STATE.isMuted,\n playbackRate: config.playbackRate ?? saved.playbackRate ?? DEFAULT_STATE.playbackRate,\n audioGain: config.audioGain ?? saved.audioGain ?? DEFAULT_STATE.audioGain,\n theme: config.theme ?? saved.theme ?? DEFAULT_STATE.theme,\n themeColor: config.themeColor ?? saved.themeColor ?? DEFAULT_STATE.themeColor,\n iconSize: config.iconSize ?? saved.iconSize ?? DEFAULT_STATE.iconSize,\n subtitleSettings: mergedSubtitleSettings\n };\n};\n\nexport interface IPlugin {\n name: string;\n init(core: StrataCore): void;\n destroy?(): void;\n}\n\nexport interface TextTrackConfig {\n kind: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';\n label: string;\n src: string;\n srcLang: string;\n default?: boolean;\n}\n\nexport class StrataCore {\n public video: HTMLVideoElement;\n public container: HTMLElement | null = null;\n public events: EventBus;\n public store: NanoStore<PlayerState>;\n private plugins: Map<string, IPlugin> = new Map();\n private audioEngine: AudioEngine;\n private config: StrataConfig;\n\n // Retry Logic\n private retryCount = 0;\n private maxRetries = 5;\n private retryTimer: any = null;\n private currentSource: PlayerSource | null = null;\n private currentSrc: string = '';\n private currentTracks: TextTrackConfig[] = [];\n\n // Cast\n private castInitialized = false;\n\n private boundCueChange: () => void;\n private boundFullscreenChange: () => void;\n\n constructor(config: StrataConfig = {}, videoElement?: HTMLVideoElement) {\n this.config = config;\n this.video = videoElement || document.createElement('video');\n this.video.crossOrigin = \"anonymous\";\n this.events = new EventBus();\n\n // Initialize Store with resolved state\n const initialState = getResolvedState(config);\n this.store = new NanoStore(initialState);\n\n this.audioEngine = new AudioEngine(this.video);\n this.boundCueChange = this.handleCueChange.bind(this);\n\n // Bind fullscreen listener once\n this.boundFullscreenChange = () => {\n this.store.setState({ isFullscreen: !!document.fullscreenElement });\n };\n\n // Apply initial state to video element\n this.video.volume = initialState.volume;\n this.video.muted = initialState.isMuted;\n this.video.playbackRate = initialState.playbackRate;\n if (initialState.audioGain > 1) {\n this.audioEngine.setGain(initialState.audioGain);\n }\n\n this.initVideoListeners();\n this.initCast();\n\n // Persistence Subscriber\n if (!config.disablePersistence) {\n this.store.subscribe((state) => {\n const settings = {\n volume: state.volume,\n isMuted: state.isMuted,\n playbackRate: state.playbackRate,\n subtitleSettings: state.subtitleSettings,\n iconSize: state.iconSize,\n themeColor: state.themeColor,\n theme: state.theme\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\n });\n }\n }\n\n private initVideoListeners() {\n const s = (partial: Partial<PlayerState>) => this.store.setState(partial);\n\n this.video.addEventListener('play', () => s({ isPlaying: true }));\n this.video.addEventListener('pause', () => s({ isPlaying: false }));\n this.video.addEventListener('ended', () => s({ isPlaying: false }));\n this.video.addEventListener('waiting', () => s({ isBuffering: true }));\n this.video.addEventListener('playing', () => s({ isBuffering: false }));\n this.video.addEventListener('loadeddata', () => {\n s({ isBuffering: false });\n // Success load resets retry count\n this.retryCount = 0;\n this.removeNotification('retry');\n // Clear error if we recovered\n if (this.store.get().error) {\n s({ error: null });\n }\n });\n this.video.addEventListener('canplay', () => s({ isBuffering: false }));\n\n this.video.addEventListener('timeupdate', () => {\n if (!this.video.seeking) {\n s({ currentTime: this.video.currentTime });\n }\n });\n\n this.video.addEventListener('seeked', () => s({ currentTime: this.video.currentTime }));\n this.video.addEventListener('durationchange', () => s({ duration: this.video.duration }));\n this.video.addEventListener('volumechange', () => s({ volume: this.video.volume, isMuted: this.video.muted }));\n this.video.addEventListener('ratechange', () => s({ playbackRate: this.video.playbackRate }));\n this.video.addEventListener('error', () => this.handleError());\n this.video.addEventListener('progress', this.updateBuffer.bind(this));\n this.video.addEventListener('enterpictureinpicture', () => s({ isPip: true }));\n this.video.addEventListener('leavepictureinpicture', () => s({ isPip: false }));\n\n // Global fullscreen listener to catch Esc key or browser button\n document.addEventListener('fullscreenchange', this.boundFullscreenChange);\n\n this.video.textTracks.addEventListener('addtrack', this.updateSubtitles.bind(this));\n this.video.textTracks.addEventListener('removetrack', this.updateSubtitles.bind(this));\n }\n\n public triggerError(message: string, isFatal: boolean = false) {\n if (isFatal) {\n this.handleError(message);\n } else {\n this.notify({ type: 'warning', message: `Warning: ${message}`, duration: 5000 });\n }\n }\n\n private handleError(customMessage?: string) {\n const error = this.video.error;\n const message = customMessage || error?.message || (error ? `Code ${error.code}` : 'Unknown Error');\n\n this.removeNotification('retry');\n\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n const delay = Math.pow(2, this.retryCount - 1) * 1500;\n\n this.notify({\n id: 'retry',\n type: 'loading',\n message: `Error: ${message}. Retrying (${this.retryCount}/${this.maxRetries})...`,\n });\n\n console.warn(`[StrataPlayer] Error: ${message}. Retrying in ${delay}ms...`);\n\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.retryTimer = setTimeout(() => {\n if (this.currentSource) {\n this.load(this.currentSource, this.currentTracks, true); // True = isRetry\n\n const time = this.store.get().currentTime;\n if (time > 0) {\n const onCanPlay = () => {\n this.video.currentTime = time;\n this.video.removeEventListener('canplay', onCanPlay);\n };\n this.video.addEventListener('canplay', onCanPlay);\n }\n }\n }, delay);\n } else {\n // Final failure\n this.removeNotification('retry');\n const finalMsg = `Failed to play after ${this.maxRetries} attempts: ${message}`;\n this.store.setState({ error: finalMsg });\n }\n }\n\n private updateBuffer() {\n const buffered: { start: number; end: number }[] = [];\n for (let i = 0; i < this.video.buffered.length; i++) {\n buffered.push({\n start: this.video.buffered.start(i),\n end: this.video.buffered.end(i)\n });\n }\n this.store.setState({ buffered });\n }\n\n private updateSubtitles() {\n setTimeout(() => {\n const tracks = Array.from(this.video.textTracks)\n .filter(t => t.kind === 'subtitles' || t.kind === 'captions')\n .map((track, index) => ({\n label: track.label || track.language || `Track ${index + 1}`,\n language: track.language,\n index: index\n }));\n this.store.setState({ subtitleTracks: tracks });\n\n // Restore persisted selection if applicable and tracks exist\n const state = this.store.get();\n if (state.currentSubtitle !== -1 && tracks.length > 0 && state.currentSubtitle < tracks.length) {\n this.setSubtitle(state.currentSubtitle);\n }\n }, 50);\n }\n\n // --- Utility ---\n\n async fetchWithRetry(url: string, retries = 3): Promise<Response> {\n for (let i = 0; i < retries; i++) {\n try {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res;\n } catch (e) {\n if (i === retries - 1) throw e;\n await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i)));\n }\n }\n throw new Error('Fetch failed');\n }\n\n // --- Core Methods ---\n\n attach(container: HTMLElement) {\n this.container = container;\n if (!this.container.contains(this.video)) {\n this.video.style.width = '100%';\n this.video.style.height = '100%';\n this.video.style.objectFit = 'contain';\n this.video.style.backgroundColor = 'black';\n this.container.appendChild(this.video);\n }\n }\n\n use(plugin: IPlugin) {\n if (this.plugins.has(plugin.name)) return;\n plugin.init(this);\n this.plugins.set(plugin.name, plugin);\n }\n\n setSources(sources: PlayerSource[], tracks: TextTrackConfig[] = []) {\n this.store.setState({ sources });\n this.currentTracks = tracks;\n if (sources.length > 0) {\n this.load(sources[0], tracks);\n }\n }\n\n switchSource(index: number) {\n const sources = this.store.get().sources;\n if (index >= 0 && index < sources.length) {\n const time = this.video.currentTime;\n const wasPlaying = !this.video.paused;\n\n this.load(sources[index], this.currentTracks);\n\n const onCanPlay = () => {\n this.video.currentTime = time;\n if (wasPlaying) this.video.play();\n this.video.removeEventListener('canplay', onCanPlay);\n };\n this.video.addEventListener('canplay', onCanPlay);\n }\n }\n\n load(source: PlayerSource | string, tracks: TextTrackConfig[] = [], isRetry = false) {\n if (this.retryTimer) clearTimeout(this.retryTimer);\n\n // Normalize string input to PlayerSource\n const srcObj: PlayerSource = typeof source === 'string' ? { url: source, type: 'auto' } : source;\n\n if (!isRetry) {\n this.retryCount = 0;\n this.store.setState({ error: null });\n this.removeNotification('retry');\n }\n\n this.currentSrc = srcObj.url;\n this.currentSource = srcObj;\n this.currentTracks = tracks;\n\n // Update index state if part of playlist\n const allSources = this.store.get().sources;\n const index = allSources.findIndex(s => s.url === srcObj.url);\n this.store.setState({\n isBuffering: true,\n qualityLevels: [],\n currentQuality: -1, // Reset quality to Auto on source switch\n audioTracks: [],\n currentAudioTrack: -1, // Reset audio track\n // subtitleTracks and currentSubtitle are purposely preserved\n currentSourceIndex: index\n });\n\n // Determine type if auto\n let type = srcObj.type || 'auto';\n if (type === 'auto') {\n if (srcObj.url.includes('.m3u8')) type = 'hls';\n else if (srcObj.url.includes('.mpd')) type = 'dash';\n else type = 'mp4';\n }\n\n // Emit load event with source details so plugins can decide to act\n this.events.emit('load', { url: srcObj.url, type });\n\n const oldTracks = this.video.getElementsByTagName('track');\n while (oldTracks.length > 0) {\n oldTracks[0].remove();\n }\n\n if (tracks.length > 0) {\n tracks.forEach(t => {\n this.fetchWithRetry(t.src).then(() => {\n this.addTextTrackInternal(t.src, t.label, t.srcLang, t.default);\n }).catch(e => {\n this.notify({ type: 'warning', message: `Failed to load subtitle: ${t.label}`, duration: 4000 });\n });\n });\n }\n\n // If it's standard MP4/WebM, set src directly. Plugins handle HLS/Dash.\n if (type === 'mp4' || type === 'webm' || type === 'ogg') {\n this.video.src = srcObj.url;\n }\n }\n\n public addTextTrack(file: File, label: string) {\n const reader = new FileReader();\n reader.onload = (e) => {\n if (!e.target?.result) return;\n let content = e.target.result as string;\n if (file.name.toLowerCase().endsWith('.srt') || !content.trim().startsWith('WEBVTT')) {\n content = content.replace(/(\\d{2}:\\d{2}:\\d{2}),(\\d{3})/g, '$1.$2');\n if (!content.trim().startsWith('WEBVTT')) {\n content = 'WEBVTT\\n\\n' + content;\n }\n }\n const blob = new Blob([content], { type: 'text/vtt' });\n const url = URL.createObjectURL(blob);\n this.addTextTrackInternal(url, label, 'user', true);\n\n setTimeout(() => {\n const tracks = this.store.get().subtitleTracks;\n const newTrackIndex = tracks.findIndex(t => t.label === label);\n if (newTrackIndex !== -1) {\n this.setSubtitle(newTrackIndex);\n this.notify({ type: 'success', message: 'Subtitle uploaded', duration: 3000 });\n }\n }, 200);\n };\n reader.onerror = () => {\n this.notify({ type: 'error', message: 'Failed to read file', duration: 3000 });\n };\n reader.readAsText(file);\n }\n\n private addTextTrackInternal(src: string, label: string, lang: string = '', isDefault: boolean = false) {\n const track = document.createElement('track');\n track.kind = 'subtitles';\n track.label = label;\n track.src = src;\n track.srclang = lang;\n if (isDefault) track.default = true;\n this.video.appendChild(track);\n this.updateSubtitles();\n }\n\n play() { return this.video.play(); }\n pause() { return this.video.pause(); }\n togglePlay() { this.video.paused ? this.play() : this.pause(); }\n\n seek(time: number) {\n if (isNaN(time)) return;\n const t = Math.max(0, Math.min(time, this.video.duration));\n this.store.setState({ currentTime: t });\n this.video.currentTime = t;\n }\n\n skip(seconds: number) {\n this.seek(this.video.currentTime + seconds);\n }\n\n setVolume(vol: number) {\n const safeVol = Math.max(0, Math.min(vol, 1));\n this.video.volume = safeVol;\n if (safeVol > 0 && this.video.muted) this.video.muted = false;\n if (safeVol === 0) this.video.muted = true;\n }\n\n toggleMute() {\n this.video.muted = !this.video.muted;\n }\n\n setAudioGain(gain: number) {\n this.store.setState({ audioGain: gain });\n this.audioEngine.setGain(gain);\n }\n\n setQuality(index: number) {\n this.store.setState({ currentQuality: index });\n this.events.emit('quality-request', index);\n }\n\n setAudioTrack(index: number) {\n this.store.setState({ currentAudioTrack: index });\n this.events.emit('audio-track-request', index);\n }\n\n toggleFullscreen() {\n if (!this.container) return;\n if (!document.fullscreenElement) {\n this.container.requestFullscreen().catch(err => console.error(err));\n // State update happens in the event listener\n } else {\n document.exitFullscreen();\n // State update happens in the event listener\n }\n }\n\n togglePip() {\n if (document.pictureInPictureElement) {\n document.exitPictureInPicture();\n } else if (this.video !== document.pictureInPictureElement && (this.video as any).requestPictureInPicture) {\n (this.video as any).requestPictureInPicture();\n }\n }\n\n private initCast() {\n const w = window as any;\n const initializeCastApi = () => {\n if (this.castInitialized) return;\n try {\n if (w.cast && w.cast.framework && w.chrome && w.chrome.cast) {\n const CastContext = w.cast.framework.CastContext;\n CastContext.getInstance().setOptions({\n receiverApplicationId: w.chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,\n autoJoinPolicy: w.chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED\n });\n this.castInitialized = true;\n }\n } catch (e) {\n console.warn('Cast Init Error or already initialized', e);\n }\n };\n\n if (w.cast && w.cast.framework) {\n initializeCastApi();\n } else {\n w.__onGCastApiAvailable = (isAvailable: boolean) => {\n if (isAvailable) initializeCastApi();\n };\n }\n }\n\n requestCast() {\n const w = window as any;\n if (w.cast && w.cast.framework) {\n try {\n if (!this.castInitialized) this.initCast();\n w.cast.framework.CastContext.getInstance().requestSession()\n .then(() => {\n this.loadMediaToCast();\n })\n .catch((e: any) => {\n if (e !== 'cancel') this.notify({ type: 'error', message: 'Cast failed: ' + e, duration: 3000 });\n });\n } catch (e) {\n this.notify({ type: 'warning', message: 'Cast not available yet', duration: 3000 });\n }\n } else {\n this.notify({ type: 'warning', message: 'Cast API not loaded', duration: 3000 });\n }\n }\n\n private loadMediaToCast() {\n const w = window as any;\n try {\n const castSession = w.cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n const mediaInfo = new w.chrome.cast.media.MediaInfo(this.currentSrc, this.currentSrc.includes('.m3u8') ? 'application/x-mpegurl' : 'video/mp4');\n const request = new w.chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(() => {\n this.notify({ type: 'success', message: 'Casting...', duration: 3000 });\n }).catch((e: any) => console.error('Cast load error', e));\n } catch (e) {\n console.error(\"Failed to load media into Cast session\", e);\n }\n }\n\n private handleCueChange() {\n const state = this.store.get();\n if (state.currentSubtitle === -1) {\n this.store.setState({ activeCues: [] });\n return;\n }\n\n // Find active track\n const tracks = Array.from(this.video.textTracks).filter(t => t.kind === 'subtitles' || t.kind === 'captions');\n const track = tracks[state.currentSubtitle];\n\n if (track && track.activeCues) {\n const cues = Array.from(track.activeCues).map((c: any) => c.text);\n this.store.setState({ activeCues: cues });\n } else {\n this.store.setState({ activeCues: [] });\n }\n }\n\n setSubtitle(index: number) {\n // Remove listeners from old tracks\n Array.from(this.video.textTracks).forEach(t => {\n t.removeEventListener('cuechange', this.boundCueChange);\n t.mode = 'hidden'; // Reset to hidden before applying new state\n });\n\n this.store.setState({ currentSubtitle: index, subtitleOffset: 0, activeCues: [] });\n\n if (index !== -1) {\n // Find active track in the filtered list logic\n const tracks = Array.from(this.video.textTracks).filter(t => t.kind === 'subtitles' || t.kind === 'captions');\n const track = tracks[index];\n if (track) {\n const settings = this.store.get().subtitleSettings;\n // If using Native, mode = showing. If custom, mode = hidden (but not disabled, so cues update)\n track.mode = settings.useNative ? 'showing' : 'hidden';\n track.addEventListener('cuechange', this.boundCueChange);\n\n // Initial trigger\n this.handleCueChange();\n }\n }\n }\n\n updateSubtitleSettings(settings: Partial<SubtitleSettings>) {\n const current = this.store.get().subtitleSettings;\n const newSettings = { ...current, ...settings };\n this.store.setState({ subtitleSettings: newSettings });\n\n // If switching native/custom, re-apply track mode\n if (settings.useNative !== undefined) {\n this.setSubtitle(this.store.get().currentSubtitle);\n }\n }\n\n resetSubtitleSettings() {\n this.store.setState({ subtitleSettings: DEFAULT_SUBTITLE_SETTINGS });\n this.setSubtitle(this.store.get().currentSubtitle); // Re-apply modes\n }\n\n setSubtitleOffset(offset: number) {\n const currentOffset = this.store.get().subtitleOffset;\n const delta = offset - currentOffset;\n\n if (Math.abs(delta) < 0.001) return;\n\n Array.from(this.video.textTracks).forEach((track) => {\n // If custom (hidden) or native (showing), we adjust cues\n if ((track.mode === 'showing' || track.mode === 'hidden') && track.cues) {\n Array.from(track.cues).forEach((cue: any) => {\n cue.startTime += delta;\n cue.endTime += delta;\n });\n }\n });\n\n this.store.setState({ subtitleOffset: offset });\n this.notify({ type: 'info', message: `Subtitle Offset: ${offset > 0 ? '+' : ''}${offset.toFixed(1)}s`, duration: 1500 });\n }\n\n async download() { /* same as before */\n if (!this.video.src) return;\n const src = this.video.src;\n if (src.includes('blob:') || src.includes('.m3u8')) {\n this.notify({ type: 'warning', message: 'Stream download not supported in browser.', duration: 4000 });\n return;\n }\n const notifId = this.notify({ type: 'loading', message: 'Preparing download...', progress: 0 });\n try {\n const response = await this.fetchWithRetry(src);\n if (!response.body) throw new Error('No body');\n const reader = response.body.getReader();\n const contentLength = response.headers.get('Content-Length');\n const total = contentLength ? parseInt(contentLength, 10) : 0;\n let loaded = 0;\n const chunks = [];\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n loaded += value.length;\n if (total) {\n const percent = Math.round((loaded / total) * 100);\n this.notify({ id: notifId, type: 'loading', message: `Downloading... ${percent}%`, progress: percent });\n }\n }\n const blob = new Blob(chunks);\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.style.display = 'none';\n a.href = url;\n a.download = src.split('/').pop()?.split('?')[0] || 'video.mp4';\n document.body.appendChild(a);\n a.click();\n window.URL.revokeObjectURL(url);\n document.body.removeChild(a);\n this.notify({ id: notifId, type: 'success', message: 'Saved!', duration: 3000 });\n } catch (e: any) {\n this.notify({ id: notifId, type: 'error', message: 'Download failed.', duration: 4000 });\n window.open(src, '_blank');\n }\n }\n\n notify(n: Omit<Notification, 'id'> & { id?: string }) {\n const id = n.id || Math.random().toString(36).substr(2, 9);\n const newNotification: Notification = { ...n, id };\n this.store.setState({ notifications: [newNotification] });\n if (n.duration) setTimeout(() => this.removeNotification(id), n.duration);\n return id;\n }\n\n removeNotification(id: string) {\n const current = this.store.get().notifications;\n this.store.setState({ notifications: current.filter(n => n.id !== id) });\n }\n\n setAppearance(settings: { iconSize?: 'small' | 'medium' | 'large', themeColor?: string, theme?: PlayerTheme }) {\n this.store.setState(prev => ({\n ...prev,\n ...settings\n }));\n }\n\n destroy() {\n if (this.retryTimer) clearTimeout(this.retryTimer);\n document.removeEventListener('fullscreenchange', this.boundFullscreenChange);\n this.video.pause();\n this.video.src = '';\n const oldTracks = this.video.getElementsByTagName('track');\n while (oldTracks.length > 0) oldTracks[0].remove();\n this.events.destroy();\n this.store.destroy();\n this.plugins.forEach(p => p.destroy && p.destroy());\n this.plugins.clear();\n this.video.remove();\n this.audioEngine.destroy();\n }\n}\n","\nimport { StrataCore, IPlugin } from '../core/StrataCore';\nimport Hls from 'hls.js';\n\nexport class HlsPlugin implements IPlugin {\n name = 'HlsPlugin';\n private hls: Hls | null = null;\n private core: StrataCore | null = null;\n\n init(core: StrataCore) {\n this.core = core;\n\n // Listen for load requests\n this.core.events.on('load', (data: { url: string, type: string }) => {\n // Only proceed if type matches HLS\n if (data.type === 'hls' || data.url.includes('.m3u8')) {\n if (Hls.isSupported()) {\n this.loadHls(data.url);\n } else if (this.core!.video.canPlayType('application/vnd.apple.mpegurl')) {\n // Native HLS fallback (Safari) - Core sets src, we do nothing\n // Core already handles setting video.src if standard\n this.core!.video.src = data.url;\n }\n } else {\n // If we had an active HLS instance but switched to MP4, destroy it\n if (this.hls) {\n this.hls.destroy();\n this.hls = null;\n }\n }\n });\n\n // Listen for quality changes from UI\n this.core.events.on('quality-request', (index: number) => {\n if (this.hls) {\n this.hls.currentLevel = index;\n }\n });\n\n // Listen for audio track changes from UI\n this.core.events.on('audio-track-request', (index: number) => {\n if (this.hls) {\n this.hls.audioTrack = index;\n }\n });\n }\n\n private loadHls(url: string) {\n if (this.hls) {\n this.hls.destroy();\n }\n\n this.hls = new Hls({\n autoStartLoad: true,\n startLevel: -1, // Auto\n capLevelToPlayerSize: true, // Performance opt\n });\n\n this.hls.loadSource(url);\n this.hls.attachMedia(this.core!.video);\n\n this.hls.on(Hls.Events.MANIFEST_PARSED, (event: any, data: any) => {\n const levels = data.levels.map((lvl: any, idx: number) => ({\n height: lvl.height,\n bitrate: lvl.bitrate,\n index: idx\n }));\n this.core!.store.setState({ qualityLevels: levels });\n });\n\n // Handle Audio Tracks\n this.hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, (event: any, data: any) => {\n const tracks = data.audioTracks.map((track: any, idx: number) => ({\n label: track.name || track.lang || `Audio ${idx + 1}`,\n language: track.lang || '',\n index: idx\n }));\n this.core!.store.setState({\n audioTracks: tracks,\n currentAudioTrack: this.hls!.audioTrack\n });\n });\n\n this.hls.on(Hls.Events.LEVEL_SWITCHED, (event: any, data: any) => {\n // Update current quality only if in auto mode to show what's playing\n // If manual, state is already set\n });\n\n this.hls.on(Hls.Events.ERROR, (event: any, data: any) => {\n if (data.fatal) {\n // Pass fatal errors to Core to handle the retry loop visibly\n const msg = data.details || 'Unknown HLS Error';\n this.core!.triggerError(msg, true);\n\n // Cleanup if needed, but core.load() will eventually destroy and re-init this plugin\n }\n });\n }\n\n destroy() {\n if (this.hls) {\n this.hls.destroy();\n this.hls = null;\n }\n }\n}\n","\r\nexport const formatTime = (seconds: number) => {\r\n if (isNaN(seconds)) return '00:00';\r\n const h = Math.floor(seconds / 3600);\r\n const m = Math.floor((seconds % 3600) / 60);\r\n const s = Math.floor(seconds % 60);\r\n if (h > 0) return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\r\n return `${m}:${s.toString().padStart(2, '0')}`;\r\n};\r\n\r\nconst fetchVttWithRetry = async (url: string, retries = 3): Promise<string> => {\r\n for (let i = 0; i < retries; i++) {\r\n try {\r\n const res = await fetch(url);\r\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\r\n return await res.text();\r\n } catch (e) {\r\n if (i === retries - 1) throw e;\r\n await new Promise(r => setTimeout(r, 1000));\r\n }\r\n }\r\n throw new Error('Failed');\r\n}\r\n\r\nexport interface ThumbnailCue {\r\n start: number;\r\n end: number;\r\n url: string;\r\n x: number;\r\n y: number;\r\n w: number;\r\n h: number;\r\n}\r\n\r\nexport const parseVTT = async (url: string, notify: (msg: any) => void): Promise<ThumbnailCue[]> => {\r\n try {\r\n const text = await fetchVttWithRetry(url);\r\n const lines = text.split('\\n');\r\n const cues: ThumbnailCue[] = [];\r\n let start: number | null = null;\r\n let end: number | null = null;\r\n const baseUrl = url.substring(0, url.lastIndexOf('/') + 1);\r\n const parseTime = (t: string) => {\r\n const parts = t.split(':');\r\n let s = 0;\r\n if (parts.length === 3) {\r\n s += parseFloat(parts[0]) * 3600;\r\n s += parseFloat(parts[1]) * 60;\r\n s += parseFloat(parts[2]);\r\n } else {\r\n s += parseFloat(parts[0]) * 60;\r\n s += parseFloat(parts[1]);\r\n }\r\n return s;\r\n };\r\n for (let line of lines) {\r\n line = line.trim();\r\n if (line.includes('-->')) {\r\n const times = line.split('-->');\r\n start = parseTime(times[0].trim());\r\n end = parseTime(times[1].trim());\r\n } else if (start !== null && end !== null && line.length > 0) {\r\n let [urlPart, hash] = line.split('#');\r\n if (!urlPart.match(/^https?:\\/\\//) && !urlPart.startsWith('data:')) urlPart = baseUrl + urlPart;\r\n let x = 0, y = 0, w = 0, h = 0;\r\n if (hash && hash.startsWith('xywh=')) {\r\n const coords = hash.replace('xywh=', '').split(',');\r\n if (coords.length === 4) {\r\n x = parseInt(coords[0]); y = parseInt(coords[1]); w = parseInt(coords[2]); h = parseInt(coords[3]);\r\n }\r\n }\r\n if (w > 0 && h > 0) cues.push({ start, end, url: urlPart, x, y, w, h });\r\n start = null; end = null;\r\n }\r\n }\r\n return cues;\r\n } catch (e: any) {\r\n notify({ type: 'warning', message: `Failed to load thumbnails`, duration: 4000 });\r\n return [];\r\n }\r\n};\r\n","\r\nimport { useState, useEffect } from 'react';\r\n\r\n// Hook to manage CSS transitions for mounting/unmounting\r\nexport const useTransition = (isActive: boolean, duration: number = 200) => {\r\n const [isMounted, setIsMounted] = useState(isActive);\r\n const [isVisible, setIsVisible] = useState(false);\r\n\r\n useEffect(() => {\r\n if (isActive) {\r\n setIsMounted(true);\r\n // Double RAF ensures the browser paints the initial state before applying the active state\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n setIsVisible(true);\r\n });\r\n });\r\n } else {\r\n setIsVisible(false);\r\n const timer = setTimeout(() => {\r\n setIsMounted(false);\r\n }, duration);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [isActive, duration]);\r\n\r\n return { isMounted, isVisible };\r\n};\r\n","\n// Re-export icons from lucide-react for consistency\nimport {\n Play,\n Pause,\n Volume2,\n Volume1,\n VolumeX,\n Maximize,\n Minimize,\n Settings,\n Check,\n PictureInPicture,\n Subtitles,\n Download,\n ArrowLeft,\n Upload,\n Loader2,\n RotateCcw,\n RotateCw,\n Cast,\n Users,\n Clock,\n Minus,\n Plus,\n SlidersHorizontal,\n Type,\n Palette,\n Eye,\n MoveVertical,\n RefreshCcw,\n Bold,\n CaseUpper,\n Droplet\n} from 'lucide-react';\n\nexport const PlayIcon = Play;\nexport const PauseIcon = Pause;\nexport const VolumeHighIcon = Volume2;\nexport const VolumeLowIcon = Volume1;\nexport const VolumeMuteIcon = VolumeX;\nexport const MaximizeIcon = Maximize;\nexport const MinimizeIcon = Minimize;\nexport const SettingsIcon = Settings;\nexport const CheckIcon = Check;\nexport const PipIcon = PictureInPicture;\nexport const SubtitleIcon = Subtitles;\nexport const DownloadIcon = Download;\nexport const UploadIcon = Upload;\nexport const ArrowLeftIcon = ArrowLeft;\nexport const LoaderIcon = Loader2;\nexport const CastIcon = Cast;\nexport const UsersIcon = Users;\nexport const ClockIcon = Clock;\nexport const MinusIcon = Minus;\nexport const PlusIcon = Plus;\nexport const CustomizeIcon = SlidersHorizontal;\nexport const TypeIcon = Type;\nexport const PaletteIcon = Palette;\nexport const EyeIcon = Eye;\nexport const MoveVerticalIcon = MoveVertical;\nexport const ResetIcon = RefreshCcw;\nexport const BoldIcon = Bold;\nexport const CaseUpperIcon = CaseUpper;\nexport const BlurIcon = Droplet;\n\n// Custom 10s Skip Icons using Lucide base\nexport const Replay10Icon = ({ className }: { className?: string }) => (\n <div className={`relative flex items-center justify-center ${className}`}>\n <RotateCcw className=\"w-full h-full\" strokeWidth={2} />\n <span className=\"absolute inset-0 flex items-center justify-center text-[32%] font-bold select-none mt-[1px]\">10</span>\n </div>\n);\n\nexport const Forward10Icon = ({ className }: { className?: string }) => (\n <div className={`relative flex items-center justify-center ${className}`}>\n <RotateCw className=\"w-full h-full\" strokeWidth={2} />\n <span className=\"absolute inset-0 flex items-center justify-center text-[32%] font-bold select-none mt-[1px]\">10</span>\n </div>\n);\n\nexport const StrataLogo = ({ className }: { className?: string }) => {\n // Use Vite's BASE_URL env variable to construct the path relative to the deployment root.\n // In dev, this is \"/\", so result is \"/logo.png\".\n // In prod, this is \"/StrataPlayer/\", so result is \"/StrataPlayer/logo.png\".\n const base = import.meta.env?.BASE_URL || '/';\n const src = `${base}logo.png`;\n\n return <img src={src} alt=\"StrataPlayer Logo\" className={className} />;\n};\n","\r\nimport React from 'react';\r\nimport { PlayerState } from '../../core/StrataCore';\r\nimport { LoaderIcon } from '../Icons';\r\n\r\nexport const NotificationContainer = ({ notifications }: { notifications: PlayerState['notifications'] }) => {\r\n return (\r\n <div className=\"absolute top-4 left-4 z-50 flex flex-col gap-2 pointer-events-none font-sans\">\r\n {notifications.map((n) => (\r\n <div\r\n key={n.id}\r\n className={`\r\n bg-zinc-950/80 backdrop-blur-md border border-white/10 text-white px-4 py-3 rounded-lg shadow-xl text-sm font-medium flex items-center gap-3 animate-in slide-in-from-left-2 fade-in duration-300 max-w-sm\r\n ${n.type === 'error' ? 'border-red-500/50 text-red-100' : ''}\r\n ${n.type === 'warning' ? 'border-amber-500/50 text-amber-100' : ''}\r\n `}\r\n >\r\n {n.type === 'loading' && <LoaderIcon className=\"w-4 h-4 animate-spin text-[var(--accent)]\" />}\r\n <div className=\"flex flex-col gap-1 w-full\">\r\n <span>{n.message}</span>\r\n {typeof n.progress === 'number' && (\r\n <div className=\"h-1 w-full bg-white/10 rounded-full overflow-hidden\">\r\n <div className=\"h-full bg-[var(--accent)] transition-all duration-300\" style={{ width: `${n.progress}%` }}></div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n","\r\nimport React from 'react';\r\nimport { SubtitleSettings } from '../../core/StrataCore';\r\n\r\nexport const SubtitleOverlay = ({ cues, settings }: { cues: string[], settings: SubtitleSettings }) => {\r\n if (settings.useNative || cues.length === 0) return null;\r\n\r\n const getTextShadow = () => {\r\n switch (settings.textStyle) {\r\n case 'outline': return '0px 0px 4px black, 0px 0px 4px black'; // Simplified stroke\r\n case 'raised': return '0 -1px 1px black, 0 -2px 2px black'; // Pseudo 3D raised\r\n case 'depressed': return '0 1px 1px white, 0 2px 2px black'; // Pseudo 3D depressed\r\n case 'shadow': return '2px 2px 2px rgba(0,0,0,0.8)';\r\n default: return 'none';\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n className=\"absolute inset-x-0 flex flex-col items-center justify-end text-center z-10 pointer-events-none transition-all duration-200\"\r\n style={{\r\n bottom: `${settings.verticalOffset}px`\r\n }}\r\n >\r\n {cues.map((text, i) => (\r\n <div\r\n key={i}\r\n className=\"mb-1 inline-block max-w-[80%]\"\r\n style={{\r\n fontSize: `${settings.textSize}%`,\r\n color: settings.textColor,\r\n fontWeight: settings.isBold ? 'bold' : 'normal',\r\n textTransform: settings.fixCapitalization ? 'capitalize' : 'none',\r\n textShadow: getTextShadow(),\r\n lineHeight: 1.4\r\n }}\r\n >\r\n <span\r\n className=\"px-2 py-0.5 rounded\"\r\n style={{\r\n backgroundColor: `rgba(0, 0, 0, ${settings.backgroundOpacity / 100})`,\r\n backdropFilter: settings.backgroundBlur ? `blur(${settings.backgroundBlurAmount}px)` : 'none',\r\n }}\r\n dangerouslySetInnerHTML={{ __html: text }} // VTT supports some HTML-like tags\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n","\r\nimport React, { useRef } from 'react';\r\nimport { ArrowLeftIcon, CheckIcon } from '../Icons';\r\n\r\nexport const Menu = ({ children, onClose, align = 'right', maxHeight, className }: { children?: React.ReactNode; onClose: () => void; align?: 'right' | 'center'; maxHeight?: number; className?: string }) => {\r\n const ref = useRef<HTMLDivElement>(null);\r\n\r\n const positionClasses = align === 'center' ? 'left-1/2 -translate-x-1/2 origin-bottom' : 'right-0 origin-bottom-right';\r\n\r\n const styleObj = maxHeight ? { maxHeight: `${maxHeight}px` } : {};\r\n\r\n return (\r\n <div\r\n className={`absolute bottom-full mb-4 ${positionClasses} bg-[var(--bg-panel)] backdrop-blur-xl border-[length:var(--border-width)] border-white/10 shadow-2xl overflow-hidden w-[300px] max-w-[calc(100vw-32px)] text-sm z-50 ring-1 ring-white/5 font-[family-name:var(--font-main)] flex flex-col p-1.5 transition-all duration-300 ease-out ${className}`}\r\n style={{ ...styleObj, borderRadius: 'var(--radius-lg)' }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"overflow-y-auto hide-scrollbar flex-1\" style={{ borderRadius: 'var(--radius)' }}>\r\n <div ref={ref}>{children}</div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const MenuItem = ({ label, value, active, onClick, hasSubmenu, icon }: any) => (\r\n <button\r\n onClick={onClick}\r\n className=\"w-full flex items-center justify-between px-3 py-2.5 hover:bg-white/10 transition-colors text-left text-zinc-200 active:bg-white/5 focus:outline-none focus:bg-white/10 group overflow-hidden my-0.5\"\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <div className=\"flex items-center gap-3 overflow-hidden\">\r\n {icon && <span className=\"text-zinc-400 shrink-0 group-hover:text-zinc-300 transition-colors\">{icon}</span>}\r\n <span className={`font-medium truncate text-sm ${active ? 'text-[var(--accent)]' : ''}`} title={label}>{label}</span>\r\n </div>\r\n <div className=\"flex items-center gap-2 text-zinc-400 shrink-0\">\r\n {value && <span className=\"text-xs font-medium truncate max-w-[60px]\" title={value}>{value}</span>}\r\n {active && <CheckIcon className=\"w-4 h-4 text-[var(--accent)] shrink-0\" />}\r\n {hasSubmenu && <span className=\"text-xs group-hover:translate-x-0.5 transition-transform text-zinc-500 shrink-0\">›</span>}\r\n </div>\r\n </button>\r\n);\r\n\r\nexport const MenuHeader = ({ label, onBack, rightAction }: { label: string, onBack: () => void, rightAction?: React.ReactNode }) => (\r\n <div\r\n className=\"px-3 py-2 mb-1 border-b border-white/5 font-bold text-zinc-400 uppercase text-[11px] tracking-wider flex justify-between items-center bg-white/5 sticky top-0 z-10 backdrop-blur-md\"\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <button\r\n className=\"flex items-center gap-2 hover:text-white transition-colors focus:outline-none\"\r\n onClick={onBack}\r\n >\r\n <ArrowLeftIcon className=\"w-3 h-3\" />\r\n <span>{label}</span>\r\n </button>\r\n {rightAction}\r\n </div>\r\n);\r\n\r\nexport const MenuDivider = () => <div className=\"h-px bg-white/5 mx-2 my-1\"></div>;\r\n","\r\nimport React from 'react';\r\n\r\nexport const Toggle = ({ label, checked, onChange, icon }: any) => (\r\n <div\r\n className=\"flex items-center justify-between py-2.5 px-3 hover:bg-white/5 group transition-colors\"\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n {icon && <span className=\"text-zinc-500 group-hover:text-zinc-400 transition-colors\">{icon}</span>}\r\n <span className=\"text-sm text-zinc-300 font-medium group-hover:text-white transition-colors\">{label}</span>\r\n </div>\r\n <button\r\n onClick={() => onChange(!checked)}\r\n className={`w-11 h-6 shrink-0 transition-colors relative focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-zinc-900 ${checked ? 'bg-[var(--accent)]' : 'bg-zinc-700'}`}\r\n style={{\r\n '--tw-ring-color': 'var(--accent)',\r\n borderRadius: 'var(--radius-full)',\r\n borderWidth: 'var(--border-width)',\r\n borderColor: 'rgba(255,255,255,0.1)'\r\n } as React.CSSProperties}\r\n >\r\n <div\r\n className={`absolute top-1/2 -translate-y-1/2 left-0.5 bg-white w-4 h-4 transition-transform shadow-sm ${checked ? 'translate-x-5' : 'translate-x-0'}`}\r\n style={{ borderRadius: 'var(--radius-full)' }}\r\n />\r\n </button>\r\n </div>\r\n);\r\n\r\nexport const Slider = ({ label, value, min, max, step, onChange, formatValue, icon }: any) => (\r\n <div\r\n className=\"py-2.5 px-3 hover:bg-white/5 group transition-colors\"\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <div className=\"flex justify-between items-center mb-2\">\r\n <div className=\"flex items-center gap-3\">\r\n {icon && <span className=\"text-zinc-500 group-hover:text-zinc-400 transition-colors\">{icon}</span>}\r\n <span className=\"text-xs font-bold text-zinc-400 uppercase tracking-wider group-hover:text-zinc-300 transition-colors\">{label}</span>\r\n </div>\r\n <span\r\n className=\"text-[10px] font-mono font-medium text-zinc-300 bg-white/10 px-1.5 py-0.5 tabular-nums\"\r\n style={{ borderRadius: 'var(--radius-sm)' }}\r\n >{formatValue ? formatValue(value) : value}</span>\r\n </div>\r\n <div className=\"relative h-4 flex items-center px-1\">\r\n <input\r\n type=\"range\"\r\n min={min} max={max} step={step}\r\n value={value}\r\n onChange={(e) => onChange(parseFloat(e.target.value))}\r\n className=\"w-full h-1.5 appearance-none cursor-pointer focus:outline-none focus:ring-2 strata-range-input\"\r\n style={{\r\n borderRadius: 'var(--radius-full)',\r\n background: `linear-gradient(to right, var(--accent) 0%, var(--accent) ${(value - min) / (max - min) * 100}%, #3f3f46 ${(value - min) / (max - min) * 100}%, #3f3f46 100%)`,\r\n '--tw-ring-color': 'var(--accent)'\r\n } as React.CSSProperties}\r\n />\r\n <style>{`\r\n .strata-range-input::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n height: 14px;\r\n width: 14px;\r\n background: #ffffff;\r\n cursor: pointer;\r\n box-shadow: 0 1px 3px rgba(0,0,0,0.5);\r\n transition: transform 0.1s;\r\n border-radius: var(--radius-full);\r\n border: var(--border-width) solid rgba(0,0,0,0.1);\r\n }\r\n .strata-range-input::-webkit-slider-thumb:hover {\r\n transform: scale(1.1);\r\n }\r\n /* Pixel theme specific overrides are handled by global css */\r\n `}</style>\r\n </div>\r\n </div>\r\n);\r\n\r\nexport const Select = ({ label, value, options, onChange, icon }: any) => (\r\n <div\r\n className=\"py-2.5 px-3 hover:bg-white/5 group transition-colors\"\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n {icon && <span className=\"text-zinc-500 group-hover:text-zinc-400 transition-colors\">{icon}</span>}\r\n <span className=\"text-xs font-bold text-zinc-400 uppercase tracking-wider group-hover:text-zinc-300 transition-colors\">{label}</span>\r\n </div>\r\n <div className=\"relative\">\r\n <select\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n className=\"w-full bg-zinc-800 border-[length:var(--border-width)] border-white/10 px-3 py-2 text-sm text-zinc-200 focus:outline-none focus:ring-2 appearance-none hover:bg-zinc-700 transition-colors cursor-pointer\"\r\n style={{ '--tw-ring-color': 'var(--accent)', borderRadius: 'var(--radius)' } as React.CSSProperties}\r\n >\r\n {options.map((opt: any) => (\r\n <option key={opt.value} value={opt.value}>{opt.label}</option>\r\n ))}\r\n </select>\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-zinc-400\">\r\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 1L5 5L9 1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" /></svg>\r\n </div>\r\n </div>\r\n </div>\r\n);\r\n\r\nexport const SettingsGroup = ({ title, children }: any) => (\r\n <div className=\"py-2\">\r\n {title && <h4 className=\"px-3 text-[10px] font-bold text-[var(--accent)] uppercase tracking-wider mb-1 mt-2\">{title}</h4>}\r\n <div className=\"space-y-0.5\">\r\n {children}\r\n </div>\r\n </div>\r\n);\r\n","\r\nimport React, { useState, useRef } from 'react';\r\nimport { SubtitleSettings } from '../../core/StrataCore';\r\nimport { Menu, MenuItem, MenuHeader } from './Menu';\r\nimport { SettingsGroup, Toggle, Slider, Select } from './SettingsPrimitives';\r\nimport {\r\n UploadIcon, CustomizeIcon, ResetIcon, ClockIcon,\r\n MinusIcon, PlusIcon, MoveVerticalIcon, TypeIcon,\r\n PaletteIcon, BoldIcon, CaseUpperIcon, EyeIcon, BlurIcon\r\n} from '../Icons';\r\n\r\nexport const SubtitleMenu = ({ tracks, current, onSelect, onUpload, onClose, settings, onSettingsChange, onReset, offset, maxHeight, animationClass }: any) => {\r\n const [view, setView] = useState<'main' | 'customize'>('main');\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n return (\r\n <Menu onClose={onClose} align=\"right\" maxHeight={maxHeight} className={animationClass}>\r\n {view === 'main' && (\r\n <div className=\"animate-in slide-in-from-left-4 fade-in duration-200\">\r\n <div className=\"px-3 py-2 mb-1 border-b border-white/5 font-bold text-zinc-400 uppercase text-[11px] tracking-wider flex justify-between items-center bg-white/5 rounded-lg\">\r\n <span>Subtitles</span>\r\n </div>\r\n <div>\r\n <MenuItem\r\n label=\"Upload Subtitle\"\r\n icon={<UploadIcon className=\"w-4 h-4\" />}\r\n onClick={() => fileInputRef.current?.click()}\r\n />\r\n <input type=\"file\" accept=\".vtt,.srt\" ref={fileInputRef} className=\"hidden\" onChange={(e) => { if (e.target.files?.[0]) onUpload(e.target.files[0]); }} />\r\n <MenuItem\r\n label=\"Customize\"\r\n icon={<CustomizeIcon className=\"w-4 h-4\" />}\r\n onClick={() => setView('customize')}\r\n hasSubmenu\r\n />\r\n <div className=\"h-px bg-white/5 mx-2 my-1\"></div>\r\n <MenuItem\r\n label=\"Off\"\r\n active={current === -1}\r\n onClick={() => { onSelect(-1); onClose(); }}\r\n />\r\n {tracks.map((track: any) => (\r\n <MenuItem\r\n key={track.index}\r\n label={track.label}\r\n value={track.language}\r\n active={current === track.index}\r\n onClick={() => { onSelect(track.index); onClose(); }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {view === 'customize' && (\r\n <div className=\"animate-in slide-in-from-right-4 fade-in duration-200\">\r\n <MenuHeader\r\n label=\"Customize\"\r\n onBack={() => setView('main')}\r\n rightAction={\r\n <button onClick={onReset} className=\"p-1.5 text-zinc-400 hover:text-white transition-colors rounded-md hover:bg-white/10\" title=\"Reset All\">\r\n <ResetIcon className=\"w-4 h-4\" />\r\n </button>\r\n }\r\n />\r\n\r\n <div className=\"pb-1\">\r\n <SettingsGroup>\r\n <Toggle\r\n label=\"Native Video Subtitle\"\r\n checked={settings.useNative}\r\n onChange={(val: boolean) => onSettingsChange({ useNative: val })}\r\n />\r\n </SettingsGroup>\r\n\r\n {!settings.useNative && (\r\n <>\r\n <SettingsGroup title=\"Sync & Position\">\r\n <div className=\"py-2.5 px-3 rounded-lg hover:bg-white/5 group transition-colors\">\r\n <div className=\"flex justify-between items-center mb-2\">\r\n <div className=\"flex items-center gap-3\">\r\n <ClockIcon className=\"w-4 h-4 text-zinc-500 group-hover:text-zinc-400 transition-colors\" />\r\n <span className=\"text-xs font-bold text-zinc-400 uppercase tracking-wider group-hover:text-zinc-300 transition-colors\">Sync Offset</span>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => { const player = (window as any)._strataPlayer; if (player) player.setSubtitleOffset(Math.round((offset - 0.1) * 10) / 10); }}\r\n className=\"w-8 h-8 flex items-center justify-center bg-zinc-800 rounded-lg hover:bg-zinc-700 text-zinc-300 transition-colors active:scale-95\"\r\n >\r\n <MinusIcon className=\"w-4 h-4\" />\r\n </button>\r\n <div className=\"flex-1 bg-zinc-900 border border-white/5 rounded-lg h-8 flex items-center justify-center text-xs font-mono font-medium text-[var(--accent)]\">\r\n {offset > 0 ? '+' : ''}{offset?.toFixed(1) || '0.0'}s\r\n </div>\r\n <button\r\n onClick={() => { const player = (window as any)._strataPlayer; if (player) player.setSubtitleOffset(Math.round((offset + 0.1) * 10) / 10); }}\r\n className=\"w-8 h-8 flex items-center justify-center bg-zinc-800 rounded-lg hover:bg-zinc-700 text-zinc-300 transition-colors active:scale-95\"\r\n >\r\n <PlusIcon className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <Slider\r\n label=\"Vertical Position\"\r\n icon={<MoveVerticalIcon className=\"w-4 h-4\" />}\r\n value={settings.verticalOffset}\r\n min={0} max={200} step={5}\r\n onChange={(val: number) => onSettingsChange({ verticalOffset: val })}\r\n formatValue={(v: number) => `${v}px`}\r\n />\r\n </SettingsGroup>\r\n\r\n <SettingsGroup title=\"Appearance\">\r\n <Slider\r\n label=\"Text Size\"\r\n icon={<TypeIcon className=\"w-4 h-4\" />}\r\n value={settings.textSize}\r\n min={50} max={200} step={10}\r\n onChange={(val: number) => onSettingsChange({ textSize: val })}\r\n formatValue={(v: number) => `${v}%`}\r\n />\r\n\r\n <div className=\"py-2.5 px-3 rounded-lg hover:bg-white/5 group transition-colors\">\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <PaletteIcon className=\"w-4 h-4 text-zinc-500 group-hover:text-zinc-400 transition-colors\" />\r\n <span className=\"text-xs font-bold text-zinc-400 uppercase tracking-wider group-hover:text-zinc-300 transition-colors\">Text Color</span>\r\n </div>\r\n <div className=\"flex items-center justify-between gap-2 p-1 bg-zinc-800/50 rounded-lg\">\r\n {['#ffffff', '#ffff00', '#00ffff', '#ff00ff', '#ff0000', '#00ff00'].map(c => (\r\n <button\r\n key={c}\r\n onClick={() => onSettingsChange({ textColor: c })}\r\n className={`w-6 h-6 rounded-full border border-white/10 transition-transform hover:scale-110 ${settings.textColor === c ? 'ring-2 scale-110' : ''}`}\r\n style={{ backgroundColor: c, '--tw-ring-color': 'var(--accent)' } as any}\r\n />\r\n ))}\r\n <div className=\"w-px h-6 bg-white/10 mx-1\"></div>\r\n <div className=\"relative w-6 h-6 rounded-full overflow-hidden ring-1 ring-white/20 cursor-pointer\">\r\n <input\r\n type=\"color\"\r\n value={settings.textColor}\r\n onChange={(e) => onSettingsChange({ textColor: e.target.value })}\r\n className=\"absolute inset-[-4px] w-[150%] h-[150%] cursor-pointer p-0 border-0\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Select\r\n label=\"Text Style\"\r\n value={settings.textStyle}\r\n options={[\r\n { label: 'None', value: 'none' },\r\n { label: 'Outline', value: 'outline' },\r\n { label: 'Raised', value: 'raised' },\r\n { label: 'Depressed', value: 'depressed' },\r\n { label: 'Drop Shadow', value: 'shadow' },\r\n ]}\r\n onChange={(val: string) => onSettingsChange({ textStyle: val })}\r\n />\r\n\r\n <div className=\"grid grid-cols-2 gap-2 mt-1 px-1\">\r\n <Toggle label=\"Bold\" icon={<BoldIcon className=\"w-4 h-4\" />} checked={settings.isBold} onChange={(v: boolean) => onSettingsChange({ isBold: v })} />\r\n <Toggle label=\"Fix Caps\" icon={<CaseUpperIcon className=\"w-4 h-4\" />} checked={settings.fixCapitalization} onChange={(v: boolean) => onSettingsChange({ fixCapitalization: v })} />\r\n </div>\r\n </SettingsGroup>\r\n\r\n <SettingsGroup title=\"Background\">\r\n <Slider\r\n label=\"Opacity\"\r\n icon={<EyeIcon className=\"w-4 h-4\" />}\r\n value={settings.backgroundOpacity}\r\n min={0} max={100} step={5}\r\n onChange={(val: number) => onSettingsChange({ backgroundOpacity: val })}\r\n formatValue={(v: number) => `${v}%`}\r\n />\r\n\r\n <Toggle label=\"Blur Background\" icon={<BlurIcon className=\"w-4 h-4\" />} checked={settings.backgroundBlur} onChange={(v: boolean) => onSettingsChange({ backgroundBlur: v })} />\r\n\r\n {settings.backgroundBlur && (\r\n <Slider\r\n label=\"Blur Intensity\"\r\n value={settings.backgroundBlurAmount}\r\n min={0} max={20} step={1}\r\n onChange={(val: number) => onSettingsChange({ backgroundBlurAmount: val })}\r\n formatValue={(v: number) => `${v}px`}\r\n />\r\n )}\r\n </SettingsGroup>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </Menu>\r\n );\r\n};\r\n","\nimport React, { useEffect, useRef, useState, useSyncExternalStore, useCallback, useMemo } from 'react';\nimport { StrataCore, PlayerState, TextTrackConfig, SubtitleSettings, PlayerTheme, StrataConfig, getResolvedState, DEFAULT_STATE, IPlugin, PlayerSource } from '../core/StrataCore';\nimport { HlsPlugin } from '../plugins/HlsPlugin';\nimport { formatTime, parseVTT, ThumbnailCue } from '../utils/playerUtils';\nimport { useTransition } from './hooks/useTransition';\nimport { NotificationContainer } from './components/NotificationContainer';\nimport { SubtitleOverlay } from './components/SubtitleOverlay';\nimport { Menu, MenuItem, MenuHeader, MenuDivider } from './components/Menu';\nimport { SubtitleMenu } from './components/SubtitleMenu';\nimport { SettingsGroup } from './components/SettingsPrimitives';\nimport {\n PlayIcon, PauseIcon, VolumeHighIcon, VolumeLowIcon, VolumeMuteIcon,\n MaximizeIcon, MinimizeIcon, SettingsIcon, PipIcon,\n SubtitleIcon, DownloadIcon, Replay10Icon, Forward10Icon,\n LoaderIcon, CastIcon, UsersIcon, PaletteIcon, CheckIcon,\n CustomizeIcon\n} from './Icons';\n\ndeclare module 'react' {\n namespace JSX {\n interface IntrinsicElements {\n 'google-cast-launcher': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n// --- Main Player Component ---\n\ninterface StrataPlayerProps extends StrataConfig {\n src?: string; // Optional if sources are provided\n sources?: PlayerSource[]; // Array of sources\n poster?: string;\n autoPlay?: boolean;\n thumbnails?: string; // URL to VTT thumbnails\n textTracks?: TextTrackConfig[];\n plugins?: IPlugin[]; // Allow injecting plugins from outside\n}\n\nconst THEME_COLORS = [\n { label: 'Strata', value: '#6366f1' },\n { label: 'Emerald', value: '#10b981' },\n { label: 'Rose', value: '#f43f5e' },\n { label: 'Amber', value: '#f59e0b' },\n { label: 'Sky', value: '#0ea5e9' },\n { label: 'Violet', value: '#8b5cf6' },\n];\n\nconst THEMES: { label: string, value: PlayerTheme, color: string }[] = [\n { label: 'Default', value: 'default', color: '#6366f1' },\n { label: 'Pixel', value: 'pixel', color: '#ef4444' },\n { label: 'Game', value: 'game', color: '#eab308' },\n { label: 'Hacker', value: 'hacker', color: '#22c55e' },\n];\n\nexport const StrataPlayer = (props: StrataPlayerProps) => {\n const { src, sources, poster, autoPlay, thumbnails, textTracks, plugins, ...config } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [player, setPlayer] = useState<StrataCore | null>(null);\n const [hasPlayed, setHasPlayed] = useState(false);\n const [playerHeight, setPlayerHeight] = useState(0);\n\n // Resolve initial state based on props + defaults + localStorage BEFORE mounting\n // This prevents layout shift or theme flash on first render\n const initialState = useMemo(() => getResolvedState(config), []);\n\n const state = useSyncExternalStore<PlayerState>(\n useCallback((cb) => player ? player.store.subscribe(cb) : () => { }, [player]),\n () => player ? player.store.get() : initialState,\n () => initialState\n );\n\n const [showControls, setShowControls] = useState(true);\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [subtitleMenuOpen, setSubtitleMenuOpen] = useState(false);\n const [activeMenu, setActiveMenu] = useState<'main' | 'quality' | 'speed' | 'audio' | 'boost' | 'party' | 'appearance' | 'sources'>('main');\n\n // Transition States\n const settingsTransition = useTransition(settingsOpen, 200);\n const subtitleTransition = useTransition(subtitleMenuOpen, 200);\n\n // Seek & Scrubbing State\n const [isScrubbing, setIsScrubbing] = useState(false);\n const [scrubbingTime, setScrubbingTime] = useState(0);\n const [isVolumeScrubbing, setIsVolumeScrubbing] = useState(false);\n const [isVolumeHovered, setIsVolumeHovered] = useState(false);\n const [thumbnailCues, setThumbnailCues] = useState<ThumbnailCue[]>([]);\n const [hoverTime, setHoverTime] = useState<number | null>(null);\n const [hoverPos, setHoverPos] = useState<number>(0);\n const [currentThumbnail, setCurrentThumbnail] = useState<ThumbnailCue | null>(null);\n const [seekAnimation, setSeekAnimation] = useState<{ type: 'forward' | 'rewind', id: number } | null>(null);\n const [skipTrigger, setSkipTrigger] = useState<'forward' | 'rewind' | null>(null);\n const clickTimeoutRef = useRef<any>(null);\n const controlsTimeoutRef = useRef<any>(null);\n const progressBarRef = useRef<HTMLDivElement>(null);\n const volumeBarRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const core = new StrataCore(config);\n (window as any)._strataPlayer = core; // Hack for menu access to offset\n\n // Register plugins\n if (plugins && plugins.length > 0) {\n plugins.forEach(p => core.use(p));\n } else {\n // Fallback default HLS plugin if none provided (for backward compat)\n core.use(new HlsPlugin());\n }\n\n core.attach(containerRef.current);\n setPlayer(core);\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setPlayerHeight(entry.contentRect.height);\n }\n });\n observer.observe(containerRef.current);\n\n return () => {\n observer.disconnect();\n core.destroy();\n setPlayer(null);\n (window as any)._strataPlayer = null;\n };\n }, []);\n\n // Reactive Prop Updates\n useEffect(() => {\n if (!player) return;\n // Update appearance if props change\n const updates: any = {};\n if (config.theme !== undefined && config.theme !== state.theme) updates.theme = config.theme;\n if (config.themeColor !== undefined && config.themeColor !== state.themeColor) updates.themeColor = config.themeColor;\n if (config.iconSize !== undefined && config.iconSize !== state.iconSize) updates.iconSize = config.iconSize;\n\n if (Object.keys(updates).length > 0) {\n player.setAppearance(updates);\n }\n\n // Update volume/mute if controlled props change\n if (config.volume !== undefined && Math.abs(config.volume - state.volume) > 0.01) player.setVolume(config.volume);\n if (config.muted !== undefined && config.muted !== state.isMuted) {\n if (config.muted) player.video.muted = true;\n else { player.video.muted = false; }\n // State update happens via listener\n }\n }, [player, config.theme, config.themeColor, config.iconSize, config.volume, config.muted]);\n\n useEffect(() => {\n if (!player) return;\n\n const tracks = textTracks || [];\n\n // Priority: Sources Array > Single Src\n if (sources && sources.length > 0) {\n setHasPlayed(false);\n player.setSources(sources, tracks);\n } else if (src) {\n setHasPlayed(false);\n player.setSources([{ url: src, type: 'auto' }], tracks);\n }\n\n }, [src, sources, textTracks, player]);\n\n useEffect(() => {\n // We handle poster manually to support cover\n // if (player && poster) player.video.poster = poster;\n }, [player, poster]);\n\n useEffect(() => {\n if (player && autoPlay) {\n player.video.muted = true;\n player.store.setState({ isMuted: true });\n player.play().catch(() => { });\n }\n }, [player, autoPlay]);\n\n useEffect(() => {\n if (state.isPlaying && !hasPlayed) setHasPlayed(true);\n }, [state.isPlaying, hasPlayed]);\n\n useEffect(() => {\n if (thumbnails && player) {\n parseVTT(thumbnails, player.notify.bind(player)).then(setCues => setThumbnailCues(setCues));\n } else setThumbnailCues([]);\n }, [thumbnails, player]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!player) return;\n if (document.activeElement?.tagName === 'INPUT') return;\n switch (e.key.toLowerCase()) {\n case ' ': case 'k': e.preventDefault(); player.togglePlay(); break;\n case 'arrowright': e.preventDefault(); player.skip(5); break;\n case 'arrowleft': e.preventDefault(); player.skip(-5); break;\n case 'arrowup': e.preventDefault(); player.setVolume(player.video.volume + 0.1); break;\n case 'arrowdown': e.preventDefault(); player.setVolume(player.video.volume - 0.1); break;\n case 'f': e.preventDefault(); player.toggleFullscreen(); break;\n case 'm': e.preventDefault(); player.toggleMute(); break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [player]);\n\n const handleMouseMove = () => {\n setShowControls(true);\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\n if (settingsOpen || subtitleMenuOpen) return;\n controlsTimeoutRef.current = setTimeout(() => {\n if (!state.isPlaying || settingsOpen || subtitleMenuOpen) return;\n setShowControls(false);\n }, 2500);\n };\n\n useEffect(() => {\n if (!settingsOpen && !subtitleMenuOpen && state.isPlaying) handleMouseMove();\n else if (settingsOpen || subtitleMenuOpen) { setShowControls(true); if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current); }\n }, [settingsOpen, subtitleMenuOpen, state.isPlaying]);\n\n const calculateTimeFromEvent = (e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent) => {\n if (!progressBarRef.current || !state.duration) return 0;\n const rect = progressBarRef.current.getBoundingClientRect();\n const clientX = 'touches' in e ? (e as TouchEvent).touches[0].clientX : (e as MouseEvent).clientX;\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return pct * state.duration;\n };\n\n const handleSeekStart = (e: React.MouseEvent | React.TouchEvent) => {\n setIsScrubbing(true);\n setScrubbingTime(calculateTimeFromEvent(e));\n const handleMove = (moveEvent: MouseEvent | TouchEvent) => setScrubbingTime(calculateTimeFromEvent(moveEvent));\n const handleUp = (upEvent: MouseEvent | TouchEvent) => {\n player?.seek(calculateTimeFromEvent(upEvent));\n setIsScrubbing(false);\n document.removeEventListener('mousemove', handleMove); document.removeEventListener('touchmove', handleMove);\n document.removeEventListener('mouseup', handleUp); document.removeEventListener('touchend', handleUp);\n };\n document.addEventListener('mousemove', handleMove); document.addEventListener('touchmove', handleMove);\n document.addEventListener('mouseup', handleUp); document.addEventListener('touchend', handleUp);\n };\n\n const calculateVolumeFromEvent = (e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent) => {\n if (!volumeBarRef.current) return 0;\n const rect = volumeBarRef.current.getBoundingClientRect();\n const clientX = 'touches' in e ? (e as TouchEvent).touches[0].clientX : (e as MouseEvent).clientX;\n return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n };\n\n const handleVolumeStart = (e: React.MouseEvent | React.TouchEvent) => {\n if (!player) return;\n setIsVolumeScrubbing(true);\n player.setVolume(calculateVolumeFromEvent(e));\n const handleMove = (moveEvent: MouseEvent | TouchEvent) => player.setVolume(calculateVolumeFromEvent(moveEvent));\n const handleUp = () => {\n setIsVolumeScrubbing(false);\n document.removeEventListener('mousemove', handleMove); document.removeEventListener('touchmove', handleMove);\n document.removeEventListener('mouseup', handleUp); document.removeEventListener('touchend', handleUp);\n };\n document.addEventListener('mousemove', handleMove); document.addEventListener('touchmove', handleMove);\n document.addEventListener('mouseup', handleUp); document.addEventListener('touchend', handleUp);\n };\n\n const handleProgressMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!state.duration) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const percent = (e.clientX - rect.left) / rect.width;\n const time = percent * state.duration;\n setHoverPos(percent * 100);\n setHoverTime(time);\n if (thumbnailCues.length > 0) setCurrentThumbnail(thumbnailCues.find(c => time >= c.start && time < c.end) || null);\n };\n\n const triggerSkip = (direction: 'forward' | 'rewind') => {\n if (!player) return;\n player.skip(direction === 'forward' ? 10 : -10);\n setSkipTrigger(direction);\n setTimeout(() => setSkipTrigger(null), 300);\n };\n\n const handleContainerClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (settingsOpen) setSettingsOpen(false);\n if (subtitleMenuOpen) setSubtitleMenuOpen(false);\n if (!player) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const width = rect.width;\n const now = Date.now();\n\n if (clickTimeoutRef.current) {\n clearTimeout(clickTimeoutRef.current);\n clickTimeoutRef.current = null;\n if (x < width * 0.35) { triggerSkip('rewind'); setSeekAnimation({ type: 'rewind', id: now }); }\n else if (x > width * 0.65) { triggerSkip('forward'); setSeekAnimation({ type: 'forward', id: now }); }\n else player.toggleFullscreen();\n } else {\n clickTimeoutRef.current = setTimeout(() => {\n player.togglePlay();\n clickTimeoutRef.current = null;\n }, 250);\n }\n };\n\n const VolIcon = state.isMuted || state.volume === 0 ? VolumeMuteIcon : state.volume < 0.5 ? VolumeLowIcon : VolumeHighIcon;\n\n // Calculate max height for menus based on player height\n // ~120px gives room for controls (bottom) and some margin (top)\n const menuMaxHeight = Math.max(100, playerHeight - 120);\n\n // Icon Size Logic\n const getIconClass = () => {\n switch (state.iconSize) {\n case 'small': return 'w-4 h-4';\n case 'large': return 'w-6 h-6';\n default: return 'w-5 h-5';\n }\n }\n const getButtonClass = () => {\n switch (state.iconSize) {\n case 'small': return 'p-1.5';\n case 'large': return 'p-2.5';\n default: return 'p-2';\n }\n }\n const iconClass = getIconClass();\n const btnClass = getButtonClass();\n\n const getCenterSizes = () => {\n switch (state.iconSize) {\n case 'small':\n return {\n playBtn: 'w-14 h-14',\n playIcon: 'w-6 h-6',\n skipBtn: 'w-10 h-10',\n skipIcon: 'w-5 h-5'\n };\n case 'large':\n return {\n playBtn: 'w-24 h-24',\n playIcon: 'w-12 h-12',\n skipBtn: 'w-16 h-16',\n skipIcon: 'w-8 h-8'\n };\n default: // medium\n return {\n playBtn: 'w-20 h-20',\n playIcon: 'w-9 h-9',\n skipBtn: 'w-12 h-12',\n skipIcon: 'w-6 h-6'\n };\n }\n }\n const center = getCenterSizes();\n\n return (\n <div\n ref={containerRef}\n className=\"group relative w-full h-full bg-black overflow-hidden select-none font-[family-name:var(--font-main)] outline-none touch-none rounded-[var(--radius)] text-zinc-100\"\n onMouseMove={handleMouseMove}\n onMouseLeave={() => { if (state.isPlaying && !settingsOpen && !subtitleMenuOpen) setShowControls(false); }}\n tabIndex={0}\n role=\"region\"\n aria-label=\"Video Player\"\n data-theme={state.theme}\n style={{ '--accent': state.themeColor } as React.CSSProperties}\n >\n <style>{`\n [data-theme=\"default\"] {\n --radius: 0.75rem;\n --radius-lg: 0.75rem;\n --radius-sm: 0.375rem;\n --radius-full: 9999px;\n --font-main: \"Inter\", sans-serif;\n --border-width: 0px;\n --bg-panel: rgba(9, 9, 11, 0.95);\n --tooltip-bg: #ffffff;\n --tooltip-text: #000000;\n --tooltip-border: 0px solid transparent;\n }\n [data-theme=\"pixel\"] {\n --radius: 0px;\n --radius-lg: 0px;\n --radius-sm: 0px;\n --radius-full: 0px;\n --font-main: \"Press Start 2P\", cursive;\n --border-width: 2px;\n --bg-panel: #000000;\n --tooltip-bg: #000000;\n --tooltip-text: #ffffff;\n --tooltip-border: 2px solid #ffffff;\n image-rendering: pixelated;\n }\n [data-theme=\"game\"] {\n --radius: 4px;\n --radius-lg: 6px;\n --radius-sm: 2px;\n --radius-full: 4px;\n --font-main: \"Cinzel\", serif;\n --border-width: 1px;\n --bg-panel: #0a0a0a;\n --tooltip-bg: #1a1a1a;\n --tooltip-text: #ffffff;\n --tooltip-border: 1px solid var(--accent);\n }\n [data-theme=\"hacker\"] {\n --radius: 0px;\n --radius-lg: 0px;\n --radius-sm: 0px;\n --radius-full: 0px;\n --font-main: \"JetBrains Mono\", monospace;\n --border-width: 1px;\n --bg-panel: #000000;\n --tooltip-bg: #000000;\n --tooltip-text: var(--accent);\n --tooltip-border: 1px solid var(--accent);\n text-shadow: 0 0 5px var(--accent);\n }\n \n /* Specific Theme Overrides */\n [data-theme=\"pixel\"] .strata-control-btn {\n border: 2px solid white;\n background: black;\n }\n [data-theme=\"pixel\"] .strata-control-btn:hover {\n background: white;\n color: black;\n }\n [data-theme=\"pixel\"] .strata-range-input::-webkit-slider-thumb {\n border-radius: 0 !important;\n height: 16px !important;\n width: 16px !important;\n box-shadow: none !important;\n }\n \n [data-theme=\"hacker\"] .strata-scanlines {\n background: linear-gradient(\n to bottom,\n rgba(255,255,255,0),\n rgba(255,255,255,0) 50%,\n rgba(0,0,0,0.2) 50%,\n rgba(0,0,0,0.2)\n );\n background-size: 100% 4px;\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 40;\n }\n\n .strata-tooltip {\n background-color: var(--tooltip-bg);\n color: var(--tooltip-text);\n border: var(--tooltip-border);\n border-radius: var(--radius-sm);\n font-family: var(--font-main);\n }\n `}</style>\n\n {state.theme === 'hacker' && <div className=\"strata-scanlines\" />}\n\n {!player && <div className=\"absolute inset-0 flex items-center justify-center bg-zinc-950 z-50\"><LoaderIcon className=\"w-10 h-10 text-[var(--accent)] animate-spin\" /></div>}\n {player && (\n <>\n <NotificationContainer notifications={state.notifications} />\n <SubtitleOverlay cues={state.activeCues} settings={state.subtitleSettings} />\n <div className=\"absolute inset-0 z-0\" onClick={handleContainerClick} aria-hidden=\"true\" />\n\n {/* Custom Poster Overlay */}\n {poster && !hasPlayed && (\n <div\n className=\"absolute inset-0 bg-cover bg-center z-[5] pointer-events-none\"\n style={{ backgroundImage: `url(${poster})` }}\n />\n )}\n\n {seekAnimation && (\n <div key={seekAnimation.id} className={`absolute top-0 bottom-0 flex items-center justify-center w-[35%] z-20 bg-white/5 backdrop-blur-[1px] animate-out fade-out duration-500 ${seekAnimation.type === 'rewind' ? 'left-0 rounded-r-[4rem]' : 'right-0 rounded-l-[4rem]'}`} onAnimationEnd={() => setSeekAnimation(null)}>\n <div className=\"flex flex-col items-center text-white drop-shadow-lg\">\n {seekAnimation.type === 'rewind' ? <Replay10Icon className=\"w-12 h-12 animate-pulse\" /> : <Forward10Icon className=\"w-12 h-12 animate-pulse\" />}\n <span className=\"font-bold text-sm mt-2 font-mono\">{seekAnimation.type === 'rewind' ? '-10s' : '+10s'}</span>\n </div>\n </div>\n )}\n {state.isBuffering && <div className=\"absolute inset-0 flex items-center justify-center z-20 pointer-events-none\"><LoaderIcon className=\"w-12 h-12 text-[var(--accent)] animate-spin drop-shadow-lg\" /></div>}\n {state.error && <div className=\"absolute inset-0 flex items-center justify-center z-30 bg-black/90 backdrop-blur-md animate-in fade-in\"><div className=\"flex flex-col items-center gap-4 text-red-500 p-8 max-w-md text-center\"><span className=\"text-5xl mb-2\">⚠️</span><h3 className=\"text-xl font-bold text-white\">Playback Error</h3><p className=\"text-zinc-400 text-sm\">{state.error}</p><button onClick={() => player.load(player.store.get().sources[player.store.get().currentSourceIndex] || { url: src || '' }, textTracks)} className=\"px-6 py-2 bg-[var(--accent)] text-white font-medium rounded-full hover:opacity-90 transition-opacity mt-4 shadow-lg\">Try Again</button></div></div>}\n {((!state.isPlaying && !state.isBuffering && !state.error) || showControls) && !state.isBuffering ? (\n <div className={`absolute inset-0 flex items-center justify-center z-10 transition-opacity duration-300 pointer-events-none ${showControls || !state.isPlaying ? 'opacity-100' : 'opacity-0'}`}>\n <div className=\"flex items-center gap-8 md:gap-16 pointer-events-auto\">\n <button onClick={(e) => { e.stopPropagation(); setSettingsOpen(false); setSubtitleMenuOpen(false); triggerSkip('rewind'); }} className={`group flex items-center justify-center rounded-full bg-black/40 hover:bg-black/60 border border-white/10 transition-all active:scale-110 text-white/90 focus:outline-none backdrop-blur-sm ${center.skipBtn}`}><Replay10Icon className={center.skipIcon} /></button>\n <button onClick={(e) => { e.stopPropagation(); setSettingsOpen(false); setSubtitleMenuOpen(false); player.togglePlay(); }} className={`group relative flex items-center justify-center rounded-full bg-white/10 hover:bg-[var(--accent)] border border-white/10 shadow-2xl transition-all hover:scale-105 active:scale-110 duration-75 focus:outline-none backdrop-blur-md ${center.playBtn}`}>{state.isPlaying ? <PauseIcon className={`${center.playIcon} text-white fill-current`} /> : <PlayIcon className={`${center.playIcon} text-white ml-1 fill-current`} />}</button>\n <button onClick={(e) => { e.stopPropagation(); setSettingsOpen(false); setSubtitleMenuOpen(false); triggerSkip('forward'); }} className={`group flex items-center justify-center rounded-full bg-black/40 hover:bg-black/60 border border-white/10 transition-all active:scale-110 text-white/90 focus:outline-none backdrop-blur-sm ${center.skipBtn}`}><Forward10Icon className={center.skipIcon} /></button>\n </div>\n </div>\n ) : null}\n <div className={`absolute inset-x-0 bottom-0 z-30 transition-all duration-300 px-4 md:px-6 pb-4 md:pb-6 pt-24 bg-gradient-to-t from-black/95 via-black/70 to-transparent ${showControls ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'}`} onClick={(e) => { if (e.target === e.currentTarget) { setSettingsOpen(false); setSubtitleMenuOpen(false); } e.stopPropagation(); }}>\n <div\n ref={progressBarRef}\n className=\"relative w-full h-3 group/slider mb-3 cursor-pointer touch-none flex items-center\"\n onMouseMove={handleProgressMove}\n onMouseLeave={() => { setHoverTime(null); setCurrentThumbnail(null); }}\n onMouseDown={handleSeekStart}\n onTouchStart={handleSeekStart}\n >\n {hoverTime !== null && (<div className=\"absolute bottom-full mb-1.5 flex flex-col items-center transform -translate-x-1/2 z-40 pointer-events-none transition-opacity duration-150\" style={{ left: `clamp(70px, ${hoverPos}%, calc(100% - 70px))` }}>{currentThumbnail && (<div className=\"bg-black/90 border border-white/10 shadow-2xl overflow-hidden backdrop-blur-sm\" style={{ width: `${currentThumbnail.w * 0.5}px`, height: `${currentThumbnail.h * 0.5}px`, borderRadius: 'var(--radius)' }}><div style={{ backgroundImage: `url(\"${currentThumbnail.url}\")`, width: `${currentThumbnail.w}px`, height: `${currentThumbnail.h}px`, backgroundPosition: `-${currentThumbnail.x}px -${currentThumbnail.y}px`, backgroundRepeat: 'no-repeat', transform: 'scale(0.5)', transformOrigin: 'top left' }} /></div>)}<div className=\"strata-tooltip px-2 py-0.5 text-[11px] font-bold font-mono shadow-lg tabular-nums mt-1\">{formatTime(hoverTime)}</div></div>)}\n\n {/* Track */}\n <div className=\"w-full h-1 bg-white/20 overflow-hidden relative backdrop-blur-sm border-[length:var(--border-width)] border-white/10\" style={{ borderRadius: 'var(--radius-full)' }}>\n {state.duration > 0 && state.buffered.map((range, i) => (<div key={i} className=\"absolute top-0 bottom-0 bg-white/20\" style={{ left: `${(range.start / state.duration) * 100}%`, width: `${((range.end - range.start) / state.duration) * 100}%` }} />))}\n <div className=\"absolute left-0 top-0 bottom-0 bg-[var(--accent)]\" style={{ width: `${((isScrubbing ? scrubbingTime : state.currentTime) / state.duration) * 100}%` }} />\n </div>\n\n {/* Thumb */}\n <div\n className=\"absolute top-1/2 -translate-y-1/2 -translate-x-1/2 w-3.5 h-3.5 bg-white shadow-md scale-0 group-hover/slider:scale-100 transition-transform duration-100 z-10\"\n style={{\n left: `${((isScrubbing ? scrubbingTime : state.currentTime) / state.duration) * 100}%`,\n borderRadius: 'var(--radius-full)'\n }}\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <button onClick={() => player.togglePlay()} className={`strata-control-btn text-zinc-300 hover:text-white transition-colors hover:bg-white/10 focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}>{state.isPlaying ? <PauseIcon className={`${iconClass} fill-current`} /> : <PlayIcon className={`${iconClass} fill-current`} />}</button>\n\n <div className=\"flex items-center gap-2 group/vol relative\" onMouseEnter={() => setIsVolumeHovered(true)} onMouseLeave={() => setIsVolumeHovered(false)}>\n <button onClick={() => player.toggleMute()} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}><VolIcon className={iconClass} /></button>\n <div className={`relative h-8 flex items-center transition-all duration-300 ease-out overflow-hidden ${isVolumeHovered || isVolumeScrubbing ? 'w-28 opacity-100 ml-1' : 'w-0 opacity-0'}`}>\n <div ref={volumeBarRef} className=\"relative w-full h-full flex items-center cursor-pointer px-2\" onMouseDown={handleVolumeStart} onTouchStart={handleVolumeStart}>\n <div className=\"w-full h-1 bg-white/20 overflow-hidden\" style={{ borderRadius: 'var(--radius-full)' }}>\n <div className=\"h-full bg-white\" style={{ width: `${(state.isMuted ? 0 : state.volume) * 100}%`, borderRadius: 'var(--radius-full)' }}></div>\n </div>\n <div className=\"absolute h-3 w-3 bg-white shadow-md top-1/2 -translate-y-1/2 pointer-events-none\" style={{ left: `calc(${(state.isMuted ? 0 : state.volume) * 100}% * 0.85 + 4px)`, borderRadius: 'var(--radius-full)' }} />\n </div>\n </div>\n {(isVolumeHovered || isVolumeScrubbing) && (\n <div\n className=\"strata-tooltip absolute bottom-full mb-2 px-1.5 py-0.5 rounded text-[10px] font-bold font-mono shadow-lg pointer-events-none whitespace-nowrap z-50 transform -translate-x-1/2\"\n style={{ left: `calc(52px + ${(state.isMuted ? 0 : state.volume) * 80}px)` }}\n >\n {state.isMuted ? '0%' : `${Math.round(state.volume * 100)}%`}\n </div>\n )}\n </div>\n\n <div className=\"text-xs font-medium text-zinc-400 font-mono select-none hidden sm:block tabular-nums\">{formatTime(isScrubbing ? scrubbingTime : state.currentTime)} <span className=\"text-zinc-600\">/</span> {formatTime(state.duration)}</div>\n </div>\n <div className=\"flex items-center gap-1\">\n <div className=\"relative\">\n <button onClick={(e) => { e.stopPropagation(); setSubtitleMenuOpen(!subtitleMenuOpen); setSettingsOpen(false); }} className={`strata-control-btn transition-colors focus:outline-none ${btnClass} ${subtitleMenuOpen ? 'text-[var(--accent)] bg-white/10' : 'text-zinc-300 hover:text-white hover:bg-white/10'}`} style={{ borderRadius: 'var(--radius)' }}><SubtitleIcon className={iconClass} /></button>\n {subtitleTransition.isMounted && (<SubtitleMenu tracks={state.subtitleTracks} current={state.currentSubtitle} onSelect={(idx: number) => player.setSubtitle(idx)} onUpload={(file: File) => player.addTextTrack(file, file.name)} onClose={() => setSubtitleMenuOpen(false)} settings={state.subtitleSettings} onSettingsChange={(s: Partial<SubtitleSettings>) => player.updateSubtitleSettings(s)} onReset={() => player.resetSubtitleSettings()} offset={state.subtitleOffset} maxHeight={menuMaxHeight} animationClass={subtitleTransition.isVisible ? 'opacity-100 translate-y-0 scale-100' : 'opacity-0 translate-y-2 scale-95'} />)}\n </div>\n <button onClick={() => player.togglePip()} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 transition-colors hidden sm:block focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}><PipIcon className={iconClass} /></button>\n <button onClick={() => player.download()} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 transition-colors hidden sm:block focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}><DownloadIcon className={iconClass} /></button>\n <div className=\"relative\">\n <button onClick={(e) => { e.stopPropagation(); setSettingsOpen(!settingsOpen); setSubtitleMenuOpen(false); setActiveMenu('main'); }} className={`strata-control-btn transition-all duration-300 focus:outline-none ${btnClass} ${settingsOpen ? 'rotate-90 text-[var(--accent)] bg-white/10' : 'text-zinc-300 hover:text-white hover:bg-white/10'}`} style={{ borderRadius: 'var(--radius)' }}><SettingsIcon className={iconClass} /></button>\n {settingsTransition.isMounted && (<Menu onClose={() => setSettingsOpen(false)} align=\"right\" maxHeight={menuMaxHeight} className={settingsTransition.isVisible ? 'opacity-100 translate-y-0 scale-100' : 'opacity-0 translate-y-2 scale-95'}><div className=\"w-full\">\n\n {activeMenu === 'main' && (\n <div className=\"animate-in slide-in-from-left-4 fade-in duration-200\">\n <div className=\"px-3 py-2 mb-1 border-b border-white/5 font-bold text-zinc-400 uppercase text-[11px] tracking-wider flex justify-between items-center bg-white/5 sticky top-0 z-10 backdrop-blur-md\" style={{ borderRadius: 'var(--radius)' }}><span>Settings</span></div>\n {state.sources.length > 1 && <MenuItem label=\"Source\" value={state.sources[state.currentSourceIndex]?.name || `Source ${state.currentSourceIndex + 1}`} onClick={() => setActiveMenu('sources')} hasSubmenu />}\n <MenuItem label=\"Speed\" value={`${state.playbackRate}x`} onClick={() => setActiveMenu('speed')} hasSubmenu />\n <MenuItem label=\"Quality\" value={state.currentQuality === -1 ? 'Auto' : `${state.qualityLevels[state.currentQuality]?.height}p`} onClick={() => setActiveMenu('quality')} hasSubmenu />\n <MenuItem label=\"Audio\" value={state.audioTracks[state.currentAudioTrack]?.label || 'Default'} onClick={() => setActiveMenu('audio')} hasSubmenu />\n <MenuItem label=\"Audio Boost\" value={state.audioGain > 1 ? `${state.audioGain}x` : 'Off'} onClick={() => setActiveMenu('boost')} hasSubmenu />\n <MenuDivider />\n <MenuItem label=\"Watch Party\" icon={<UsersIcon className=\"w-4 h-4\" />} onClick={() => setActiveMenu('party')} hasSubmenu />\n <MenuItem label=\"Cast to Device\" icon={<CastIcon className=\"w-4 h-4\" />} onClick={() => { player.requestCast(); setSettingsOpen(false); }} />\n <MenuDivider />\n <MenuItem label=\"Appearance\" icon={<PaletteIcon className=\"w-4 h-4\" />} onClick={() => setActiveMenu('appearance')} hasSubmenu />\n </div>\n )}\n\n {['speed', 'quality', 'audio', 'boost', 'party', 'appearance', 'sources'].includes(activeMenu) && (\n <div className=\"animate-in slide-in-from-right-4 fade-in duration-200\">\n {activeMenu === 'sources' && (<><MenuHeader label=\"Select Source\" onBack={() => setActiveMenu('main')} />{state.sources.map((src, i) => (<MenuItem key={i} label={src.name || `Source ${i + 1}`} value={src.type} active={state.currentSourceIndex === i} onClick={() => player.switchSource(i)} />))}</>)}\n {activeMenu === 'speed' && (<><MenuHeader label=\"Speed\" onBack={() => setActiveMenu('main')} />{[0.5, 1, 1.5, 2].map(rate => (<MenuItem key={rate} label={`${rate}x`} active={state.playbackRate === rate} onClick={() => player.video.playbackRate = rate} />))}</>)}\n {activeMenu === 'quality' && (<><MenuHeader label=\"Quality\" onBack={() => setActiveMenu('main')} /><MenuItem label=\"Auto\" active={state.currentQuality === -1} onClick={() => player.setQuality(-1)} />{state.qualityLevels.map((lvl) => (<MenuItem key={lvl.index} label={`${lvl.height}p`} value={`${Math.round(lvl.bitrate / 1000)}k`} active={state.currentQuality === lvl.index} onClick={() => player.setQuality(lvl.index)} />))}</>)}\n {activeMenu === 'audio' && (<><MenuHeader label=\"Audio Track\" onBack={() => setActiveMenu('main')} />{state.audioTracks.length === 0 && <div className=\"px-4 py-3 text-zinc-500 text-xs text-center\">No tracks available</div>}{state.audioTracks.map((track) => (<MenuItem key={track.index} label={track.label} value={track.language} active={state.currentAudioTrack === track.index} onClick={() => player.setAudioTrack(track.index)} />))}</>)}\n {activeMenu === 'boost' && (<><MenuHeader label=\"Audio Boost\" onBack={() => setActiveMenu('main')} />{[1, 1.5, 2, 3].map(gain => (<MenuItem key={gain} label={gain === 1 ? 'Off' : `${gain}x`} active={state.audioGain === gain} onClick={() => player.setAudioGain(gain)} />))}</>)}\n {activeMenu === 'party' && (<><MenuHeader label=\"Watch Party\" onBack={() => setActiveMenu('main')} /><div className=\"p-4 space-y-3\"><p className=\"text-xs text-zinc-400 leading-relaxed\">Create a synchronized room on WatchParty.me to watch together.</p><a href={`https://www.watchparty.me/create?video=${encodeURIComponent(state.sources[state.currentSourceIndex]?.url || src || '')}`} target=\"_blank\" rel=\"noopener noreferrer\" className=\"flex items-center justify-center w-full py-2.5 bg-[var(--accent)] hover:opacity-90 text-white font-medium transition-opacity text-xs\" style={{ borderRadius: 'var(--radius)' }}>Create Room</a></div></>)}\n {activeMenu === 'appearance' && (\n <>\n <MenuHeader label=\"Appearance\" onBack={() => setActiveMenu('main')} />\n <div className=\"pb-1\">\n <SettingsGroup title=\"Theme\">\n <div className=\"grid grid-cols-2 gap-2 px-3\">\n {THEMES.map(theme => (\n <button\n key={theme.value}\n onClick={() => player.setAppearance({ theme: theme.value, themeColor: theme.color })}\n className={`py-2 text-xs font-bold uppercase tracking-wide transition-colors border-[length:var(--border-width)] border-white/10 ${state.theme === theme.value ? 'bg-[var(--accent)] text-white' : 'bg-white/5 text-zinc-400 hover:text-white'}`}\n style={{ borderRadius: 'var(--radius)' }}\n >\n {theme.label}\n </button>\n ))}\n </div>\n </SettingsGroup>\n\n <SettingsGroup title=\"Icon Size\">\n <div className=\"grid grid-cols-3 gap-1 px-3\">\n {(['small', 'medium', 'large'] as const).map(s => (\n <button\n key={s}\n onClick={() => player.setAppearance({ iconSize: s })}\n className={`py-1.5 text-xs font-medium transition-colors ${state.iconSize === s ? 'bg-white text-black' : 'bg-white/5 text-zinc-400 hover:text-zinc-200'}`}\n style={{ borderRadius: 'var(--radius)' }}\n >\n {s.charAt(0).toUpperCase() + s.slice(1)}\n </button>\n ))}\n </div>\n </SettingsGroup>\n\n <SettingsGroup title=\"Theme Color\">\n <div className=\"grid grid-cols-6 gap-2 px-3\">\n {THEME_COLORS.map(c => (\n <button\n key={c.value}\n title={c.label}\n onClick={() => player.setAppearance({ themeColor: c.value })}\n className={`w-6 h-6 transition-transform hover:scale-110 ${state.themeColor === c.value ? 'ring-2 ring-white scale-110' : 'ring-1 ring-white/10'}`}\n style={{ backgroundColor: c.value, borderRadius: 'var(--radius-full)' }}\n >\n {state.themeColor === c.value && <CheckIcon className=\"w-3 h-3 text-white mx-auto stroke-[3]\" />}\n </button>\n ))}\n </div>\n <div className=\"px-3 pt-4\">\n <div className=\"flex items-center gap-3 bg-white/5 p-2 hover:bg-white/10 transition-colors group\" style={{ borderRadius: 'var(--radius)' }}>\n <div className=\"relative w-6 h-6 overflow-hidden ring-1 ring-white/20\" style={{ borderRadius: 'var(--radius-full)' }}>\n <input\n type=\"color\"\n value={state.themeColor}\n onChange={(e) => player.setAppearance({ themeColor: e.target.value })}\n className=\"absolute inset-[-4px] w-[150%] h-[150%] cursor-pointer p-0 border-0\"\n />\n </div>\n <span className=\"text-xs text-zinc-400 font-medium group-hover:text-zinc-200\">Custom Color</span>\n <span className=\"text-[10px] font-mono text-zinc-500 ml-auto uppercase\">{state.themeColor}</span>\n </div>\n </div>\n </SettingsGroup>\n </div>\n </>\n )}\n </div>\n )}\n\n </div></Menu>)}\n </div>\n <button onClick={() => player.toggleFullscreen()} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 rounded-lg transition-transform hover:scale-110 focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}>{state.isFullscreen ? <MinimizeIcon className={iconClass} /> : <MaximizeIcon className={iconClass} />}</button>\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n );\n};\n","import './index.css';\r\nimport React from 'react';\r\nimport { createRoot } from 'react-dom/client';\r\nimport { StrataPlayer } from './ui/StrataPlayer';\r\nimport { StrataCore, PlayerState, PlayerSource, StrataConfig, TextTrackConfig } from './core/StrataCore';\r\nimport { HlsPlugin } from './plugins/HlsPlugin';\r\n\r\n// Export React Component\r\nexport { StrataPlayer };\r\n\r\n// Export Core & Plugins for advanced usage\r\nexport { StrataCore, HlsPlugin };\r\nexport type { PlayerState, PlayerSource, StrataConfig, TextTrackConfig };\r\n\r\n// Export Vanilla JS / Framework Agnostic Mounting Helper\r\nexport interface StrataPlayerInstance {\r\n unmount: () => void;\r\n update: (props: any) => void;\r\n}\r\n\r\nexport const mountStrataPlayer = (container: HTMLElement, props: any): StrataPlayerInstance => {\r\n const root = createRoot(container);\r\n\r\n // Initial Render\r\n root.render(React.createElement(StrataPlayer, props));\r\n\r\n return {\r\n unmount: () => {\r\n root.unmount();\r\n },\r\n update: (newProps: any) => {\r\n // Merge props or replace depending on needs, here we merge with original + new\r\n root.render(React.createElement(StrataPlayer, { ...props, ...newProps }));\r\n }\r\n };\r\n};"],"names":["EventBus","__publicField","event","callback","_a","subscribers","cb","data","NanoStore","initialState","partial","prevState","update","listener","AudioEngine","video","e","value","DEFAULT_SUBTITLE_SETTINGS","STORAGE_KEY","DEFAULT_STATE","getResolvedState","config","saved","raw","mergedSubtitleSettings","StrataCore","videoElement","state","settings","s","message","isFatal","customMessage","error","delay","time","onCanPlay","finalMsg","buffered","tracks","t","track","index","url","retries","i","res","r","container","plugin","sources","wasPlaying","source","isRetry","srcObj","type","oldTracks","file","label","reader","content","blob","newTrackIndex","src","lang","isDefault","seconds","vol","safeVol","gain","err","w","initializeCastApi","isAvailable","castSession","mediaInfo","request","cues","c","newSettings","offset","currentOffset","delta","cue","notifId","response","contentLength","total","loaded","chunks","done","percent","a","n","id","newNotification","current","prev","p","HlsPlugin","core","Hls","levels","lvl","idx","msg","formatTime","h","m","fetchVttWithRetry","parseVTT","notify","lines","start","end","baseUrl","parseTime","parts","line","times","urlPart","hash","x","y","coords","useTransition","isActive","duration","isMounted","setIsMounted","useState","isVisible","setIsVisible","useEffect","timer","PlayIcon","Play","PauseIcon","Pause","VolumeHighIcon","Volume2","VolumeLowIcon","Volume1","VolumeMuteIcon","VolumeX","MaximizeIcon","Maximize","MinimizeIcon","Minimize","SettingsIcon","Settings","CheckIcon","Check","PipIcon","PictureInPicture","SubtitleIcon","Subtitles","DownloadIcon","Download","UploadIcon","Upload","ArrowLeftIcon","ArrowLeft","LoaderIcon","Loader2","CastIcon","Cast","UsersIcon","Users","ClockIcon","Clock","MinusIcon","Minus","PlusIcon","Plus","CustomizeIcon","SlidersHorizontal","TypeIcon","Type","PaletteIcon","Palette","EyeIcon","Eye","MoveVerticalIcon","MoveVertical","ResetIcon","RefreshCcw","BoldIcon","Bold","CaseUpperIcon","CaseUpper","BlurIcon","Droplet","Replay10Icon","className","RotateCcw","Forward10Icon","RotateCw","NotificationContainer","notifications","jsxs","jsx","SubtitleOverlay","getTextShadow","text","Menu","children","onClose","align","maxHeight","ref","useRef","positionClasses","styleObj","MenuItem","active","onClick","hasSubmenu","icon","MenuHeader","onBack","rightAction","MenuDivider","Toggle","checked","onChange","Slider","min","max","step","formatValue","Select","options","opt","SettingsGroup","title","SubtitleMenu","onSelect","onUpload","onSettingsChange","onReset","animationClass","view","setView","fileInputRef","val","Fragment","player","v","THEME_COLORS","THEMES","StrataPlayer","props","poster","autoPlay","thumbnails","textTracks","plugins","containerRef","setPlayer","hasPlayed","setHasPlayed","playerHeight","setPlayerHeight","useMemo","useSyncExternalStore","useCallback","showControls","setShowControls","settingsOpen","setSettingsOpen","subtitleMenuOpen","setSubtitleMenuOpen","activeMenu","setActiveMenu","settingsTransition","subtitleTransition","isScrubbing","setIsScrubbing","scrubbingTime","setScrubbingTime","isVolumeScrubbing","setIsVolumeScrubbing","isVolumeHovered","setIsVolumeHovered","thumbnailCues","setThumbnailCues","hoverTime","setHoverTime","hoverPos","setHoverPos","currentThumbnail","setCurrentThumbnail","seekAnimation","setSeekAnimation","skipTrigger","setSkipTrigger","clickTimeoutRef","controlsTimeoutRef","progressBarRef","volumeBarRef","observer","entries","entry","updates","setCues","handleKeyDown","handleMouseMove","calculateTimeFromEvent","rect","clientX","handleSeekStart","handleMove","moveEvent","handleUp","upEvent","calculateVolumeFromEvent","handleVolumeStart","handleProgressMove","triggerSkip","direction","handleContainerClick","width","now","VolIcon","menuMaxHeight","getIconClass","getButtonClass","iconClass","btnClass","center","range","_b","_c","rate","_d","theme","mountStrataPlayer","root","createRoot","React","newProps"],"mappings":"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"}
|