strataplayer 1.2.7 → 1.2.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"strataplayer.es.js","sources":["../core/EventBus.ts","../core/NanoStore.ts","../core/AudioEngine.ts","../core/StrataCore.ts","../utils/playerUtils.ts","../ui/hooks/useTransition.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/arrow-left.js","../node_modules/lucide-react/dist/esm/icons/bold.js","../node_modules/lucide-react/dist/esm/icons/camera.js","../node_modules/lucide-react/dist/esm/icons/captions.js","../node_modules/lucide-react/dist/esm/icons/case-upper.js","../node_modules/lucide-react/dist/esm/icons/cast.js","../node_modules/lucide-react/dist/esm/icons/check.js","../node_modules/lucide-react/dist/esm/icons/clock.js","../node_modules/lucide-react/dist/esm/icons/download.js","../node_modules/lucide-react/dist/esm/icons/droplet.js","../node_modules/lucide-react/dist/esm/icons/eye.js","../node_modules/lucide-react/dist/esm/icons/info.js","../node_modules/lucide-react/dist/esm/icons/loader-circle.js","../node_modules/lucide-react/dist/esm/icons/lock-open.js","../node_modules/lucide-react/dist/esm/icons/lock.js","../node_modules/lucide-react/dist/esm/icons/maximize.js","../node_modules/lucide-react/dist/esm/icons/minimize.js","../node_modules/lucide-react/dist/esm/icons/minus.js","../node_modules/lucide-react/dist/esm/icons/monitor.js","../node_modules/lucide-react/dist/esm/icons/move-vertical.js","../node_modules/lucide-react/dist/esm/icons/palette.js","../node_modules/lucide-react/dist/esm/icons/pause.js","../node_modules/lucide-react/dist/esm/icons/picture-in-picture.js","../node_modules/lucide-react/dist/esm/icons/play.js","../node_modules/lucide-react/dist/esm/icons/plus.js","../node_modules/lucide-react/dist/esm/icons/refresh-ccw.js","../node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../node_modules/lucide-react/dist/esm/icons/rotate-cw.js","../node_modules/lucide-react/dist/esm/icons/settings.js","../node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js","../node_modules/lucide-react/dist/esm/icons/type.js","../node_modules/lucide-react/dist/esm/icons/upload.js","../node_modules/lucide-react/dist/esm/icons/users.js","../node_modules/lucide-react/dist/esm/icons/volume-1.js","../node_modules/lucide-react/dist/esm/icons/volume-2.js","../node_modules/lucide-react/dist/esm/icons/volume-x.js","../node_modules/lucide-react/dist/esm/icons/x.js","../node_modules/lucide-react/dist/esm/icons/zap.js","../ui/Icons.tsx","../ui/components/NotificationContainer.tsx","../ui/components/SubtitleOverlay.tsx","../ui/components/Menu.tsx","../ui/components/SettingsPrimitives.tsx","../ui/components/SubtitleMenu.tsx","../ui/components/ContextMenu.tsx","../ui/components/VideoInfo.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","\r\nimport { EventBus, EventCallback } from './EventBus';\r\nimport { NanoStore } from './NanoStore';\r\nimport { AudioEngine } from './AudioEngine';\r\nimport React from 'react';\r\n\r\nexport interface Notification {\r\n id: string;\r\n message: string;\r\n type: 'info' | 'success' | 'warning' | 'error' | 'loading';\r\n duration?: number; // ms, if null then persistent\r\n progress?: number; // 0-100\r\n}\r\n\r\nexport interface TextTrackConfig {\r\n src: string;\r\n label: string;\r\n srcLang?: string;\r\n default?: boolean;\r\n kind?: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';\r\n}\r\n\r\nexport interface SubtitleSettings {\r\n useNative: boolean; // \"Native video subtitle\"\r\n fixCapitalization: boolean;\r\n backgroundOpacity: number; // 0-100\r\n backgroundBlur: boolean;\r\n backgroundBlurAmount: number; // px\r\n textSize: number; // % (100 = 1em)\r\n textStyle: 'none' | 'outline' | 'raised' | 'depressed' | 'shadow';\r\n isBold: boolean;\r\n textColor: string;\r\n verticalOffset: number; // px from bottom\r\n}\r\n\r\nexport const DEFAULT_SUBTITLE_SETTINGS: SubtitleSettings = {\r\n useNative: false,\r\n fixCapitalization: false,\r\n backgroundOpacity: 50,\r\n backgroundBlur: false,\r\n backgroundBlurAmount: 4,\r\n textSize: 100,\r\n textStyle: 'shadow',\r\n isBold: false,\r\n textColor: '#ffffff',\r\n verticalOffset: 40,\r\n};\r\n\r\nexport type PlayerTheme = 'default' | 'pixel' | 'game' | 'hacker';\r\n\r\nexport interface PlayerSource {\r\n url: string;\r\n type?: 'hls' | 'mp4' | 'webm' | 'dash' | 'mpegts' | 'webtorrent' | string;\r\n name?: string;\r\n}\r\n\r\nexport interface Highlight {\r\n time: number;\r\n text: string;\r\n}\r\n\r\n// --- Phase 2: New Interfaces ---\r\n\r\nexport interface LayerConfig {\r\n name?: string;\r\n html: string | React.ReactNode;\r\n style?: React.CSSProperties;\r\n className?: string;\r\n // Compatibility aliases\r\n click?: () => void;\r\n mounted?: (element: HTMLElement) => void;\r\n}\r\n\r\nexport interface ContextMenuItem {\r\n html?: string | React.ReactNode;\r\n disabled?: boolean;\r\n icon?: string | React.ReactNode;\r\n onClick?: (close: () => void) => void;\r\n click?: (close: () => void) => void; // Alias\r\n checked?: boolean; // Checkbox style\r\n\r\n // Formatting\r\n showBorder?: boolean; // Deprecated in favor of separator item, but kept for compat\r\n separator?: boolean; // Render as a divider line\r\n isLabel?: boolean; // Render as a category header/label\r\n}\r\n\r\nexport interface ControlItem {\r\n id?: string;\r\n position: 'left' | 'right' | 'center';\r\n index: number; // Order: 0-100\r\n html?: string | React.ReactNode; // Custom content\r\n tooltip?: string;\r\n onClick?: (core: StrataCore) => void;\r\n click?: (core: StrataCore) => void; // Alias\r\n className?: string;\r\n style?: React.CSSProperties;\r\n // Internal use for built-ins\r\n isBuiltIn?: boolean;\r\n builtInId?: string;\r\n}\r\n\r\nexport interface SettingItem {\r\n id?: string;\r\n html: string | React.ReactNode;\r\n icon?: string | React.ReactNode;\r\n tooltip?: string;\r\n // Toggle Switch Support\r\n switch?: boolean;\r\n onSwitch?: (item: SettingItem) => boolean | void;\r\n // Standard Action Support\r\n onClick?: () => void;\r\n click?: () => void; // Alias\r\n isDefault?: boolean; // Mark as one of the default settings\r\n}\r\n\r\nexport interface PlayerState {\r\n isPlaying: boolean;\r\n isBuffering: boolean;\r\n isLive: boolean;\r\n currentTime: number;\r\n duration: number;\r\n buffered: { start: number; end: number }[];\r\n volume: number;\r\n isMuted: boolean;\r\n audioGain: number;\r\n playbackRate: number;\r\n qualityLevels: { height: number; bitrate: number; index: number }[];\r\n currentQuality: number;\r\n audioTracks: { label: string; language: string; index: number }[];\r\n currentAudioTrack: number;\r\n error: string | null;\r\n isFullscreen: boolean;\r\n isPip: boolean;\r\n subtitleTracks: { label: string; language: string; index: number }[];\r\n currentSubtitle: number;\r\n subtitleOffset: number; // in seconds\r\n subtitleSettings: SubtitleSettings;\r\n activeCues: string[]; // For custom rendering\r\n viewMode: 'normal' | 'theater' | 'pip';\r\n notifications: Notification[];\r\n // Appearance\r\n iconSize: 'small' | 'medium' | 'large';\r\n themeColor: string;\r\n theme: PlayerTheme;\r\n // Sources\r\n sources: PlayerSource[];\r\n currentSourceIndex: number;\r\n\r\n // Phase 1 New Features State\r\n isLocked: boolean;\r\n flipState: { horizontal: boolean; vertical: boolean };\r\n aspectRatio: string; // 'default', '16:9', '4:3'\r\n isAutoSized: boolean; // tracks if autoSize (cover) is currently applied\r\n isLooping: boolean; // Track loop state reactively\r\n\r\n // UI State reflected in Core\r\n controlsVisible: boolean;\r\n}\r\n\r\nexport interface StrataConfig {\r\n // Basic\r\n container?: string; // Class for container\r\n id?: string;\r\n\r\n // Playback\r\n volume?: number;\r\n muted?: boolean;\r\n playbackRate?: number;\r\n audioGain?: number;\r\n loop?: boolean;\r\n playsInline?: boolean;\r\n isLive?: boolean;\r\n poster?: string; // Added to Config for Core access\r\n fetchTimeout?: number; // Default 30000ms\r\n\r\n // Appearance\r\n theme?: PlayerTheme;\r\n themeColor?: string;\r\n iconSize?: 'small' | 'medium' | 'large';\r\n backdrop?: boolean; // Blur effect\r\n autoSize?: boolean; // object-fit: cover logic\r\n\r\n // Subtitles\r\n subtitleSettings?: Partial<SubtitleSettings>;\r\n\r\n // UI Toggles\r\n screenshot?: boolean;\r\n setting?: boolean;\r\n pip?: boolean;\r\n fullscreen?: boolean;\r\n fullscreenWeb?: boolean;\r\n flip?: boolean;\r\n aspectRatio?: boolean;\r\n highlight?: Highlight[];\r\n centerControls?: boolean; // Default true\r\n\r\n // Controls / Mobile\r\n hotKey?: boolean;\r\n lock?: boolean; // Mobile lock button\r\n gesture?: boolean; // Mobile gestures\r\n gestureSeek?: boolean; // Drag to seek on mobile. Default false.\r\n fastForward?: boolean; // Long press\r\n autoOrientation?: boolean; // Mobile landscape lock (default: true)\r\n\r\n // Phase 2: Customization\r\n layers?: LayerConfig[];\r\n contextmenu?: ContextMenuItem[];\r\n controls?: ControlItem[];\r\n settings?: SettingItem[]; // Append to main menu\r\n\r\n // System\r\n useSSR?: boolean;\r\n disablePersistence?: boolean;\r\n}\r\n\r\nconst STORAGE_KEY = 'strata-settings';\r\n\r\nexport const DEFAULT_STATE: PlayerState = {\r\n isPlaying: false,\r\n isBuffering: false,\r\n isLive: false,\r\n currentTime: 0,\r\n duration: 0,\r\n buffered: [],\r\n volume: 1,\r\n isMuted: false,\r\n audioGain: 1,\r\n playbackRate: 1,\r\n qualityLevels: [],\r\n currentQuality: -1,\r\n audioTracks: [],\r\n currentAudioTrack: -1,\r\n error: null,\r\n isFullscreen: false,\r\n isPip: false,\r\n subtitleTracks: [],\r\n currentSubtitle: -1,\r\n subtitleOffset: 0,\r\n subtitleSettings: DEFAULT_SUBTITLE_SETTINGS,\r\n activeCues: [],\r\n viewMode: 'normal',\r\n notifications: [],\r\n iconSize: 'medium',\r\n themeColor: '#6366f1',\r\n theme: 'default',\r\n sources: [],\r\n currentSourceIndex: -1,\r\n // New State Defaults\r\n isLocked: false,\r\n flipState: { horizontal: false, vertical: false },\r\n aspectRatio: 'default',\r\n isAutoSized: false,\r\n isLooping: false,\r\n controlsVisible: true\r\n};\r\n\r\n// Helper to merge Defaults -> LocalStorage -> Config\r\nexport const getResolvedState = (config: StrataConfig = {}): PlayerState => {\r\n let saved: any = {};\r\n if (!config.disablePersistence && typeof window !== 'undefined') {\r\n try {\r\n const raw = localStorage.getItem(STORAGE_KEY);\r\n if (raw) saved = JSON.parse(raw);\r\n } catch (e) { /* ignore */ }\r\n }\r\n\r\n const mergedSubtitleSettings = {\r\n ...DEFAULT_SUBTITLE_SETTINGS,\r\n ...(saved.subtitleSettings || {}),\r\n ...(config.subtitleSettings || {})\r\n };\r\n\r\n return {\r\n ...DEFAULT_STATE,\r\n ...saved, // Load saved first\r\n // Override with config if present (not undefined)\r\n volume: config.volume ?? saved.volume ?? DEFAULT_STATE.volume,\r\n isMuted: config.muted ?? saved.isMuted ?? DEFAULT_STATE.isMuted,\r\n playbackRate: config.playbackRate ?? saved.playbackRate ?? DEFAULT_STATE.playbackRate,\r\n audioGain: config.audioGain ?? saved.audioGain ?? DEFAULT_STATE.audioGain,\r\n theme: config.theme ?? saved.theme ?? DEFAULT_STATE.theme,\r\n themeColor: config.themeColor ?? saved.themeColor ?? DEFAULT_STATE.themeColor,\r\n iconSize: config.iconSize ?? saved.iconSize ?? DEFAULT_STATE.iconSize,\r\n subtitleSettings: mergedSubtitleSettings,\r\n // Config overrides state for these visual modes\r\n isAutoSized: config.autoSize ?? DEFAULT_STATE.isAutoSized,\r\n isLive: config.isLive ?? saved.isLive ?? DEFAULT_STATE.isLive,\r\n isLooping: config.loop ?? saved.isLooping ?? DEFAULT_STATE.isLooping\r\n };\r\n};\r\n\r\nexport interface IPlugin {\r\n name: string;\r\n init(core: StrataCore): void;\r\n destroy?(): void;\r\n}\r\n\r\nexport class StrataCore {\r\n public video: HTMLVideoElement;\r\n public container: HTMLElement | null = null;\r\n public events: EventBus;\r\n public store: NanoStore<PlayerState>;\r\n private plugins: Map<string, IPlugin> = new Map();\r\n private audioEngine: AudioEngine;\r\n public config: StrataConfig;\r\n private resizeObserver: ResizeObserver | null = null;\r\n\r\n // Retry Logic\r\n private retryCount = 0;\r\n private maxRetries = 5;\r\n private retryTimer: any = null;\r\n private currentSource: PlayerSource | null = null;\r\n private currentSrc: string = '';\r\n private currentTracks: TextTrackConfig[] = [];\r\n\r\n // Cast\r\n private castInitialized = false;\r\n\r\n private boundCueChange: () => void;\r\n private boundFullscreenChange: () => void;\r\n\r\n constructor(config: StrataConfig = {}, videoElement?: HTMLVideoElement) {\r\n this.config = config;\r\n // Set Defaults\r\n this.config.autoOrientation = this.config.autoOrientation ?? true;\r\n this.config.fetchTimeout = this.config.fetchTimeout ?? 30000;\r\n this.config.centerControls = this.config.centerControls ?? true;\r\n this.config.gestureSeek = this.config.gestureSeek ?? false;\r\n\r\n this.video = videoElement || document.createElement('video');\r\n this.video.crossOrigin = \"anonymous\";\r\n\r\n // Init Config Props to Video\r\n if (config.playsInline !== false) this.video.playsInline = true;\r\n\r\n this.events = new EventBus();\r\n\r\n // Initialize Store with resolved state\r\n const initialState = getResolvedState(config);\r\n this.store = new NanoStore(initialState);\r\n\r\n this.audioEngine = new AudioEngine(this.video);\r\n this.boundCueChange = this.handleCueChange.bind(this);\r\n\r\n // Bind fullscreen listener once\r\n this.boundFullscreenChange = () => {\r\n const isFs = !!document.fullscreenElement;\r\n this.store.setState({ isFullscreen: isFs });\r\n this.emit('resize');\r\n this.emit(isFs ? 'fullscreen' : 'fullscreen_exit');\r\n\r\n // Auto Orientation logic\r\n if (isFs && this.config.autoOrientation && screen.orientation && 'lock' in screen.orientation) {\r\n // Basic logic: if video width > height, lock landscape\r\n const isLandscape = this.video.videoWidth > this.video.videoHeight;\r\n const lockType = isLandscape ? 'landscape' : 'portrait';\r\n try {\r\n // @ts-ignore\r\n screen.orientation.lock(lockType).catch(() => { });\r\n } catch (e) { }\r\n } else if (!isFs && screen.orientation && 'unlock' in screen.orientation) {\r\n // @ts-ignore\r\n screen.orientation.unlock();\r\n }\r\n };\r\n\r\n // Apply initial state to video element\r\n this.video.volume = initialState.volume;\r\n this.video.muted = initialState.isMuted;\r\n this.video.playbackRate = initialState.playbackRate;\r\n this.video.loop = initialState.isLooping; // Apply loop state\r\n\r\n if (initialState.audioGain > 1) {\r\n this.audioEngine.setGain(initialState.audioGain);\r\n }\r\n // Apply AutoSize\r\n if (initialState.isAutoSized) {\r\n this.video.style.objectFit = 'cover';\r\n }\r\n\r\n this.initVideoListeners();\r\n this.initMediaSession();\r\n this.initCast();\r\n\r\n // Persistence Subscriber\r\n if (!config.disablePersistence) {\r\n this.store.subscribe((state) => {\r\n const settings = {\r\n volume: state.volume,\r\n isMuted: state.isMuted,\r\n playbackRate: state.playbackRate,\r\n subtitleSettings: state.subtitleSettings,\r\n iconSize: state.iconSize,\r\n themeColor: state.themeColor,\r\n theme: state.theme,\r\n isLive: state.isLive,\r\n isLooping: state.isLooping\r\n };\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\r\n });\r\n }\r\n }\r\n\r\n // --- Instance Properties ---\r\n\r\n get playing() { return !this.video.paused && !this.video.ended && this.video.readyState > 2; }\r\n\r\n get currentTime() { return this.video.currentTime; }\r\n set currentTime(val: number) { this.seek(val); }\r\n\r\n get duration() { return this.video.duration || 0; }\r\n\r\n get paused() { return this.video.paused; }\r\n\r\n get volume() { return this.video.volume; }\r\n set volume(val: number) { this.setVolume(val); }\r\n\r\n get muted() { return this.video.muted; }\r\n set muted(val: boolean) {\r\n this.video.muted = val;\r\n this.store.setState({ isMuted: val });\r\n }\r\n\r\n get playbackRate() { return this.video.playbackRate; }\r\n set playbackRate(val: number) { this.video.playbackRate = val; }\r\n\r\n get loop() { return this.video.loop; }\r\n set loop(val: boolean) {\r\n this.video.loop = val;\r\n this.store.setState({ isLooping: val });\r\n }\r\n\r\n // --- Instance Methods ---\r\n\r\n forward(seconds: number = 10) { this.skip(seconds); }\r\n backward(seconds: number = 10) { this.skip(-seconds); }\r\n\r\n // --- Event API ---\r\n\r\n on(event: string, callback: EventCallback) { return this.events.on(event, callback); }\r\n off(event: string, callback: EventCallback) { return this.events.off(event, callback); }\r\n emit(event: string, data?: any) { return this.events.emit(event, data); }\r\n\r\n private initVideoListeners() {\r\n const s = (partial: Partial<PlayerState>) => this.store.setState(partial);\r\n\r\n const events = [\r\n 'abort', 'canplay', 'canplaythrough', 'durationchange', 'emptied', 'ended', 'error',\r\n 'loadeddata', 'loadedmetadata', 'loadstart', 'pause', 'play', 'playing', 'progress',\r\n 'ratechange', 'seeked', 'seeking', 'stalled', 'suspend', 'timeupdate', 'volumechange', 'waiting'\r\n ];\r\n\r\n // Standard video event proxying\r\n events.forEach(event => {\r\n this.video.addEventListener(event, (e) => {\r\n // 1. Emit namespaced event (e.g. video:timeupdate)\r\n this.emit(`video:${event}`, e);\r\n\r\n // 2. Emit core events (e.g. play, pause)\r\n if (event === 'play') this.emit('play');\r\n if (event === 'pause') this.emit('pause');\r\n if (event === 'ended') this.emit('ended');\r\n if (event === 'error') this.emit('error', this.video.error);\r\n if (event === 'seeked') this.emit('seek');\r\n\r\n // 3. Update internal store for UI\r\n switch (event) {\r\n case 'play':\r\n s({ isPlaying: true });\r\n if ('mediaSession' in navigator) navigator.mediaSession.playbackState = 'playing';\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'pause':\r\n s({ isPlaying: false });\r\n if ('mediaSession' in navigator) navigator.mediaSession.playbackState = 'paused';\r\n break;\r\n case 'ended':\r\n s({ isPlaying: false });\r\n if ('mediaSession' in navigator) navigator.mediaSession.playbackState = 'paused';\r\n break;\r\n\r\n case 'waiting':\r\n s({ isBuffering: true });\r\n this.emit('loading', true);\r\n break;\r\n case 'playing':\r\n s({ isBuffering: false });\r\n this.emit('loading', false);\r\n break;\r\n case 'canplay':\r\n s({ isBuffering: false });\r\n this.emit('loading', false);\r\n break;\r\n\r\n case 'loadeddata':\r\n s({ isBuffering: false });\r\n this.retryCount = 0;\r\n this.removeNotification('retry');\r\n if (this.store.get().error) s({ error: null });\r\n break;\r\n case 'loadedmetadata':\r\n this.updateMediaSessionMetadata();\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'timeupdate':\r\n if (!this.video.seeking) s({ currentTime: this.video.currentTime });\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'seeked':\r\n s({ currentTime: this.video.currentTime });\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'durationchange':\r\n s({ duration: this.video.duration });\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'volumechange': s({ volume: this.video.volume, isMuted: this.video.muted }); break;\r\n case 'ratechange':\r\n s({ playbackRate: this.video.playbackRate });\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'error': this.handleError(); break;\r\n case 'progress': this.updateBuffer(); break;\r\n case 'enterpictureinpicture': s({ isPip: true }); break;\r\n case 'leavepictureinpicture': s({ isPip: false }); break;\r\n }\r\n });\r\n });\r\n\r\n // PiP events are not in the standard list above usually\r\n this.video.addEventListener('enterpictureinpicture', () => {\r\n s({ isPip: true });\r\n this.emit('pip', true);\r\n });\r\n this.video.addEventListener('leavepictureinpicture', () => {\r\n s({ isPip: false });\r\n this.emit('pip', false);\r\n });\r\n\r\n // Global fullscreen listener to catch Esc key or browser button\r\n document.addEventListener('fullscreenchange', this.boundFullscreenChange);\r\n\r\n this.video.textTracks.addEventListener('addtrack', this.updateSubtitles.bind(this));\r\n this.video.textTracks.addEventListener('removetrack', this.updateSubtitles.bind(this));\r\n }\r\n\r\n // --- Media Session API ---\r\n\r\n private initMediaSession() {\r\n if (!('mediaSession' in navigator)) return;\r\n\r\n const ms = navigator.mediaSession;\r\n\r\n ms.setActionHandler('play', () => this.play());\r\n ms.setActionHandler('pause', () => this.pause());\r\n ms.setActionHandler('seekbackward', (details) => this.skip(details.seekOffset ? -details.seekOffset : -10));\r\n ms.setActionHandler('seekforward', (details) => this.skip(details.seekOffset || 10));\r\n ms.setActionHandler('seekto', (details) => {\r\n if (details.seekTime !== undefined) this.seek(details.seekTime);\r\n });\r\n ms.setActionHandler('stop', () => {\r\n this.pause();\r\n this.seek(0);\r\n });\r\n // Playlist controls\r\n ms.setActionHandler('previoustrack', () => {\r\n const idx = this.store.get().currentSourceIndex;\r\n if (idx > 0) this.switchSource(idx - 1);\r\n });\r\n ms.setActionHandler('nexttrack', () => {\r\n const idx = this.store.get().currentSourceIndex;\r\n const total = this.store.get().sources.length;\r\n if (idx < total - 1) this.switchSource(idx + 1);\r\n });\r\n }\r\n\r\n private updateMediaSessionMetadata() {\r\n if (!('mediaSession' in navigator)) return;\r\n\r\n const title = this.currentSource?.name || this.currentSource?.url.split('/').pop() || 'Video';\r\n\r\n const artwork = [];\r\n\r\n // 1. Prioritize configured poster or source-specific poster\r\n if (this.config.poster) {\r\n artwork.push({ src: this.config.poster, sizes: '512x512', type: 'image/jpeg' });\r\n }\r\n\r\n // 2. Fallback to relative logo path.\r\n // This avoids using import.meta.env.BASE_URL which crashes in some environments.\r\n // The browser resolves this relative to the current document's base URL.\r\n artwork.push({ src: 'logo.png', sizes: '512x512', type: 'image/png' });\r\n\r\n navigator.mediaSession.metadata = new MediaMetadata({\r\n title: title,\r\n artist: 'StrataPlayer',\r\n artwork: artwork\r\n });\r\n }\r\n\r\n private updateMediaSessionPosition() {\r\n if (!('mediaSession' in navigator)) return;\r\n\r\n const duration = this.video.duration;\r\n const position = this.video.currentTime;\r\n const playbackRate = this.video.playbackRate;\r\n\r\n if (!isNaN(duration) && isFinite(duration) && !isNaN(position)) {\r\n try {\r\n navigator.mediaSession.setPositionState({\r\n duration: Math.max(0, duration),\r\n playbackRate,\r\n position: Math.max(0, Math.min(position, duration)) // Ensure within [0, duration]\r\n });\r\n } catch (e) {\r\n console.warn(\"MediaSession Position Error:\", e);\r\n }\r\n }\r\n }\r\n\r\n public triggerError(message: string, isFatal: boolean = false) {\r\n if (isFatal) {\r\n this.handleError(message);\r\n } else {\r\n this.notify({ type: 'warning', message: `Warning: ${message}`, duration: 5000 });\r\n }\r\n }\r\n\r\n private handleError(customMessage?: string) {\r\n const error = this.video.error;\r\n const message = customMessage || error?.message || (error ? `Code ${error.code}` : 'Unknown Error');\r\n\r\n this.removeNotification('retry');\r\n this.emit('video:error', error); // Emitting video:error separately\r\n\r\n if (this.retryCount < this.maxRetries) {\r\n this.retryCount++;\r\n const delay = Math.pow(2, this.retryCount - 1) * 1500;\r\n\r\n this.notify({\r\n id: 'retry',\r\n type: 'loading',\r\n message: `Error: ${message}. Retrying (${this.retryCount}/${this.maxRetries})...`,\r\n });\r\n\r\n console.warn(`[StrataPlayer] Error: ${message}. Retrying in ${delay}ms...`);\r\n\r\n if (this.retryTimer) clearTimeout(this.retryTimer);\r\n this.retryTimer = setTimeout(() => {\r\n if (this.currentSource) {\r\n this.load(this.currentSource, this.currentTracks, true); // True = isRetry\r\n\r\n const time = this.store.get().currentTime;\r\n if (time > 0) {\r\n const onCanPlay = () => {\r\n this.video.currentTime = time;\r\n this.video.removeEventListener('canplay', onCanPlay);\r\n };\r\n this.video.addEventListener('canplay', onCanPlay);\r\n }\r\n }\r\n }, delay);\r\n } else {\r\n // Final failure\r\n this.removeNotification('retry');\r\n const finalMsg = `Failed to play after ${this.maxRetries} attempts: ${message}`;\r\n this.store.setState({ error: finalMsg });\r\n this.emit('error', finalMsg);\r\n }\r\n }\r\n\r\n private updateBuffer() {\r\n const buffered: { start: number; end: number }[] = [];\r\n for (let i = 0; i < this.video.buffered.length; i++) {\r\n buffered.push({\r\n start: this.video.buffered.start(i),\r\n end: this.video.buffered.end(i)\r\n });\r\n }\r\n this.store.setState({ buffered });\r\n }\r\n\r\n private updateSubtitles() {\r\n setTimeout(() => {\r\n const tracks = Array.from(this.video.textTracks)\r\n .filter(t => t.kind === 'subtitles' || t.kind === 'captions')\r\n .map((track, index) => ({\r\n label: track.label || track.language || `Track ${index + 1}`,\r\n language: track.language,\r\n index: index\r\n }));\r\n this.store.setState({ subtitleTracks: tracks });\r\n\r\n // Restore persisted selection if applicable and tracks exist\r\n const state = this.store.get();\r\n if (state.currentSubtitle !== -1 && tracks.length > 0 && state.currentSubtitle < tracks.length) {\r\n this.setSubtitle(state.currentSubtitle);\r\n }\r\n }, 50);\r\n }\r\n\r\n // --- Utility ---\r\n\r\n async fetchWithRetry(url: string, retries = 3, timeout?: number): Promise<Response> {\r\n const effectiveTimeout = timeout ?? this.config.fetchTimeout ?? 30000;\r\n for (let i = 0; i < retries; i++) {\r\n const controller = new AbortController();\r\n const id = setTimeout(() => controller.abort(), effectiveTimeout);\r\n try {\r\n const res = await fetch(url, { signal: controller.signal });\r\n clearTimeout(id);\r\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\r\n return res;\r\n } catch (e: any) {\r\n clearTimeout(id);\r\n if (i === retries - 1) throw e;\r\n // If it's an abort error, warn\r\n if (e.name === 'AbortError') console.warn(`Fetch timeout (${effectiveTimeout}ms) for ${url}`);\r\n await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i)));\r\n }\r\n }\r\n throw new Error('Fetch failed');\r\n }\r\n\r\n // --- Core Methods ---\r\n\r\n attach(container: HTMLElement) {\r\n this.container = container;\r\n if (!this.container.contains(this.video)) {\r\n this.video.style.width = '100%';\r\n this.video.style.height = '100%';\r\n this.video.style.objectFit = this.store.get().isAutoSized ? 'cover' : 'contain';\r\n this.video.style.backgroundColor = 'black';\r\n this.container.appendChild(this.video);\r\n }\r\n\r\n // Setup Resize Observer\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n this.emit('resize', { width: entry.contentRect.width, height: entry.contentRect.height });\r\n }\r\n });\r\n this.resizeObserver.observe(this.container);\r\n\r\n // Emit ready event\r\n this.emit('ready');\r\n }\r\n\r\n use(plugin: IPlugin) {\r\n if (this.plugins.has(plugin.name)) return;\r\n plugin.init(this);\r\n this.plugins.set(plugin.name, plugin);\r\n }\r\n\r\n setSources(sources: PlayerSource[], tracks: TextTrackConfig[] = []) {\r\n this.store.setState({ sources });\r\n this.currentTracks = tracks;\r\n if (sources.length > 0) {\r\n this.load(sources[0], tracks);\r\n }\r\n }\r\n\r\n switchSource(index: number) {\r\n const sources = this.store.get().sources;\r\n if (index >= 0 && index < sources.length) {\r\n const time = this.video.currentTime;\r\n const wasPlaying = !this.video.paused;\r\n\r\n this.load(sources[index], this.currentTracks);\r\n\r\n const onCanPlay = () => {\r\n this.video.currentTime = time;\r\n if (wasPlaying) this.video.play();\r\n this.video.removeEventListener('canplay', onCanPlay);\r\n };\r\n this.video.addEventListener('canplay', onCanPlay);\r\n }\r\n }\r\n\r\n load(source: PlayerSource | string, tracks: TextTrackConfig[] = [], isRetry = false) {\r\n if (this.retryTimer) clearTimeout(this.retryTimer);\r\n\r\n // Normalize string input to PlayerSource\r\n const srcObj: PlayerSource = typeof source === 'string' ? { url: source, type: 'auto' } : source;\r\n\r\n if (!isRetry) {\r\n this.retryCount = 0;\r\n this.store.setState({ error: null });\r\n this.removeNotification('retry');\r\n }\r\n\r\n this.currentSrc = srcObj.url;\r\n this.currentSource = srcObj;\r\n this.currentTracks = tracks;\r\n\r\n // Update index state if part of playlist\r\n const allSources = this.store.get().sources;\r\n const index = allSources.findIndex(s => s.url === srcObj.url);\r\n this.store.setState({\r\n isBuffering: true,\r\n qualityLevels: [],\r\n currentQuality: -1, // Reset quality to Auto on source switch\r\n audioTracks: [],\r\n currentAudioTrack: -1, // Reset audio track\r\n // subtitleTracks and currentSubtitle are purposely preserved\r\n currentSourceIndex: index\r\n });\r\n\r\n // Update Metadata early\r\n this.updateMediaSessionMetadata();\r\n\r\n // Determine type if auto\r\n let type = srcObj.type || 'auto';\r\n if (type === 'auto') {\r\n if (srcObj.url.includes('.m3u8')) type = 'hls';\r\n else if (srcObj.url.includes('.mpd')) type = 'dash';\r\n else if (srcObj.url.includes('.flv') || srcObj.url.includes('.ts')) type = 'mpegts';\r\n else if (srcObj.url.startsWith('magnet:') || srcObj.url.includes('.torrent')) type = 'webtorrent';\r\n else type = 'mp4';\r\n }\r\n\r\n // Emit load event with source details so plugins can decide to act\r\n this.events.emit('load', { url: srcObj.url, type });\r\n\r\n const oldTracks = this.video.getElementsByTagName('track');\r\n while (oldTracks.length > 0) {\r\n oldTracks[0].remove();\r\n }\r\n\r\n if (tracks.length > 0) {\r\n tracks.forEach(t => {\r\n this.fetchWithRetry(t.src).then(() => {\r\n this.addTextTrackInternal(t.src, t.label, t.srcLang, t.default);\r\n }).catch(e => {\r\n this.notify({ type: 'warning', message: `Failed to load subtitle: ${t.label}`, duration: 4000 });\r\n });\r\n });\r\n }\r\n\r\n // If it's standard MP4/WebM, set src directly. Plugins handle HLS/Dash/Mpegts/WebTorrent.\r\n if (type === 'mp4' || type === 'webm' || type === 'ogg') {\r\n this.video.src = srcObj.url;\r\n }\r\n }\r\n\r\n // Wrapper for external subtitle API\r\n public loadSubtitle(url: string, label: string = 'Subtitle') {\r\n this.addTextTrackInternal(url, label, undefined, true);\r\n }\r\n\r\n public addTextTrack(file: File, label: string) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n if (!e.target?.result) return;\r\n let content = e.target.result as string;\r\n if (file.name.toLowerCase().endsWith('.srt') || !content.trim().startsWith('WEBVTT')) {\r\n content = content.replace(/(\\d{2}:\\d{2}:\\d{2}),(\\d{3})/g, '$1.$2');\r\n if (!content.trim().startsWith('WEBVTT')) {\r\n content = 'WEBVTT\\n\\n' + content;\r\n }\r\n }\r\n const blob = new Blob([content], { type: 'text/vtt' });\r\n const url = URL.createObjectURL(blob);\r\n this.addTextTrackInternal(url, label, 'user', true);\r\n\r\n setTimeout(() => {\r\n const tracks = this.store.get().subtitleTracks;\r\n const newTrackIndex = tracks.findIndex(t => t.label === label);\r\n if (newTrackIndex !== -1) {\r\n this.setSubtitle(newTrackIndex);\r\n this.notify({ type: 'success', message: 'Subtitle uploaded', duration: 3000 });\r\n }\r\n }, 200);\r\n };\r\n reader.onerror = () => {\r\n this.notify({ type: 'error', message: 'Failed to read file', duration: 3000 });\r\n };\r\n reader.readAsText(file);\r\n }\r\n\r\n private addTextTrackInternal(src: string, label: string, lang: string = '', isDefault: boolean = false) {\r\n const track = document.createElement('track');\r\n track.kind = 'subtitles';\r\n track.label = label;\r\n track.src = src;\r\n track.srclang = lang;\r\n if (isDefault) track.default = true;\r\n this.video.appendChild(track);\r\n this.updateSubtitles();\r\n }\r\n\r\n play() { return this.video.play(); }\r\n pause() { return this.video.pause(); }\r\n togglePlay() { this.video.paused ? this.play() : this.pause(); }\r\n\r\n seek(time: number) {\r\n if (isNaN(time)) return;\r\n const t = Math.max(0, Math.min(time, this.video.duration));\r\n this.store.setState({ currentTime: t });\r\n this.video.currentTime = t;\r\n }\r\n\r\n skip(seconds: number) {\r\n this.seek(this.video.currentTime + seconds);\r\n }\r\n\r\n setVolume(vol: number) {\r\n const safeVol = Math.max(0, Math.min(vol, 1));\r\n this.video.volume = safeVol;\r\n if (safeVol > 0 && this.video.muted) this.video.muted = false;\r\n if (safeVol === 0) this.video.muted = true;\r\n }\r\n\r\n toggleMute() {\r\n this.video.muted = !this.video.muted;\r\n }\r\n\r\n setAudioGain(gain: number) {\r\n this.store.setState({ audioGain: gain });\r\n this.audioEngine.setGain(gain);\r\n }\r\n\r\n setQuality(index: number) {\r\n this.store.setState({ currentQuality: index });\r\n this.events.emit('quality-request', index);\r\n }\r\n\r\n setAudioTrack(index: number) {\r\n this.store.setState({ currentAudioTrack: index });\r\n this.events.emit('audio-track-request', index);\r\n }\r\n\r\n setControlsVisible(visible: boolean) {\r\n if (this.store.get().controlsVisible !== visible) {\r\n this.store.setState({ controlsVisible: visible });\r\n this.emit('control', visible);\r\n }\r\n }\r\n\r\n async toggleFullscreen() {\r\n if (!this.container) return;\r\n try {\r\n if (!document.fullscreenElement) {\r\n await this.container.requestFullscreen();\r\n // Orientation lock handled in boundFullscreenChange\r\n } else {\r\n await document.exitFullscreen();\r\n }\r\n } catch (err) {\r\n console.error('Fullscreen toggle failed', err);\r\n }\r\n }\r\n\r\n togglePip() {\r\n if (document.pictureInPictureElement) {\r\n document.exitPictureInPicture();\r\n } else if (this.video !== document.pictureInPictureElement && (this.video as any).requestPictureInPicture) {\r\n (this.video as any).requestPictureInPicture();\r\n }\r\n }\r\n\r\n screenshot() {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = this.video.videoWidth;\r\n canvas.height = this.video.videoHeight;\r\n const ctx = canvas.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(this.video, 0, 0, canvas.width, canvas.height);\r\n try {\r\n const url = canvas.toDataURL('image/png');\r\n const a = document.createElement('a');\r\n a.download = `screenshot-${new Date().toISOString()}.png`;\r\n a.href = url;\r\n a.click();\r\n this.notify({ type: 'success', message: 'Screenshot saved', duration: 2000 });\r\n } catch (e) {\r\n this.notify({ type: 'error', message: 'Failed to take screenshot', duration: 3000 });\r\n }\r\n }\r\n }\r\n\r\n toggleLock() {\r\n this.store.setState((prev) => ({ isLocked: !prev.isLocked }));\r\n }\r\n\r\n toggleLoop() {\r\n this.video.loop = !this.video.loop;\r\n this.store.setState({ isLooping: this.video.loop });\r\n this.notify({ type: 'info', message: `Loop: ${this.video.loop ? 'On' : 'Off'}`, duration: 1500 });\r\n }\r\n\r\n setFlip(direction: 'horizontal' | 'vertical') {\r\n const current = this.store.get().flipState;\r\n const newState = {\r\n ...current,\r\n [direction]: !current[direction]\r\n };\r\n this.store.setState({ flipState: newState });\r\n\r\n const scaleX = newState.horizontal ? -1 : 1;\r\n const scaleY = newState.vertical ? -1 : 1;\r\n this.video.style.transform = `scale(${scaleX}, ${scaleY})`;\r\n }\r\n\r\n setAspectRatio(ratio: string) {\r\n // ratio: 'default' | '16:9' | '4:3'\r\n this.store.setState({ aspectRatio: ratio });\r\n\r\n if (ratio === 'default') {\r\n this.video.style.objectFit = this.store.get().isAutoSized ? 'cover' : 'contain';\r\n // Reset explicit sizing\r\n this.video.style.width = '100%';\r\n this.video.style.height = '100%';\r\n return;\r\n }\r\n\r\n this.video.style.objectFit = 'contain';\r\n this.notify({ type: 'info', message: `Aspect Ratio: ${ratio} (CSS support limited)`, duration: 2000 });\r\n }\r\n\r\n private initCast() {\r\n const w = window as any;\r\n const initializeCastApi = () => {\r\n if (this.castInitialized) return;\r\n try {\r\n if (w.cast && w.cast.framework && w.chrome && w.chrome.cast) {\r\n const CastContext = w.cast.framework.CastContext;\r\n CastContext.getInstance().setOptions({\r\n receiverApplicationId: w.chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,\r\n autoJoinPolicy: w.chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED\r\n });\r\n this.castInitialized = true;\r\n }\r\n } catch (e) {\r\n console.warn('Cast Init Error or already initialized', e);\r\n }\r\n };\r\n\r\n if (w.cast && w.cast.framework) {\r\n initializeCastApi();\r\n } else {\r\n w.__onGCastApiAvailable = (isAvailable: boolean) => {\r\n if (isAvailable) initializeCastApi();\r\n };\r\n }\r\n }\r\n\r\n requestCast() {\r\n const w = window as any;\r\n if (w.cast && w.cast.framework) {\r\n try {\r\n if (!this.castInitialized) this.initCast();\r\n w.cast.framework.CastContext.getInstance().requestSession()\r\n .then(() => {\r\n this.loadMediaToCast();\r\n })\r\n .catch((e: any) => {\r\n if (e !== 'cancel') this.notify({ type: 'error', message: 'Cast failed: ' + e, duration: 3000 });\r\n });\r\n } catch (e) {\r\n this.notify({ type: 'warning', message: 'Cast not available yet', duration: 3000 });\r\n }\r\n } else {\r\n this.notify({ type: 'warning', message: 'Cast API not loaded', duration: 3000 });\r\n }\r\n }\r\n\r\n private loadMediaToCast() {\r\n const w = window as any;\r\n try {\r\n const castSession = w.cast.framework.CastContext.getInstance().getCurrentSession();\r\n if (!castSession) return;\r\n const mediaInfo = new w.chrome.cast.media.MediaInfo(this.currentSrc, this.currentSrc.includes('.m3u8') ? 'application/x-mpegurl' : 'video/mp4');\r\n const request = new w.chrome.cast.media.LoadRequest(mediaInfo);\r\n castSession.loadMedia(request).then(() => {\r\n this.notify({ type: 'success', message: 'Casting...', duration: 3000 });\r\n }).catch((e: any) => console.error('Cast load error', e));\r\n } catch (e) {\r\n console.error(\"Failed to load media into Cast session\", e);\r\n }\r\n }\r\n\r\n private handleCueChange() {\r\n const state = this.store.get();\r\n if (state.currentSubtitle === -1) {\r\n this.store.setState({ activeCues: [] });\r\n return;\r\n }\r\n\r\n // Find active track\r\n const tracks = Array.from(this.video.textTracks).filter(t => t.kind === 'subtitles' || t.kind === 'captions');\r\n const track = tracks[state.currentSubtitle];\r\n\r\n if (track && track.activeCues) {\r\n const cues = Array.from(track.activeCues).map((c: any) => c.text);\r\n this.store.setState({ activeCues: cues });\r\n } else {\r\n this.store.setState({ activeCues: [] });\r\n }\r\n }\r\n\r\n setSubtitle(index: number) {\r\n // Remove listeners from old tracks\r\n Array.from(this.video.textTracks).forEach(t => {\r\n t.removeEventListener('cuechange', this.boundCueChange);\r\n t.mode = 'hidden'; // Reset to hidden before applying new state\r\n });\r\n\r\n this.store.setState({ currentSubtitle: index, subtitleOffset: 0, activeCues: [] });\r\n\r\n if (index !== -1) {\r\n // Find active track in the filtered list logic\r\n const tracks = Array.from(this.video.textTracks).filter(t => t.kind === 'subtitles' || t.kind === 'captions');\r\n const track = tracks[index];\r\n if (track) {\r\n const settings = this.store.get().subtitleSettings;\r\n // If using Native, mode = showing. If custom, mode = hidden (but not disabled, so cues update)\r\n track.mode = settings.useNative ? 'showing' : 'hidden';\r\n track.addEventListener('cuechange', this.boundCueChange);\r\n\r\n // Initial trigger\r\n this.handleCueChange();\r\n }\r\n }\r\n }\r\n\r\n updateSubtitleSettings(settings: Partial<SubtitleSettings>) {\r\n const current = this.store.get().subtitleSettings;\r\n const newSettings = { ...current, ...settings };\r\n this.store.setState({ subtitleSettings: newSettings });\r\n\r\n // If switching native/custom, re-apply track mode\r\n if (settings.useNative !== undefined) {\r\n this.setSubtitle(this.store.get().currentSubtitle);\r\n }\r\n }\r\n\r\n resetSubtitleSettings() {\r\n this.store.setState({ subtitleSettings: DEFAULT_SUBTITLE_SETTINGS });\r\n this.setSubtitle(this.store.get().currentSubtitle); // Re-apply modes\r\n }\r\n\r\n setSubtitleOffset(offset: number) {\r\n const currentOffset = this.store.get().subtitleOffset;\r\n const delta = offset - currentOffset;\r\n\r\n if (Math.abs(delta) < 0.001) return;\r\n\r\n Array.from(this.video.textTracks).forEach((track) => {\r\n // If custom (hidden) or native (showing), we adjust cues\r\n if ((track.mode === 'showing' || track.mode === 'hidden') && track.cues) {\r\n Array.from(track.cues).forEach((cue: any) => {\r\n cue.startTime += delta;\r\n cue.endTime += delta;\r\n });\r\n }\r\n });\r\n\r\n this.store.setState({ subtitleOffset: offset });\r\n this.notify({ type: 'info', message: `Subtitle Offset: ${offset > 0 ? '+' : ''}${offset.toFixed(1)}s`, duration: 1500 });\r\n }\r\n\r\n async download() { /* same as before */\r\n if (!this.video.src) return;\r\n const src = this.video.src;\r\n if (src.includes('blob:') || src.includes('.m3u8')) {\r\n this.notify({ type: 'warning', message: 'Stream download not supported in browser.', duration: 4000 });\r\n return;\r\n }\r\n const notifId = this.notify({ type: 'loading', message: 'Preparing download...', progress: 0 });\r\n try {\r\n const response = await this.fetchWithRetry(src);\r\n if (!response.body) throw new Error('No body');\r\n const reader = response.body.getReader();\r\n const contentLength = response.headers.get('Content-Length');\r\n const total = contentLength ? parseInt(contentLength, 10) : 0;\r\n let loaded = 0;\r\n const chunks = [];\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n chunks.push(value);\r\n loaded += value.length;\r\n if (total) {\r\n const percent = Math.round((loaded / total) * 100);\r\n this.notify({ id: notifId, type: 'loading', message: `Downloading... ${percent}%`, progress: percent });\r\n }\r\n }\r\n const blob = new Blob(chunks);\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.style.display = 'none';\r\n a.href = url;\r\n a.download = src.split('/').pop()?.split('?')[0] || 'video.mp4';\r\n document.body.appendChild(a);\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n document.body.removeChild(a);\r\n this.notify({ id: notifId, type: 'success', message: 'Saved!', duration: 3000 });\r\n } catch (e: any) {\r\n this.notify({ id: notifId, type: 'error', message: 'Download failed.', duration: 4000 });\r\n window.open(src, '_blank');\r\n }\r\n }\r\n\r\n notify(n: Omit<Notification, 'id'> & { id?: string }) {\r\n const id = n.id || Math.random().toString(36).substr(2, 9);\r\n const newNotification: Notification = { ...n, id };\r\n this.store.setState({ notifications: [newNotification] });\r\n if (n.duration) setTimeout(() => this.removeNotification(id), n.duration);\r\n return id;\r\n }\r\n\r\n removeNotification(id: string) {\r\n const current = this.store.get().notifications;\r\n this.store.setState({ notifications: current.filter(n => n.id !== id) });\r\n }\r\n\r\n setAppearance(settings: { iconSize?: 'small' | 'medium' | 'large', themeColor?: string, theme?: PlayerTheme }) {\r\n this.store.setState(prev => ({\r\n ...prev,\r\n ...settings\r\n }));\r\n }\r\n\r\n destroy() {\r\n if (this.retryTimer) clearTimeout(this.retryTimer);\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n }\r\n document.removeEventListener('fullscreenchange', this.boundFullscreenChange);\r\n this.video.pause();\r\n this.video.src = '';\r\n const oldTracks = this.video.getElementsByTagName('track');\r\n while (oldTracks.length > 0) oldTracks[0].remove();\r\n this.emit('destroy');\r\n this.events.destroy();\r\n this.store.destroy();\r\n this.plugins.forEach(p => p.destroy && p.destroy());\r\n this.plugins.clear();\r\n this.video.remove();\r\n this.audioEngine.destroy();\r\n }\r\n}\r\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, timeout = 20000): Promise<string> => {\r\n for (let i = 0; i < retries; i++) {\r\n const controller = new AbortController();\r\n const id = setTimeout(() => controller.abort(), timeout);\r\n try {\r\n const res = await fetch(url, { signal: controller.signal });\r\n clearTimeout(id);\r\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\r\n return await res.text();\r\n } catch (e: any) {\r\n clearTimeout(id);\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, timeout: number = 20000): Promise<ThumbnailCue[]> => {\r\n try {\r\n const text = await fetchVttWithRetry(url, 3, timeout);\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 * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props\n })\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ArrowLeft = createLucideIcon(\"ArrowLeft\", [\n [\"path\", { d: \"m12 19-7-7 7-7\", key: \"1l729n\" }],\n [\"path\", { d: \"M19 12H5\", key: \"x3x0zl\" }]\n]);\n\nexport { ArrowLeft as default };\n//# sourceMappingURL=arrow-left.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Bold = createLucideIcon(\"Bold\", [\n [\n \"path\",\n { d: \"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\", key: \"mg9rjx\" }\n ]\n]);\n\nexport { Bold as default };\n//# sourceMappingURL=bold.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Camera = createLucideIcon(\"Camera\", [\n [\n \"path\",\n {\n d: \"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\",\n key: \"1tc9qg\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"3\", key: \"1vg3eu\" }]\n]);\n\nexport { Camera as default };\n//# sourceMappingURL=camera.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Captions = createLucideIcon(\"Captions\", [\n [\"rect\", { width: \"18\", height: \"14\", x: \"3\", y: \"5\", rx: \"2\", ry: \"2\", key: \"12ruh7\" }],\n [\"path\", { d: \"M7 15h4M15 15h2M7 11h2M13 11h4\", key: \"1ueiar\" }]\n]);\n\nexport { Captions as default };\n//# sourceMappingURL=captions.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CaseUpper = createLucideIcon(\"CaseUpper\", [\n [\"path\", { d: \"m3 15 4-8 4 8\", key: \"1vwr6u\" }],\n [\"path\", { d: \"M4 13h6\", key: \"1r9ots\" }],\n [\"path\", { d: \"M15 11h4.5a2 2 0 0 1 0 4H15V7h4a2 2 0 0 1 0 4\", key: \"1sqfas\" }]\n]);\n\nexport { CaseUpper as default };\n//# sourceMappingURL=case-upper.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Cast = createLucideIcon(\"Cast\", [\n [\"path\", { d: \"M2 8V6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6\", key: \"3zrzxg\" }],\n [\"path\", { d: \"M2 12a9 9 0 0 1 8 8\", key: \"g6cvee\" }],\n [\"path\", { d: \"M2 16a5 5 0 0 1 4 4\", key: \"1y1dii\" }],\n [\"line\", { x1: \"2\", x2: \"2.01\", y1: \"20\", y2: \"20\", key: \"xu2jvo\" }]\n]);\n\nexport { Cast as default };\n//# sourceMappingURL=cast.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Check = createLucideIcon(\"Check\", [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]]);\n\nexport { Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Clock = createLucideIcon(\"Clock\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16 14\", key: \"68esgv\" }]\n]);\n\nexport { Clock as default };\n//# sourceMappingURL=clock.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Download = createLucideIcon(\"Download\", [\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"polyline\", { points: \"7 10 12 15 17 10\", key: \"2ggqvy\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"15\", y2: \"3\", key: \"1vk2je\" }]\n]);\n\nexport { Download as default };\n//# sourceMappingURL=download.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Droplet = createLucideIcon(\"Droplet\", [\n [\n \"path\",\n {\n d: \"M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z\",\n key: \"c7niix\"\n }\n ]\n]);\n\nexport { Droplet as default };\n//# sourceMappingURL=droplet.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Eye = createLucideIcon(\"Eye\", [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Eye as default };\n//# sourceMappingURL=eye.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Info = createLucideIcon(\"Info\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n]);\n\nexport { Info as default };\n//# sourceMappingURL=info.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LoaderCircle = createLucideIcon(\"LoaderCircle\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]\n]);\n\nexport { LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LockOpen = createLucideIcon(\"LockOpen\", [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 9.9-1\", key: \"1mm8w8\" }]\n]);\n\nexport { LockOpen as default };\n//# sourceMappingURL=lock-open.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Lock = createLucideIcon(\"Lock\", [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n]);\n\nexport { Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Maximize = createLucideIcon(\"Maximize\", [\n [\"path\", { d: \"M8 3H5a2 2 0 0 0-2 2v3\", key: \"1dcmit\" }],\n [\"path\", { d: \"M21 8V5a2 2 0 0 0-2-2h-3\", key: \"1e4gt3\" }],\n [\"path\", { d: \"M3 16v3a2 2 0 0 0 2 2h3\", key: \"wsl5sc\" }],\n [\"path\", { d: \"M16 21h3a2 2 0 0 0 2-2v-3\", key: \"18trek\" }]\n]);\n\nexport { Maximize as default };\n//# sourceMappingURL=maximize.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Minimize = createLucideIcon(\"Minimize\", [\n [\"path\", { d: \"M8 3v3a2 2 0 0 1-2 2H3\", key: \"hohbtr\" }],\n [\"path\", { d: \"M21 8h-3a2 2 0 0 1-2-2V3\", key: \"5jw1f3\" }],\n [\"path\", { d: \"M3 16h3a2 2 0 0 1 2 2v3\", key: \"198tvr\" }],\n [\"path\", { d: \"M16 21v-3a2 2 0 0 1 2-2h3\", key: \"ph8mxp\" }]\n]);\n\nexport { Minimize as default };\n//# sourceMappingURL=minimize.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Minus = createLucideIcon(\"Minus\", [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]]);\n\nexport { Minus as default };\n//# sourceMappingURL=minus.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Monitor = createLucideIcon(\"Monitor\", [\n [\"rect\", { width: \"20\", height: \"14\", x: \"2\", y: \"3\", rx: \"2\", key: \"48i651\" }],\n [\"line\", { x1: \"8\", x2: \"16\", y1: \"21\", y2: \"21\", key: \"1svkeh\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"17\", y2: \"21\", key: \"vw1qmm\" }]\n]);\n\nexport { Monitor as default };\n//# sourceMappingURL=monitor.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst MoveVertical = createLucideIcon(\"MoveVertical\", [\n [\"path\", { d: \"M12 2v20\", key: \"t6zp3m\" }],\n [\"path\", { d: \"m8 18 4 4 4-4\", key: \"bh5tu3\" }],\n [\"path\", { d: \"m8 6 4-4 4 4\", key: \"ybng9g\" }]\n]);\n\nexport { MoveVertical as default };\n//# sourceMappingURL=move-vertical.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Palette = createLucideIcon(\"Palette\", [\n [\"circle\", { cx: \"13.5\", cy: \"6.5\", r: \".5\", fill: \"currentColor\", key: \"1okk4w\" }],\n [\"circle\", { cx: \"17.5\", cy: \"10.5\", r: \".5\", fill: \"currentColor\", key: \"f64h9f\" }],\n [\"circle\", { cx: \"8.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"fotxhn\" }],\n [\"circle\", { cx: \"6.5\", cy: \"12.5\", r: \".5\", fill: \"currentColor\", key: \"qy21gx\" }],\n [\n \"path\",\n {\n d: \"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z\",\n key: \"12rzf8\"\n }\n ]\n]);\n\nexport { Palette as default };\n//# sourceMappingURL=palette.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pause = createLucideIcon(\"Pause\", [\n [\"rect\", { x: \"14\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"zuxfzm\" }],\n [\"rect\", { x: \"6\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"1okwgv\" }]\n]);\n\nexport { Pause as default };\n//# sourceMappingURL=pause.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst PictureInPicture = createLucideIcon(\"PictureInPicture\", [\n [\n \"path\",\n {\n d: \"M8 4.5v5H3m-1-6 6 6m13 0v-3c0-1.16-.84-2-2-2h-7m-9 9v2c0 1.05.95 2 2 2h3\",\n key: \"bcd8fb\"\n }\n ],\n [\"rect\", { width: \"10\", height: \"7\", x: \"12\", y: \"13.5\", ry: \"2\", key: \"136fx3\" }]\n]);\n\nexport { PictureInPicture as default };\n//# sourceMappingURL=picture-in-picture.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Play = createLucideIcon(\"Play\", [\n [\"polygon\", { points: \"6 3 20 12 6 21 6 3\", key: \"1oa8hb\" }]\n]);\n\nexport { Play as default };\n//# sourceMappingURL=play.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Plus = createLucideIcon(\"Plus\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n]);\n\nexport { Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RefreshCcw = createLucideIcon(\"RefreshCcw\", [\n [\"path\", { d: \"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"14sxne\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }],\n [\"path\", { d: \"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\", key: \"1hlbsb\" }],\n [\"path\", { d: \"M16 16h5v5\", key: \"ccwih5\" }]\n]);\n\nexport { RefreshCcw as default };\n//# sourceMappingURL=refresh-ccw.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCcw = createLucideIcon(\"RotateCcw\", [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n]);\n\nexport { RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCw = createLucideIcon(\"RotateCw\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\", key: \"1p45f6\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }]\n]);\n\nexport { RotateCw as default };\n//# sourceMappingURL=rotate-cw.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Settings = createLucideIcon(\"Settings\", [\n [\n \"path\",\n {\n d: \"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\",\n key: \"1qme2f\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Settings as default };\n//# sourceMappingURL=settings.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst SlidersHorizontal = createLucideIcon(\"SlidersHorizontal\", [\n [\"line\", { x1: \"21\", x2: \"14\", y1: \"4\", y2: \"4\", key: \"obuewd\" }],\n [\"line\", { x1: \"10\", x2: \"3\", y1: \"4\", y2: \"4\", key: \"1q6298\" }],\n [\"line\", { x1: \"21\", x2: \"12\", y1: \"12\", y2: \"12\", key: \"1iu8h1\" }],\n [\"line\", { x1: \"8\", x2: \"3\", y1: \"12\", y2: \"12\", key: \"ntss68\" }],\n [\"line\", { x1: \"21\", x2: \"16\", y1: \"20\", y2: \"20\", key: \"14d8ph\" }],\n [\"line\", { x1: \"12\", x2: \"3\", y1: \"20\", y2: \"20\", key: \"m0wm8r\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"2\", y2: \"6\", key: \"14e1ph\" }],\n [\"line\", { x1: \"8\", x2: \"8\", y1: \"10\", y2: \"14\", key: \"1i6ji0\" }],\n [\"line\", { x1: \"16\", x2: \"16\", y1: \"18\", y2: \"22\", key: \"1lctlv\" }]\n]);\n\nexport { SlidersHorizontal as default };\n//# sourceMappingURL=sliders-horizontal.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Type = createLucideIcon(\"Type\", [\n [\"polyline\", { points: \"4 7 4 4 20 4 20 7\", key: \"1nosan\" }],\n [\"line\", { x1: \"9\", x2: \"15\", y1: \"20\", y2: \"20\", key: \"swin9y\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"4\", y2: \"20\", key: \"1tx1rr\" }]\n]);\n\nexport { Type as default };\n//# sourceMappingURL=type.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Upload = createLucideIcon(\"Upload\", [\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"polyline\", { points: \"17 8 12 3 7 8\", key: \"t8dd8p\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"3\", y2: \"15\", key: \"widbto\" }]\n]);\n\nexport { Upload as default };\n//# sourceMappingURL=upload.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Users = createLucideIcon(\"Users\", [\n [\"path\", { d: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\", key: \"1yyitq\" }],\n [\"circle\", { cx: \"9\", cy: \"7\", r: \"4\", key: \"nufk8\" }],\n [\"path\", { d: \"M22 21v-2a4 4 0 0 0-3-3.87\", key: \"kshegd\" }],\n [\"path\", { d: \"M16 3.13a4 4 0 0 1 0 7.75\", key: \"1da9ce\" }]\n]);\n\nexport { Users as default };\n//# sourceMappingURL=users.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Volume1 = createLucideIcon(\"Volume1\", [\n [\n \"path\",\n {\n d: \"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\",\n key: \"uqj9uw\"\n }\n ],\n [\"path\", { d: \"M16 9a5 5 0 0 1 0 6\", key: \"1q6k2b\" }]\n]);\n\nexport { Volume1 as default };\n//# sourceMappingURL=volume-1.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Volume2 = createLucideIcon(\"Volume2\", [\n [\n \"path\",\n {\n d: \"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\",\n key: \"uqj9uw\"\n }\n ],\n [\"path\", { d: \"M16 9a5 5 0 0 1 0 6\", key: \"1q6k2b\" }],\n [\"path\", { d: \"M19.364 18.364a9 9 0 0 0 0-12.728\", key: \"ijwkga\" }]\n]);\n\nexport { Volume2 as default };\n//# sourceMappingURL=volume-2.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst VolumeX = createLucideIcon(\"VolumeX\", [\n [\n \"path\",\n {\n d: \"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\",\n key: \"uqj9uw\"\n }\n ],\n [\"line\", { x1: \"22\", x2: \"16\", y1: \"9\", y2: \"15\", key: \"1ewh16\" }],\n [\"line\", { x1: \"16\", x2: \"22\", y1: \"9\", y2: \"15\", key: \"5ykzw1\" }]\n]);\n\nexport { VolumeX as default };\n//# sourceMappingURL=volume-x.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Zap = createLucideIcon(\"Zap\", [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n]);\n\nexport { Zap as default };\n//# sourceMappingURL=zap.js.map\n","\r\n// Re-export icons from lucide-react for consistency\r\nimport {\r\n Play,\r\n Pause,\r\n Volume2,\r\n Volume1,\r\n VolumeX,\r\n Maximize,\r\n Minimize,\r\n Settings,\r\n Check,\r\n PictureInPicture,\r\n Subtitles,\r\n Download,\r\n ArrowLeft,\r\n Upload,\r\n Loader2,\r\n RotateCcw,\r\n RotateCw,\r\n Cast,\r\n Users,\r\n Clock,\r\n Minus,\r\n Plus,\r\n SlidersHorizontal,\r\n Type,\r\n Palette,\r\n Eye,\r\n MoveVertical,\r\n RefreshCcw,\r\n Bold,\r\n CaseUpper,\r\n Droplet,\r\n Camera,\r\n Lock,\r\n Unlock,\r\n Monitor,\r\n Zap,\r\n Ratio,\r\n Expand,\r\n X,\r\n Info,\r\n Copy,\r\n Menu,\r\n ChevronRight\r\n} from 'lucide-react';\r\n\r\nexport const PlayIcon = Play;\r\nexport const PauseIcon = Pause;\r\nexport const VolumeHighIcon = Volume2;\r\nexport const VolumeLowIcon = Volume1;\r\nexport const VolumeMuteIcon = VolumeX;\r\nexport const MaximizeIcon = Maximize;\r\nexport const MinimizeIcon = Minimize;\r\nexport const SettingsIcon = Settings;\r\nexport const CheckIcon = Check;\r\nexport const PipIcon = PictureInPicture;\r\nexport const SubtitleIcon = Subtitles;\r\nexport const DownloadIcon = Download;\r\nexport const UploadIcon = Upload;\r\nexport const ArrowLeftIcon = ArrowLeft;\r\nexport const LoaderIcon = Loader2;\r\nexport const CastIcon = Cast;\r\nexport const UsersIcon = Users;\r\nexport const ClockIcon = Clock;\r\nexport const MinusIcon = Minus;\r\nexport const PlusIcon = Plus;\r\nexport const CustomizeIcon = SlidersHorizontal;\r\nexport const TypeIcon = Type;\r\nexport const PaletteIcon = Palette;\r\nexport const EyeIcon = Eye;\r\nexport const MoveVerticalIcon = MoveVertical;\r\nexport const ResetIcon = RefreshCcw;\r\nexport const BoldIcon = Bold;\r\nexport const CaseUpperIcon = CaseUpper;\r\nexport const BlurIcon = Droplet;\r\nexport const CameraIcon = Camera;\r\nexport const LockIcon = Lock;\r\nexport const UnlockIcon = Unlock;\r\nexport const WebFullscreenIcon = Monitor;\r\nexport const FastForwardIcon = Zap;\r\nexport const RatioIcon = Ratio;\r\nexport const ExpandIcon = Expand;\r\nexport const CloseIcon = X;\r\nexport const InfoIcon = Info;\r\nexport const CopyIcon = Copy;\r\nexport const MenuIcon = Menu;\r\nexport const ChevronRightIcon = ChevronRight;\r\n\r\n// Custom 10s Skip Icons using Lucide base\r\nexport const Replay10Icon = ({ className }: { className?: string }) => (\r\n <div className={`relative flex items-center justify-center ${className}`}>\r\n <RotateCcw className=\"w-full h-full\" strokeWidth={2} />\r\n <span className=\"absolute inset-0 flex items-center justify-center text-[32%] font-bold select-none mt-[1px]\">10</span>\r\n </div>\r\n);\r\n\r\nexport const Forward10Icon = ({ className }: { className?: string }) => (\r\n <div className={`relative flex items-center justify-center ${className}`}>\r\n <RotateCw className=\"w-full h-full\" strokeWidth={2} />\r\n <span className=\"absolute inset-0 flex items-center justify-center text-[32%] font-bold select-none mt-[1px]\">10</span>\r\n </div>\r\n);\r\n\r\nexport const StrataLogo = ({ className }: { className?: string }) => {\r\n // Use Vite's BASE_URL env variable to construct the path relative to the deployment root.\r\n // In dev, this is \"/\", so result is \"/logo.png\".\r\n // In prod, this is \"/StrataPlayer/\", so result is \"/StrataPlayer/logo.png\".\r\n const base = import.meta.env?.BASE_URL || '/';\r\n const src = `${base}logo.png`;\r\n\r\n return <img src={src} alt=\"StrataPlayer Logo\" className={className} />;\r\n};\r\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 max-w-[85%] md:max-w-[400px]\">\r\n {notifications.map((n) => (\r\n <div\r\n key={n.id}\r\n className={`\r\n bg-zinc-950/90 backdrop-blur-md border border-white/10 text-white px-4 py-3 rounded-lg shadow-xl text-sm font-medium flex items-start gap-3 animate-in slide-in-from-left-2 fade-in duration-300 pointer-events-auto\r\n w-fit max-w-full\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)] shrink-0 mt-0.5\" />}\r\n <div className=\"flex flex-col gap-1 min-w-0\">\r\n <span className=\"break-words line-clamp-4 leading-relaxed whitespace-pre-wrap\">{n.message}</span>\r\n {typeof n.progress === 'number' && (\r\n <div className=\"h-1 w-full bg-white/10 rounded-full overflow-hidden mt-1.5\">\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\n// Helper for rendering string/node safely\r\nconst RenderContent = ({ content, className }: { content: string | React.ReactNode, className?: string }) => {\r\n if (typeof content === 'string') {\r\n // If it looks like HTML, use dangerous. Otherwise regular text.\r\n if (content.trim().startsWith('<')) return <span className={className} dangerouslySetInnerHTML={{ __html: content }} />;\r\n return <span className={className}>{content}</span>;\r\n }\r\n return <span className={className}>{content}</span>;\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 flex items-center justify-center w-4 h-4\"><RenderContent content={icon} /></span>}\r\n <span className={`font-medium truncate text-sm flex items-center ${active ? 'text-[var(--accent)]' : ''}`} title={typeof label === 'string' ? label : undefined}>\r\n <RenderContent content={label} />\r\n </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\n// Helper for rendering string/node safely (duplicated from Menu for isolation)\r\nconst RenderContent = ({ content }: { content: string | React.ReactNode }) => {\r\n if (typeof content === 'string') {\r\n if (content.trim().startsWith('<')) return <span dangerouslySetInnerHTML={{ __html: content }} />;\r\n return <span>{content}</span>;\r\n }\r\n return <>{content}</>;\r\n};\r\n\r\nexport const Toggle = ({ label, checked, onChange, icon, tooltip }: 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 flex items-center justify-center w-4 h-4\"><RenderContent content={icon} /></span>}\r\n <div className=\"flex flex-col\">\r\n <span className=\"text-sm text-zinc-300 font-medium group-hover:text-white transition-colors flex items-center\">\r\n <RenderContent content={label} />\r\n </span>\r\n {tooltip && <span className=\"text-[10px] text-zinc-500\">{tooltip}</span>}\r\n </div>\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 flex items-center justify-center w-4 h-4\"><RenderContent content={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 flex items-center justify-center w-4 h-4\"><RenderContent content={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, onOffsetChange, 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\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 <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={() => onOffsetChange(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={() => onOffsetChange(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","\r\nimport React, { useRef, useEffect, useState, useLayoutEffect } from 'react';\r\nimport { ContextMenuItem } from '../../core/StrataCore';\r\nimport { CheckIcon } from '../Icons';\r\n\r\ninterface ContextMenuProps {\r\n x: number;\r\n y: number;\r\n items: ContextMenuItem[];\r\n onClose: () => void;\r\n containerWidth: number;\r\n containerHeight: number;\r\n}\r\n\r\nconst RenderContent = ({ content }: { content: string | React.ReactNode }) => {\r\n if (typeof content === 'string') {\r\n if (content.trim().startsWith('<')) return <span dangerouslySetInnerHTML={{ __html: content }} />;\r\n return <span>{content}</span>;\r\n }\r\n return <>{content}</>;\r\n};\r\n\r\nexport const ContextMenu = ({ x, y, items, onClose, containerWidth, containerHeight }: ContextMenuProps) => {\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const [layout, setLayout] = useState<{ top: number, left: number, maxHeight?: number, opacity: number }>({\r\n top: y,\r\n left: x,\r\n opacity: 0\r\n });\r\n\r\n useLayoutEffect(() => {\r\n if (!menuRef.current) return;\r\n\r\n const rect = menuRef.current.getBoundingClientRect();\r\n const width = rect.width;\r\n // Since we render all items initially, height is accurate\r\n const height = rect.height;\r\n\r\n let newLeft = x;\r\n let newTop = y;\r\n\r\n // Horizontal Logic: Flip left if overflowing right\r\n if (x + width > containerWidth - 10) {\r\n newLeft = x - width;\r\n }\r\n // Clamp left edge\r\n if (newLeft < 10) newLeft = 10;\r\n if (newLeft + width > containerWidth) newLeft = Math.max(10, containerWidth - width - 10);\r\n\r\n // Vertical Logic: Flip up if overflowing bottom\r\n if (y + height > containerHeight - 10) {\r\n newTop = y - height;\r\n }\r\n\r\n let availableHeight = containerHeight - 20;\r\n\r\n // Clamp top edge\r\n if (newTop < 10) newTop = 10;\r\n\r\n // If after flipping/clamping it still overflows bottom, we must shift up or limit height\r\n if (newTop + height > containerHeight - 10) {\r\n newTop = Math.max(10, containerHeight - height - 10);\r\n // If even at top it overflows, height is capped by container\r\n }\r\n\r\n setLayout({\r\n top: newTop,\r\n left: newLeft,\r\n maxHeight: availableHeight,\r\n opacity: 1\r\n });\r\n\r\n }, [x, y, items, containerWidth, containerHeight]);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\r\n onClose();\r\n }\r\n };\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, [onClose]);\r\n\r\n return (\r\n <div\r\n ref={menuRef}\r\n className=\"absolute z-50 min-w-[200px] bg-[var(--bg-panel)] backdrop-blur-xl border-[length:var(--border-width)] border-white/10 shadow-2xl p-1.5 font-[family-name:var(--font-main)] overflow-y-auto hide-scrollbar flex flex-col\"\r\n style={{\r\n top: layout.top,\r\n left: layout.left,\r\n maxHeight: layout.maxHeight,\r\n opacity: layout.opacity,\r\n borderRadius: 'var(--radius-lg)'\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {items.map((item, index) => {\r\n // Separator Logic: 0 height with top border for a crisp line\r\n if (item.separator) {\r\n return <div key={index} className=\"h-0 border-t border-white/10 mx-2 my-1.5\" />;\r\n }\r\n\r\n // Label Logic\r\n if (item.isLabel) {\r\n return (\r\n <div key={index} className=\"px-3 py-1.5 text-[10px] font-bold text-zinc-500 uppercase tracking-wider select-none\">\r\n <RenderContent content={item.html || ''} />\r\n </div>\r\n );\r\n }\r\n\r\n // Standard Interactive Item\r\n return (\r\n <React.Fragment key={index}>\r\n <button\r\n onClick={() => {\r\n if (!item.disabled) {\r\n if (item.click) item.click(onClose);\r\n else if (item.onClick) item.onClick(onClose);\r\n }\r\n }}\r\n disabled={item.disabled}\r\n className={`w-full text-left px-3 py-2.5 flex items-center justify-between hover:bg-white/10 focus:bg-white/10 focus:outline-none transition-colors text-sm text-zinc-200 disabled:opacity-50 disabled:cursor-not-allowed group my-0.5`}\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <div className=\"flex items-center gap-3 overflow-hidden\">\r\n {item.icon && <span className=\"text-zinc-400 w-4 h-4 flex items-center justify-center shrink-0 group-hover:text-zinc-300 transition-colors\"><RenderContent content={item.icon} /></span>}\r\n <span className={`flex items-center font-medium truncate ${item.checked ? 'text-[var(--accent)]' : ''}`}><RenderContent content={item.html || ''} /></span>\r\n </div>\r\n {item.checked && <CheckIcon className=\"w-4 h-4 text-[var(--accent)] shrink-0 ml-2\" />}\r\n </button>\r\n {/* Legacy support for showBorder, though item.separator is preferred now */}\r\n {item.showBorder && <div className=\"h-0 border-t border-white/10 mx-2 my-1\" />}\r\n </React.Fragment>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n","\r\nimport React, { useEffect, useState } from 'react';\r\nimport { StrataCore } from '../../core/StrataCore';\r\nimport { CloseIcon } from '../Icons';\r\n\r\nexport const VideoInfo = ({ player, onClose }: { player: StrataCore, onClose: () => void }) => {\r\n const [stats, setStats] = useState<Record<string, string | number>>({});\r\n\r\n useEffect(() => {\r\n const update = () => {\r\n if (!player.video) return;\r\n const v = player.video;\r\n const q = (v as any).getVideoPlaybackQuality ? (v as any).getVideoPlaybackQuality() : null;\r\n\r\n setStats({\r\n 'Player Size': `${v.offsetWidth} x ${v.offsetHeight}`,\r\n 'Video Resolution': `${v.videoWidth} x ${v.videoHeight}`,\r\n 'Current Time': `${v.currentTime.toFixed(3)}s`,\r\n 'Duration': `${v.duration.toFixed(3)}s`,\r\n 'Volume': `${Math.round(v.volume * 100)}%`,\r\n 'Dropped Frames': q ? q.droppedVideoFrames : 'N/A',\r\n 'Buffer': v.buffered.length > 0 ? `${(v.buffered.end(v.buffered.length - 1) - v.currentTime).toFixed(2)}s` : '0s',\r\n 'Engine': player.store.get().sources[player.store.get().currentSourceIndex]?.type || 'native',\r\n 'URL': v.currentSrc\r\n });\r\n };\r\n update();\r\n const timer = setInterval(update, 1000);\r\n return () => clearInterval(timer);\r\n }, [player]);\r\n\r\n return (\r\n <div className=\"absolute inset-0 z-[60] flex items-center justify-center bg-black/60 backdrop-blur-sm p-4 animate-in fade-in duration-200\">\r\n <div\r\n className=\"bg-[var(--bg-panel)] border border-white/10 rounded-xl w-full max-w-md shadow-2xl relative font-mono text-xs text-zinc-300 flex flex-col\"\r\n style={{ borderRadius: 'var(--radius)', maxHeight: '90%' }}\r\n >\r\n <div className=\"p-5 pb-0 flex-shrink-0 relative\">\r\n <button\r\n onClick={(e) => { e.stopPropagation(); onClose(); }}\r\n className=\"absolute top-3 right-3 p-1.5 text-zinc-400 hover:text-white hover:bg-white/10 rounded-full transition-colors\"\r\n >\r\n <CloseIcon className=\"w-4 h-4\" />\r\n </button>\r\n <h3 className=\"text-sm font-bold text-white mb-4 uppercase tracking-wider border-b border-white/10 pb-2\">Video Statistics</h3>\r\n </div>\r\n\r\n <div className=\"overflow-y-auto hide-scrollbar p-5 pt-0 space-y-2.5 flex-1 min-h-0\">\r\n {Object.entries(stats).map(([k, v]) => (\r\n <div key={k} className=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-1\">\r\n <span className=\"text-zinc-500 font-bold shrink-0\">{k}</span>\r\n <span className=\"text-zinc-200 truncate select-all font-medium bg-white/5 px-1.5 py-0.5 rounded break-all text-right\" title={String(v)}>{String(v)}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\r\nimport React, { useEffect, useRef, useState, useSyncExternalStore, useCallback, useMemo } from 'react';\r\nimport { StrataCore, PlayerState, TextTrackConfig, SubtitleSettings, PlayerTheme, StrataConfig, getResolvedState, DEFAULT_STATE, IPlugin, PlayerSource, ControlItem, ContextMenuItem, SettingItem } from '../core/StrataCore';\r\nimport { formatTime, parseVTT, ThumbnailCue } from '../utils/playerUtils';\r\nimport { useTransition } from './hooks/useTransition';\r\nimport { NotificationContainer } from './components/NotificationContainer';\r\nimport { SubtitleOverlay } from './components/SubtitleOverlay';\r\nimport { Menu, MenuItem, MenuHeader, MenuDivider } from './components/Menu';\r\nimport { SubtitleMenu } from './components/SubtitleMenu';\r\nimport { ContextMenu } from './components/ContextMenu';\r\nimport { VideoInfo } from './components/VideoInfo';\r\nimport { SettingsGroup, Toggle } from './components/SettingsPrimitives';\r\nimport {\r\n PlayIcon, PauseIcon, VolumeHighIcon, VolumeLowIcon, VolumeMuteIcon,\r\n MaximizeIcon, MinimizeIcon, SettingsIcon, PipIcon,\r\n SubtitleIcon, DownloadIcon, Replay10Icon, Forward10Icon,\r\n LoaderIcon, CastIcon, UsersIcon, PaletteIcon, CheckIcon,\r\n CustomizeIcon, CameraIcon, LockIcon, UnlockIcon, WebFullscreenIcon,\r\n FastForwardIcon, RatioIcon, ExpandIcon, InfoIcon\r\n} from './Icons';\r\n\r\ndeclare module 'react' {\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n 'google-cast-launcher': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;\r\n }\r\n }\r\n}\r\n\r\n// --- Main Player Component ---\r\n\r\ninterface StrataPlayerProps extends StrataConfig {\r\n src?: string; // Optional if sources are provided\r\n type?: string; // Optional: Explicitly define type for the src (e.g. 'hls', 'dash')\r\n sources?: PlayerSource[]; // Array of sources\r\n poster?: string;\r\n thumbnails?: string; // URL to VTT thumbnails\r\n textTracks?: TextTrackConfig[];\r\n plugins?: IPlugin[]; // Allow injecting plugins from outside\r\n autoPlay?: boolean; // Added prop\r\n onGetInstance?: (core: StrataCore) => void; // Expose instance\r\n}\r\n\r\nconst THEME_COLORS = [\r\n { label: 'Strata', value: '#6366f1' },\r\n { label: 'Emerald', value: '#10b981' },\r\n { label: 'Rose', value: '#f43f5e' },\r\n { label: 'Amber', value: '#f59e0b' },\r\n { label: 'Sky', value: '#0ea5e9' },\r\n { label: 'Violet', value: '#8b5cf6' },\r\n];\r\n\r\nconst THEMES: { label: string, value: PlayerTheme, color: string }[] = [\r\n { label: 'Default', value: 'default', color: '#6366f1' },\r\n { label: 'Pixel', value: 'pixel', color: '#ef4444' },\r\n { label: 'Game', value: 'game', color: '#eab308' },\r\n { label: 'Hacker', value: 'hacker', color: '#22c55e' },\r\n];\r\n\r\n// Helper to render HTML strings safely or pass nodes through\r\nconst HtmlOrNode = ({ content, className, style }: { content: string | React.ReactNode, className?: string, style?: React.CSSProperties }) => {\r\n if (typeof content === 'string') {\r\n if (content.trim().startsWith('<')) {\r\n return <div className={className} style={style} dangerouslySetInnerHTML={{ __html: content }} />;\r\n }\r\n return <div className={className} style={style}>{content}</div>;\r\n }\r\n return <div className={className} style={style}>{content}</div>;\r\n};\r\n\r\nexport const StrataPlayer = (props: StrataPlayerProps) => {\r\n const { src, type, sources, poster, autoPlay, thumbnails, textTracks, plugins, onGetInstance, ...config } = props;\r\n\r\n // Default configs for optionals\r\n const useScreenshot = config.screenshot ?? false;\r\n const usePip = config.pip ?? true;\r\n const useSetting = config.setting ?? true;\r\n const useFullscreen = config.fullscreen ?? true;\r\n const useFullscreenWeb = config.fullscreenWeb ?? false;\r\n const useLock = config.lock ?? false;\r\n const useFastForward = config.fastForward ?? true;\r\n const useFlip = config.flip ?? true;\r\n const useAspectRatio = config.aspectRatio ?? true;\r\n const useHotKey = config.hotKey ?? true;\r\n const isBackdrop = config.backdrop ?? true;\r\n const useGestureSeek = config.gestureSeek ?? false;\r\n const useCenterControls = config.centerControls ?? true;\r\n const fetchTimeout = config.fetchTimeout ?? 30000;\r\n\r\n // Default AutoOrientation to true\r\n const useAutoOrientation = config.autoOrientation ?? true;\r\n\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const [player, setPlayer] = useState<StrataCore | null>(null);\r\n const [hasPlayed, setHasPlayed] = useState(false);\r\n const [playerHeight, setPlayerHeight] = useState(0);\r\n const [playerWidth, setPlayerWidth] = useState(0);\r\n\r\n // Resolve initial state based on props + defaults + localStorage BEFORE mounting\r\n const initialState = useMemo(() => getResolvedState(config), []);\r\n\r\n const state = useSyncExternalStore<PlayerState>(\r\n useCallback((cb) => player ? player.store.subscribe(cb) : () => { }, [player]),\r\n () => player ? player.store.get() : initialState,\r\n () => initialState\r\n );\r\n\r\n const [settingsOpen, setSettingsOpen] = useState(false);\r\n const [subtitleMenuOpen, setSubtitleMenuOpen] = useState(false);\r\n const [activeMenu, setActiveMenu] = useState<'main' | 'quality' | 'speed' | 'audio' | 'boost' | 'party' | 'appearance' | 'sources' | 'flip' | 'ratio'>('main');\r\n\r\n // Context Menu State\r\n const [contextMenu, setContextMenu] = useState<{ x: number, y: number, visible: boolean }>({ x: 0, y: 0, visible: false });\r\n const [showVideoInfo, setShowVideoInfo] = useState(false);\r\n\r\n // Transition States\r\n const settingsTransition = useTransition(settingsOpen, 200);\r\n const subtitleTransition = useTransition(subtitleMenuOpen, 200);\r\n\r\n // Seek & Scrubbing State\r\n const [isScrubbing, setIsScrubbing] = useState(false);\r\n const [scrubbingTime, setScrubbingTime] = useState(0);\r\n const [isVolumeScrubbing, setIsVolumeScrubbing] = useState(false);\r\n const [isVolumeHovered, setIsVolumeHovered] = useState(false);\r\n const [isVolumeLocked, setIsVolumeLocked] = useState(false); // For mobile/touch\r\n\r\n const [thumbnailCues, setThumbnailCues] = useState<ThumbnailCue[]>([]);\r\n const [hoverTime, setHoverTime] = useState<number | null>(null);\r\n const [hoverPos, setHoverPos] = useState<number>(0);\r\n const [currentThumbnail, setCurrentThumbnail] = useState<ThumbnailCue | null>(null);\r\n const [seekAnimation, setSeekAnimation] = useState<{ type: 'forward' | 'rewind', id: number } | null>(null);\r\n const [skipTrigger, setSkipTrigger] = useState<'forward' | 'rewind' | null>(null);\r\n\r\n // Fast Forward State\r\n const [isFastForwarding, setIsFastForwarding] = useState(false);\r\n const fastForwardTimerRef = useRef<any>(null);\r\n const originalRateRef = useRef<number>(1);\r\n\r\n // Gesture Refs\r\n const touchStartX = useRef<number | null>(null);\r\n const touchStartTime = useRef<number>(0);\r\n const isDraggingRef = useRef(false);\r\n\r\n const clickTimeoutRef = useRef<any>(null);\r\n const controlsTimeoutRef = useRef<any>(null);\r\n const progressBarRef = useRef<HTMLDivElement>(null);\r\n const volumeBarRef = useRef<HTMLDivElement>(null);\r\n const animationCleanupRef = useRef<any>(null);\r\n\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n // Pass poster into core config so metadata can use it\r\n const core = new StrataCore({ ...config, poster });\r\n\r\n // Register plugins\r\n if (plugins && plugins.length > 0) {\r\n plugins.forEach(p => core.use(p));\r\n }\r\n\r\n core.attach(containerRef.current);\r\n setPlayer(core);\r\n if (onGetInstance) onGetInstance(core);\r\n\r\n const observer = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n setPlayerHeight(entry.contentRect.height);\r\n setPlayerWidth(entry.contentRect.width);\r\n }\r\n });\r\n observer.observe(containerRef.current);\r\n\r\n return () => {\r\n observer.disconnect();\r\n core.destroy();\r\n setPlayer(null);\r\n };\r\n }, []);\r\n\r\n // Reactive Prop Updates\r\n useEffect(() => {\r\n if (!player) return;\r\n const updates: any = {};\r\n if (config.theme !== undefined && config.theme !== state.theme) updates.theme = config.theme;\r\n if (config.themeColor !== undefined && config.themeColor !== state.themeColor) updates.themeColor = config.themeColor;\r\n if (config.iconSize !== undefined && config.iconSize !== state.iconSize) updates.iconSize = config.iconSize;\r\n\r\n if (Object.keys(updates).length > 0) {\r\n player.setAppearance(updates);\r\n }\r\n\r\n if (config.volume !== undefined && Math.abs(config.volume - state.volume) > 0.01) player.setVolume(config.volume);\r\n if (config.muted !== undefined && config.muted !== state.isMuted) {\r\n if (config.muted) player.video.muted = true;\r\n else { player.video.muted = false; }\r\n }\r\n }, [player, config.theme, config.themeColor, config.iconSize, config.volume, config.muted]);\r\n\r\n useEffect(() => {\r\n if (!player) return;\r\n const tracks = textTracks || [];\r\n if (sources && sources.length > 0) {\r\n setHasPlayed(false);\r\n player.setSources(sources, tracks);\r\n } else if (src) {\r\n setHasPlayed(false);\r\n player.setSources([{ url: src, type: type || 'auto' }], tracks);\r\n }\r\n }, [src, type, sources, textTracks, player]);\r\n\r\n useEffect(() => {\r\n if (player && autoPlay) {\r\n player.video.muted = true;\r\n player.store.setState({ isMuted: true });\r\n player.play().catch(() => { });\r\n }\r\n }, [player, autoPlay]);\r\n\r\n useEffect(() => {\r\n if (state.isPlaying && !hasPlayed) setHasPlayed(true);\r\n }, [state.isPlaying, hasPlayed]);\r\n\r\n useEffect(() => {\r\n if (thumbnails && player) {\r\n parseVTT(thumbnails, player.notify.bind(player), fetchTimeout).then(setCues => setThumbnailCues(setCues));\r\n } else setThumbnailCues([]);\r\n }, [thumbnails, player, fetchTimeout]);\r\n\r\n // Safety cleanup for seek animation if onAnimationEnd fails\r\n useEffect(() => {\r\n if (seekAnimation) {\r\n if (animationCleanupRef.current) clearTimeout(animationCleanupRef.current);\r\n animationCleanupRef.current = setTimeout(() => {\r\n setSeekAnimation(null);\r\n }, 600); // slightly longer than 500ms animation\r\n }\r\n return () => {\r\n if (animationCleanupRef.current) clearTimeout(animationCleanupRef.current);\r\n };\r\n }, [seekAnimation]);\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (!player || !useHotKey) return;\r\n if (document.activeElement?.tagName === 'INPUT') return;\r\n switch (e.key.toLowerCase()) {\r\n case ' ': case 'k': e.preventDefault(); player.togglePlay(); break;\r\n case 'arrowright': e.preventDefault(); player.skip(5); break;\r\n case 'arrowleft': e.preventDefault(); player.skip(-5); break;\r\n case 'arrowup': e.preventDefault(); player.setVolume(player.video.volume + 0.1); break;\r\n case 'arrowdown': e.preventDefault(); player.setVolume(player.video.volume - 0.1); break;\r\n case 'f': e.preventDefault(); player.toggleFullscreen(); break;\r\n case 'm': e.preventDefault(); player.toggleMute(); break;\r\n }\r\n };\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => window.removeEventListener('keydown', handleKeyDown);\r\n }, [player, useHotKey]);\r\n\r\n const handleMouseMove = () => {\r\n if (!player) return;\r\n // Even if locked, we want to wake up controls so the lock button becomes visible\r\n player.setControlsVisible(true);\r\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\r\n if (settingsOpen || subtitleMenuOpen) return;\r\n controlsTimeoutRef.current = setTimeout(() => {\r\n if (!state.isPlaying || settingsOpen || subtitleMenuOpen) return;\r\n player.setControlsVisible(false);\r\n }, 2500);\r\n };\r\n\r\n useEffect(() => {\r\n if (!player) return;\r\n if (!settingsOpen && !subtitleMenuOpen && state.isPlaying) handleMouseMove();\r\n else if (settingsOpen || subtitleMenuOpen) {\r\n player.setControlsVisible(true);\r\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\r\n }\r\n }, [settingsOpen, subtitleMenuOpen, state.isPlaying, player]);\r\n\r\n // --- Fast Forward Logic ---\r\n const startFastForward = useCallback(() => {\r\n if (!useFastForward || !player || !state.isPlaying || state.isLocked) return;\r\n originalRateRef.current = player.video.playbackRate;\r\n fastForwardTimerRef.current = setTimeout(() => {\r\n player.video.playbackRate = 2;\r\n setIsFastForwarding(true);\r\n }, 500); // 500ms delay for long press\r\n }, [useFastForward, player, state.isPlaying, state.isLocked]);\r\n\r\n const stopFastForward = useCallback(() => {\r\n if (fastForwardTimerRef.current) clearTimeout(fastForwardTimerRef.current);\r\n if (isFastForwarding && player) {\r\n player.video.playbackRate = originalRateRef.current; // Restore original rate\r\n setIsFastForwarding(false);\r\n }\r\n }, [isFastForwarding, player]);\r\n\r\n // --- Gesture Seek Logic ---\r\n const handleTouchStart = (e: React.TouchEvent) => {\r\n startFastForward();\r\n\r\n if (useGestureSeek && !state.isLocked) {\r\n touchStartX.current = e.touches[0].clientX;\r\n touchStartTime.current = state.currentTime;\r\n isDraggingRef.current = false;\r\n }\r\n };\r\n\r\n const handleTouchMove = (e: React.TouchEvent) => {\r\n if (state.isLocked) return;\r\n\r\n // If we are moving and gesture seek is enabled\r\n if (useGestureSeek && touchStartX.current !== null) {\r\n const deltaX = e.touches[0].clientX - touchStartX.current;\r\n\r\n // Threshold to start dragging\r\n if (Math.abs(deltaX) > 10) {\r\n // If we start dragging, cancel any pending fast forward\r\n stopFastForward();\r\n\r\n isDraggingRef.current = true;\r\n setIsScrubbing(true);\r\n\r\n if (containerRef.current && state.duration) {\r\n const rect = containerRef.current.getBoundingClientRect();\r\n // Sensitivity: map drag distance to timeline progress directly relative to container width\r\n const deltaRatio = deltaX / rect.width;\r\n const newTime = Math.max(0, Math.min(state.duration, touchStartTime.current + (deltaRatio * state.duration)));\r\n setScrubbingTime(newTime);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleTouchEnd = (e: React.TouchEvent) => {\r\n stopFastForward();\r\n\r\n if (useGestureSeek && isDraggingRef.current) {\r\n player?.seek(scrubbingTime);\r\n setIsScrubbing(false);\r\n isDraggingRef.current = false;\r\n touchStartX.current = null;\r\n // Prevent subsequent click event from toggling play\r\n return;\r\n }\r\n\r\n touchStartX.current = null;\r\n };\r\n\r\n const calculateTimeFromEvent = (e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent) => {\r\n if (!progressBarRef.current || !state.duration) return 0;\r\n const rect = progressBarRef.current.getBoundingClientRect();\r\n const clientX = 'touches' in e ? (e as TouchEvent).touches[0].clientX : (e as MouseEvent).clientX;\r\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\r\n return pct * state.duration;\r\n };\r\n\r\n const handleSeekStart = (e: React.MouseEvent | React.TouchEvent) => {\r\n if (state.isLocked) return;\r\n setIsScrubbing(true);\r\n setScrubbingTime(calculateTimeFromEvent(e));\r\n const handleMove = (moveEvent: MouseEvent | TouchEvent) => setScrubbingTime(calculateTimeFromEvent(moveEvent));\r\n const handleUp = (upEvent: MouseEvent | TouchEvent) => {\r\n player?.seek(calculateTimeFromEvent(upEvent));\r\n setIsScrubbing(false);\r\n document.removeEventListener('mousemove', handleMove); document.removeEventListener('touchmove', handleMove);\r\n document.removeEventListener('mouseup', handleUp); document.removeEventListener('touchend', handleUp);\r\n };\r\n document.addEventListener('mousemove', handleMove); document.addEventListener('touchmove', handleMove);\r\n document.addEventListener('mouseup', handleUp); document.addEventListener('touchend', handleUp);\r\n };\r\n\r\n const calculateVolumeFromEvent = (e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent) => {\r\n if (!volumeBarRef.current) return 0;\r\n const rect = volumeBarRef.current.getBoundingClientRect();\r\n const clientX = 'touches' in e ? (e as TouchEvent).touches[0].clientX : (e as MouseEvent).clientX;\r\n return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\r\n };\r\n\r\n const handleVolumeStart = (e: React.MouseEvent | React.TouchEvent) => {\r\n if (!player || state.isLocked) return;\r\n setIsVolumeScrubbing(true);\r\n player.setVolume(calculateVolumeFromEvent(e));\r\n const handleMove = (moveEvent: MouseEvent | TouchEvent) => player.setVolume(calculateVolumeFromEvent(moveEvent));\r\n const handleUp = () => {\r\n setIsVolumeScrubbing(false);\r\n document.removeEventListener('mousemove', handleMove); document.removeEventListener('touchmove', handleMove);\r\n document.removeEventListener('mouseup', handleUp); document.removeEventListener('touchend', handleUp);\r\n };\r\n document.addEventListener('mousemove', handleMove); document.addEventListener('touchmove', handleMove);\r\n document.addEventListener('mouseup', handleUp); document.addEventListener('touchend', handleUp);\r\n };\r\n\r\n const handleProgressMove = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (!state.duration || state.isLive) return;\r\n const rect = e.currentTarget.getBoundingClientRect();\r\n const percent = (e.clientX - rect.left) / rect.width;\r\n const time = percent * state.duration;\r\n setHoverPos(percent * 100);\r\n setHoverTime(time);\r\n if (thumbnailCues.length > 0) setCurrentThumbnail(thumbnailCues.find(c => time >= c.start && time < c.end) || null);\r\n };\r\n\r\n const triggerSkip = (direction: 'forward' | 'rewind') => {\r\n if (!player || state.isLocked) return;\r\n player.skip(direction === 'forward' ? 10 : -10);\r\n setSkipTrigger(direction);\r\n setTimeout(() => setSkipTrigger(null), 300);\r\n };\r\n\r\n const handleContainerClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (!player) return;\r\n\r\n // If we just finished a drag gesture, ignore the click\r\n if (isDraggingRef.current) {\r\n isDraggingRef.current = false;\r\n return;\r\n }\r\n\r\n // Close menus on outside click\r\n if (settingsOpen) setSettingsOpen(false);\r\n if (subtitleMenuOpen) setSubtitleMenuOpen(false);\r\n if (isVolumeLocked) setIsVolumeLocked(false);\r\n if (contextMenu.visible) setContextMenu({ ...contextMenu, visible: false });\r\n\r\n // Wake up controls so lock button is visible if locked\r\n player.setControlsVisible(true);\r\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\r\n controlsTimeoutRef.current = setTimeout(() => {\r\n if (!state.isPlaying || settingsOpen || subtitleMenuOpen) return;\r\n player.setControlsVisible(false);\r\n }, 2500);\r\n\r\n // If locked, do nothing else (prevent play/pause, seek, double tap)\r\n if (state.isLocked) return;\r\n\r\n const rect = e.currentTarget.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const width = rect.width;\r\n const now = Date.now();\r\n\r\n if (clickTimeoutRef.current) {\r\n clearTimeout(clickTimeoutRef.current);\r\n clickTimeoutRef.current = null;\r\n if (x < width * 0.35) { triggerSkip('rewind'); setSeekAnimation({ type: 'rewind', id: now }); }\r\n else if (x > width * 0.65) { triggerSkip('forward'); setSeekAnimation({ type: 'forward', id: now }); }\r\n else player.toggleFullscreen();\r\n } else {\r\n clickTimeoutRef.current = setTimeout(() => {\r\n player.togglePlay();\r\n clickTimeoutRef.current = null;\r\n }, 250);\r\n }\r\n };\r\n\r\n const handleContextMenu = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n if (state.isLocked) return;\r\n\r\n const rect = containerRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\n\r\n setContextMenu({\r\n visible: true,\r\n x: e.clientX - rect.left,\r\n y: e.clientY - rect.top\r\n });\r\n };\r\n\r\n const handleVolumeIconClick = (e: React.MouseEvent | React.TouchEvent) => {\r\n e.stopPropagation();\r\n\r\n // Robust touch/mobile detection\r\n const isTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n const isMobile = window.matchMedia('(hover: none)').matches || isTouch;\r\n\r\n if (isVolumeLocked) {\r\n setIsVolumeLocked(false);\r\n return;\r\n }\r\n\r\n if (isMobile) {\r\n setIsVolumeLocked(true);\r\n } else {\r\n // Desktop default behavior: Mute toggle\r\n player?.toggleMute();\r\n }\r\n };\r\n\r\n const VolIcon = state.isMuted || state.volume === 0 ? VolumeMuteIcon : state.volume < 0.5 ? VolumeLowIcon : VolumeHighIcon;\r\n\r\n const menuMaxHeight = Math.max(100, playerHeight - 120);\r\n\r\n const getIconClass = () => {\r\n switch (state.iconSize) {\r\n case 'small': return 'w-4 h-4';\r\n case 'large': return 'w-6 h-6';\r\n default: return 'w-5 h-5';\r\n }\r\n }\r\n const getButtonClass = () => {\r\n switch (state.iconSize) {\r\n case 'small': return 'p-2 min-w-[32px] min-h-[32px]';\r\n case 'large': return 'p-3 min-w-[44px] min-h-[44px]'; // Larger touch targets\r\n default: return 'p-2.5 min-w-[36px] min-h-[36px]';\r\n }\r\n }\r\n const iconClass = getIconClass();\r\n const btnClass = getButtonClass();\r\n\r\n const getCenterSizes = () => {\r\n switch (state.iconSize) {\r\n case 'small':\r\n return {\r\n playBtn: 'w-14 h-14',\r\n playIcon: 'w-6 h-6',\r\n skipBtn: 'w-10 h-10',\r\n skipIcon: 'w-5 h-5'\r\n };\r\n case 'large':\r\n return {\r\n playBtn: 'w-24 h-24',\r\n playIcon: 'w-12 h-12',\r\n skipBtn: 'w-16 h-16',\r\n skipIcon: 'w-8 h-8'\r\n };\r\n default: // medium\r\n return {\r\n playBtn: 'w-20 h-20',\r\n playIcon: 'w-9 h-9',\r\n skipBtn: 'w-12 h-12',\r\n skipIcon: 'w-6 h-6'\r\n };\r\n }\r\n }\r\n const center = getCenterSizes();\r\n\r\n // Bottom Controls Visibility: Show if paused, or actively showing controls, or menus open. \r\n // HIDDEN IF LOCKED.\r\n // Use state.controlsVisible from Core to sync with external listeners (like ArtPlayer consumers)\r\n const isControlsVisible = !state.isLocked && (state.controlsVisible || !state.isPlaying || settingsOpen || subtitleMenuOpen);\r\n const isVolumeVisible = isVolumeHovered || isVolumeScrubbing || isVolumeLocked;\r\n\r\n const backdropClass = isBackdrop ? 'backdrop-blur-xl bg-black/80' : 'bg-black/95';\r\n\r\n // --- Dynamic Controls Rendering ---\r\n const controls: ControlItem[] = useMemo(() => {\r\n const items: ControlItem[] = [\r\n { id: 'play', position: 'left', index: 10, isBuiltIn: true },\r\n { id: 'volume', position: 'left', index: 20, isBuiltIn: true },\r\n { id: 'time', position: 'left', index: 30, isBuiltIn: true },\r\n { id: 'subtitle', position: 'right', index: 80, isBuiltIn: true },\r\n { id: 'screenshot', position: 'right', index: 85, isBuiltIn: true },\r\n { id: 'pip', position: 'right', index: 90, isBuiltIn: true },\r\n { id: 'download', position: 'right', index: 95, isBuiltIn: true },\r\n { id: 'settings', position: 'right', index: 100, isBuiltIn: true },\r\n { id: 'fullscreenWeb', position: 'right', index: 110, isBuiltIn: true },\r\n { id: 'fullscreen', position: 'right', index: 120, isBuiltIn: true },\r\n ];\r\n\r\n if (config.controls) {\r\n // Merge user controls\r\n config.controls.forEach(c => {\r\n const existing = items.find(i => i.id === c.id);\r\n if (existing) {\r\n Object.assign(existing, c); // Override\r\n } else {\r\n items.push(c);\r\n }\r\n });\r\n }\r\n\r\n // Filter based on config toggles\r\n return items.filter(c => {\r\n if (c.id === 'screenshot' && !useScreenshot) return false;\r\n if (c.id === 'pip' && !usePip) return false;\r\n if (c.id === 'settings' && !useSetting) return false;\r\n if (c.id === 'fullscreen' && !useFullscreen) return false;\r\n if (c.id === 'fullscreenWeb' && !useFullscreenWeb) return false;\r\n return true;\r\n }).sort((a, b) => a.index - b.index);\r\n }, [config.controls, useScreenshot, usePip, useSetting, useFullscreen, useFullscreenWeb]);\r\n\r\n const renderControl = (item: ControlItem) => {\r\n if (!item.isBuiltIn) {\r\n // Render custom user control\r\n return (\r\n <button\r\n key={item.index}\r\n onClick={() => {\r\n if (item.click) item.click(player!);\r\n else if (item.onClick) item.onClick(player!);\r\n }}\r\n className={`strata-control-btn text-zinc-300 hover:text-white transition-colors hover:bg-white/10 focus:outline-none flex items-center justify-center ${btnClass} ${item.className || ''}`}\r\n style={{ borderRadius: 'var(--radius)', ...item.style }}\r\n title={item.tooltip}\r\n >\r\n <HtmlOrNode content={item.html || ''} />\r\n </button>\r\n );\r\n }\r\n\r\n // Built-ins\r\n switch (item.id) {\r\n case 'play':\r\n return (\r\n <button key=\"play\" 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)' }}>\r\n {state.isPlaying ? <PauseIcon className={`${iconClass} fill-current`} /> : <PlayIcon className={`${iconClass} fill-current`} />}\r\n </button>\r\n );\r\n case 'volume':\r\n return (\r\n <div key=\"volume\" className=\"flex items-center gap-2 group/vol relative\"\r\n onMouseEnter={() => { if (window.matchMedia('(hover: hover)').matches) setIsVolumeHovered(true); }}\r\n onMouseLeave={() => { if (window.matchMedia('(hover: hover)').matches) setIsVolumeHovered(false); }}\r\n >\r\n <button onClick={handleVolumeIconClick} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}>\r\n <VolIcon className={iconClass} />\r\n </button>\r\n <div className={`relative h-8 flex items-center transition-all duration-300 ease-out overflow-hidden ${isVolumeVisible ? 'w-28 opacity-100 ml-1' : 'w-0 opacity-0'}`}>\r\n <div ref={volumeBarRef} className=\"relative w-full h-full flex items-center cursor-pointer px-2\" onMouseDown={handleVolumeStart} onTouchStart={handleVolumeStart}>\r\n <div className=\"w-full h-1 bg-white/20 overflow-hidden\" style={{ borderRadius: 'var(--radius-full)' }}>\r\n <div className=\"h-full bg-white\" style={{ width: `${(state.isMuted ? 0 : state.volume) * 100}%`, borderRadius: 'var(--radius-full)' }}></div>\r\n </div>\r\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)' }} />\r\n </div>\r\n </div>\r\n {isVolumeVisible && <div 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\" style={{ left: `calc(52px + ${(state.isMuted ? 0 : state.volume) * 80}px)` }}>{state.isMuted ? '0%' : `${Math.round(state.volume * 100)}%`}</div>}\r\n </div>\r\n );\r\n case 'time':\r\n return config.isLive ? (\r\n <div key=\"live\" className=\"flex items-center gap-2 px-2 py-0.5 bg-red-500/10 border border-red-500/20 rounded-md\">\r\n <div className=\"w-2 h-2 rounded-full bg-red-500 animate-pulse\" />\r\n <span className=\"text-[10px] font-bold text-red-500 tracking-wider\">LIVE</span>\r\n </div>\r\n ) : (\r\n <div key=\"time\" 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>\r\n );\r\n case 'subtitle':\r\n return (\r\n <div key=\"subtitle\" className=\"relative\">\r\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>\r\n {subtitleTransition.isMounted && (\r\n <SubtitleMenu\r\n tracks={state.subtitleTracks} current={state.currentSubtitle} onSelect={(idx: number) => player?.setSubtitle(idx)}\r\n onUpload={(file: File) => player?.addTextTrack(file, file.name)} onClose={() => setSubtitleMenuOpen(false)}\r\n settings={state.subtitleSettings} onSettingsChange={(s: Partial<SubtitleSettings>) => player?.updateSubtitleSettings(s)}\r\n onReset={() => player?.resetSubtitleSettings()} offset={state.subtitleOffset} onOffsetChange={(val: number) => player?.setSubtitleOffset(val)}\r\n maxHeight={menuMaxHeight} animationClass={`strata-backdrop ${backdropClass} ${subtitleTransition.isVisible ? 'opacity-100 translate-y-0 scale-100' : 'opacity-0 translate-y-2 scale-95'}`}\r\n />\r\n )}\r\n </div>\r\n );\r\n case 'screenshot': return <button key=\"ss\" onClick={() => player?.screenshot()} 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)' }} title=\"Screenshot\"><CameraIcon className={iconClass} /></button>;\r\n case 'pip': return <button key=\"pip\" 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>;\r\n case 'download': return <button key=\"dl\" 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>;\r\n case 'fullscreen': return <button key=\"fs\" 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>;\r\n case 'fullscreenWeb': return <button key=\"fsw\" className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 hidden sm:block focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }} title=\"Web Fullscreen\"><WebFullscreenIcon className={iconClass} /></button>;\r\n case 'settings':\r\n return (\r\n <div key=\"settings\" className=\"relative\">\r\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>\r\n {settingsTransition.isMounted && (<Menu onClose={() => setSettingsOpen(false)} align=\"right\" maxHeight={menuMaxHeight} className={`strata-backdrop ${backdropClass} ${settingsTransition.isVisible ? 'opacity-100 translate-y-0 scale-100' : 'opacity-0 translate-y-2 scale-95'}`}><div className=\"w-full\">\r\n {activeMenu === '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 sticky top-0 z-10 backdrop-blur-md\" style={{ borderRadius: 'var(--radius)' }}><span>Settings</span></div>\r\n {state.sources.length > 1 && <MenuItem label=\"Source\" value={state.sources[state.currentSourceIndex]?.name || `Source ${state.currentSourceIndex + 1}`} onClick={() => setActiveMenu('sources')} hasSubmenu />}\r\n <MenuItem label=\"Speed\" value={`${state.playbackRate}x`} onClick={() => setActiveMenu('speed')} hasSubmenu />\r\n <MenuItem label=\"Quality\" value={state.currentQuality === -1 ? 'Auto' : `${state.qualityLevels[state.currentQuality]?.height}p`} onClick={() => setActiveMenu('quality')} hasSubmenu />\r\n <MenuItem label=\"Audio\" value={state.audioTracks[state.currentAudioTrack]?.label || 'Default'} onClick={() => setActiveMenu('audio')} hasSubmenu />\r\n {useFlip && <MenuItem label=\"Flip\" value={state.flipState.horizontal ? 'H' : state.flipState.vertical ? 'V' : 'Normal'} onClick={() => setActiveMenu('flip')} hasSubmenu />}\r\n {useAspectRatio && <MenuItem label=\"Aspect Ratio\" value={state.aspectRatio} onClick={() => setActiveMenu('ratio')} hasSubmenu />}\r\n <MenuDivider />\r\n <MenuItem label=\"Audio Boost\" value={state.audioGain > 1 ? `${state.audioGain}x` : 'Off'} onClick={() => setActiveMenu('boost')} hasSubmenu />\r\n <MenuItem label=\"Watch Party\" icon={<UsersIcon className=\"w-4 h-4\" />} onClick={() => setActiveMenu('party')} hasSubmenu />\r\n <MenuItem label=\"Cast to Device\" icon={<CastIcon className=\"w-4 h-4\" />} onClick={() => { player?.requestCast(); setSettingsOpen(false); }} />\r\n {/* Custom user settings appended */}\r\n {config.settings?.map((s, i) => (\r\n s.switch !== undefined ? (\r\n <div key={`cust-${i}`} className=\"px-1\">\r\n <Toggle\r\n label={s.html}\r\n icon={s.icon}\r\n checked={s.switch}\r\n tooltip={s.tooltip}\r\n onChange={(val: boolean) => { if (s.onSwitch) s.onSwitch(s); }}\r\n />\r\n </div>\r\n ) : (\r\n <MenuItem\r\n key={`cust-${i}`}\r\n label={s.html}\r\n icon={s.icon}\r\n onClick={() => {\r\n if (s.click) s.click();\r\n else if (s.onClick) s.onClick();\r\n setSettingsOpen(false);\r\n }}\r\n />\r\n )\r\n ))}\r\n <MenuDivider />\r\n <MenuItem label=\"Appearance\" icon={<PaletteIcon className=\"w-4 h-4\" />} onClick={() => setActiveMenu('appearance')} hasSubmenu />\r\n </div>\r\n )}\r\n {/* Submenus... (Logic remains same as previous phase, just collapsed here for brevity in rendering block, but included fully in final output) */}\r\n {['speed', 'quality', 'audio', 'boost', 'party', 'appearance', 'sources', 'flip', 'ratio'].includes(activeMenu) && (\r\n <div className=\"animate-in slide-in-from-right-4 fade-in duration-200\">\r\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)} />))}</>)}\r\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} />))}</>)}\r\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)} />))}</>)}\r\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)} />))}</>)}\r\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)} />))}</>)}\r\n {activeMenu === 'flip' && (\r\n <>\r\n <MenuHeader label=\"Video Flip\" onBack={() => setActiveMenu('main')} />\r\n <div className=\"p-2 space-y-1\">\r\n <Toggle label=\"Horizontal Flip\" checked={state.flipState.horizontal} onChange={() => player?.setFlip('horizontal')} />\r\n <Toggle label=\"Vertical Flip\" checked={state.flipState.vertical} onChange={() => player?.setFlip('vertical')} />\r\n </div>\r\n </>\r\n )}\r\n {activeMenu === 'ratio' && (\r\n <>\r\n <MenuHeader label=\"Aspect Ratio\" onBack={() => setActiveMenu('main')} />\r\n {['default', '16:9', '4:3'].map(r => (\r\n <MenuItem key={r} label={r === 'default' ? 'Default' : r} active={state.aspectRatio === r} onClick={() => player?.setAspectRatio(r)} />\r\n ))}\r\n </>\r\n )}\r\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></>)}\r\n {activeMenu === 'appearance' && (\r\n <>\r\n <MenuHeader label=\"Appearance\" onBack={() => setActiveMenu('main')} />\r\n <div className=\"pb-1\">\r\n <SettingsGroup title=\"Theme\">\r\n <div className=\"grid grid-cols-2 gap-2 px-3\">\r\n {THEMES.map(theme => (\r\n <button key={theme.value} onClick={() => player?.setAppearance({ theme: theme.value, themeColor: theme.color })} 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'}`} style={{ borderRadius: 'var(--radius)' }}>{theme.label}</button>\r\n ))}\r\n </div>\r\n </SettingsGroup>\r\n <SettingsGroup title=\"Icon Size\">\r\n <div className=\"grid grid-cols-3 gap-1 px-3\">\r\n {(['small', 'medium', 'large'] as const).map(s => (\r\n <button key={s} onClick={() => player?.setAppearance({ iconSize: s })} 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'}`} style={{ borderRadius: 'var(--radius)' }}>{s.charAt(0).toUpperCase() + s.slice(1)}</button>\r\n ))}\r\n </div>\r\n </SettingsGroup>\r\n <SettingsGroup title=\"Theme Color\">\r\n <div className=\"grid grid-cols-6 gap-2 px-3\">\r\n {THEME_COLORS.map(c => (\r\n <button key={c.value} title={c.label} onClick={() => player?.setAppearance({ themeColor: c.value })} 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'}`} style={{ backgroundColor: c.value, borderRadius: 'var(--radius-full)' }}>{state.themeColor === c.value && <CheckIcon className=\"w-3 h-3 text-white mx-auto stroke-[3]\" />}</button>\r\n ))}\r\n </div>\r\n <div className=\"px-3 pt-4\">\r\n <div className=\"flex items-center gap-3 bg-white/5 p-2 hover:bg-white/10 transition-colors group\" style={{ borderRadius: 'var(--radius)' }}>\r\n <div className=\"relative w-6 h-6 overflow-hidden ring-1 ring-white/20\" style={{ borderRadius: 'var(--radius-full)' }}>\r\n <input type=\"color\" value={state.themeColor} onChange={(e) => player?.setAppearance({ themeColor: e.target.value })} className=\"absolute inset-[-4px] w-[150%] h-[150%] cursor-pointer p-0 border-0\" />\r\n </div>\r\n <span className=\"text-xs text-zinc-400 font-medium group-hover:text-zinc-200\">Custom Color</span>\r\n <span className=\"text-[10px] font-mono text-zinc-500 ml-auto uppercase\">{state.themeColor}</span>\r\n </div>\r\n </div>\r\n </SettingsGroup>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div></Menu>)}\r\n </div>\r\n );\r\n default: return null;\r\n }\r\n };\r\n\r\n // --- Dynamic Context Menu ---\r\n const contextMenuItems: ContextMenuItem[] = useMemo(() => {\r\n const items: ContextMenuItem[] = [\r\n // Loop (Playback Group)\r\n { html: 'Playback', isLabel: true },\r\n {\r\n html: 'Loop',\r\n checked: state.isLooping,\r\n onClick: () => player?.toggleLoop()\r\n },\r\n { separator: true },\r\n\r\n // Flip (Transform Group)\r\n { html: 'Transform', isLabel: true },\r\n { html: 'Flip Horizontal', onClick: () => player?.setFlip('horizontal') },\r\n { html: 'Flip Vertical', onClick: () => player?.setFlip('vertical') },\r\n { separator: true },\r\n\r\n // Aspect Ratio Group\r\n { html: 'Aspect Ratio', isLabel: true },\r\n { html: 'Default', checked: state.aspectRatio === 'default', onClick: () => player?.setAspectRatio('default') },\r\n { html: '16:9', checked: state.aspectRatio === '16:9', onClick: () => player?.setAspectRatio('16:9') },\r\n { html: '4:3', checked: state.aspectRatio === '4:3', onClick: () => player?.setAspectRatio('4:3') },\r\n { separator: true },\r\n\r\n // Stats\r\n {\r\n html: 'Video Info',\r\n icon: <InfoIcon className=\"w-3.5 h-3.5\" />,\r\n onClick: () => setShowVideoInfo(true)\r\n },\r\n { separator: true }\r\n ];\r\n\r\n if (config.contextmenu) {\r\n items.push(...config.contextmenu);\r\n }\r\n\r\n // Branding\r\n items.push({\r\n html: <span className=\"text-zinc-500 text-xs font-semibold tracking-wide\">StrataPlayer</span>,\r\n disabled: true\r\n });\r\n\r\n // Always append Close at the very end\r\n items.push({\r\n html: 'Close',\r\n onClick: (close) => close(), // Wrapper handles close\r\n icon: <div className=\"text-red-400\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" /></svg></div>\r\n });\r\n\r\n return items;\r\n }, [config.contextmenu, state.aspectRatio, state.isLooping, player]);\r\n\r\n return (\r\n <div\r\n id={config.id}\r\n ref={containerRef}\r\n className={`group relative w-full h-full bg-black overflow-hidden select-none font-[family-name:var(--font-main)] outline-none rounded-[var(--radius)] text-zinc-100 strata-player-reset ${config.container || ''}`}\r\n // touch-action: manipulation improves tap response\r\n style={{ touchAction: 'manipulation', '--accent': state.themeColor } as React.CSSProperties}\r\n onMouseMove={handleMouseMove}\r\n onMouseLeave={() => { if (state.isPlaying && !settingsOpen && !subtitleMenuOpen && player) player.setControlsVisible(false); }}\r\n\r\n // Mouse Events\r\n onMouseDown={startFastForward}\r\n onMouseUp={stopFastForward}\r\n\r\n // Touch Events (Unified Gesture Logic)\r\n onTouchStart={handleTouchStart}\r\n onTouchMove={handleTouchMove}\r\n onTouchEnd={handleTouchEnd}\r\n\r\n onContextMenu={handleContextMenu}\r\n tabIndex={0}\r\n role=\"region\"\r\n aria-label=\"Video Player\"\r\n data-theme={state.theme}\r\n >\r\n {/* Same styles block as before */}\r\n <style>{`\r\n [data-theme=\"default\"] {\r\n --radius: 0.75rem;\r\n --radius-lg: 0.75rem;\r\n --radius-sm: 0.375rem;\r\n --radius-full: 9999px;\r\n --font-main: \"Inter\", sans-serif;\r\n --border-width: 0px;\r\n --bg-panel: rgba(9, 9, 11, 0.95);\r\n --tooltip-bg: #ffffff;\r\n --tooltip-text: #000000;\r\n --tooltip-border: 0px solid transparent;\r\n }\r\n [data-theme=\"pixel\"] {\r\n --radius: 0px;\r\n --radius-lg: 0px;\r\n --radius-sm: 0px;\r\n --radius-full: 0px;\r\n --font-main: \"Press Start 2P\", cursive;\r\n --border-width: 2px;\r\n --bg-panel: #000000;\r\n --tooltip-bg: #000000;\r\n --tooltip-text: #ffffff;\r\n --tooltip-border: 2px solid #ffffff;\r\n image-rendering: pixelated;\r\n }\r\n [data-theme=\"game\"] {\r\n --radius: 4px;\r\n --radius-lg: 6px;\r\n --radius-sm: 2px;\r\n --radius-full: 4px;\r\n --font-main: \"Cinzel\", serif;\r\n --border-width: 1px;\r\n --bg-panel: #0a0a0a;\r\n --tooltip-bg: #1a1a1a;\r\n --tooltip-text: #ffffff;\r\n --tooltip-border: 1px solid var(--accent);\r\n }\r\n [data-theme=\"hacker\"] {\r\n --radius: 0px;\r\n --radius-lg: 0px;\r\n --radius-sm: 0px;\r\n --radius-full: 0px;\r\n --font-main: \"JetBrains Mono\", monospace;\r\n --border-width: 1px;\r\n --bg-panel: #000000;\r\n --tooltip-bg: #000000;\r\n --tooltip-text: var(--accent);\r\n --tooltip-border: 1px solid var(--accent);\r\n text-shadow: 0 0 5px var(--accent);\r\n }\r\n \r\n [data-theme=\"pixel\"] .strata-control-btn {\r\n border: 2px solid white;\r\n background: black;\r\n }\r\n [data-theme=\"pixel\"] .strata-control-btn:hover {\r\n background: white;\r\n color: black;\r\n }\r\n [data-theme=\"pixel\"] .strata-range-input::-webkit-slider-thumb {\r\n border-radius: 0 !important;\r\n height: 16px !important;\r\n width: 16px !important;\r\n box-shadow: none !important;\r\n }\r\n \r\n [data-theme=\"hacker\"] .strata-scanlines {\r\n background: linear-gradient(\r\n to bottom,\r\n rgba(255,255,255,0),\r\n rgba(255,255,255,0) 50%,\r\n rgba(0,0,0,0.2) 50%,\r\n rgba(0,0,0,0.2)\r\n );\r\n background-size: 100% 4px;\r\n position: absolute;\r\n inset: 0;\r\n pointer-events: none;\r\n z-index: 40;\r\n }\r\n\r\n .strata-tooltip {\r\n background-color: var(--tooltip-bg);\r\n color: var(--tooltip-text);\r\n border: var(--tooltip-border);\r\n border-radius: var(--radius-sm);\r\n font-family: var(--font-main);\r\n }\r\n \r\n /* Override Backdrop for specific themes if needed */\r\n [data-theme=\"pixel\"] .strata-backdrop { backdrop-filter: none; background: #000; }\r\n [data-theme=\"hacker\"] .strata-backdrop { backdrop-filter: none; background: #000; }\r\n `}</style>\r\n\r\n {state.theme === 'hacker' && <div className=\"strata-scanlines\" />}\r\n\r\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>}\r\n {player && (\r\n <>\r\n {/* Custom Layers */}\r\n {config.layers?.map((layer, idx) => (\r\n <div\r\n key={idx}\r\n className={`absolute inset-0 pointer-events-none z-10 ${layer.className || ''}`}\r\n style={layer.style}\r\n >\r\n <HtmlOrNode content={layer.html || ''} className=\"w-full h-full\" />\r\n </div>\r\n ))}\r\n\r\n <NotificationContainer notifications={state.notifications} />\r\n <SubtitleOverlay cues={state.activeCues} settings={state.subtitleSettings} />\r\n\r\n {/* Main Interaction Layer */}\r\n <div className=\"absolute inset-0 z-0\" onClick={handleContainerClick} aria-hidden=\"true\" />\r\n\r\n {poster && !hasPlayed && (\r\n <div\r\n className=\"absolute inset-0 bg-cover bg-center z-[5] pointer-events-none\"\r\n style={{ backgroundImage: `url(${poster})` }}\r\n />\r\n )}\r\n\r\n {/* Context Menu */}\r\n {contextMenu.visible && (\r\n <ContextMenu\r\n x={contextMenu.x}\r\n y={contextMenu.y}\r\n items={contextMenuItems}\r\n onClose={() => setContextMenu({ ...contextMenu, visible: false })}\r\n containerWidth={playerWidth}\r\n containerHeight={playerHeight}\r\n />\r\n )}\r\n\r\n {/* Video Info Modal */}\r\n {showVideoInfo && player && (\r\n <VideoInfo player={player} onClose={() => setShowVideoInfo(false)} />\r\n )}\r\n\r\n {/* Fast Forward Overlay */}\r\n {isFastForwarding && (\r\n <div className=\"absolute top-8 left-1/2 -translate-x-1/2 bg-black/50 backdrop-blur-md px-4 py-2 rounded-full flex items-center gap-2 z-40 animate-in fade-in zoom-in duration-200\">\r\n <FastForwardIcon className=\"w-4 h-4 text-[var(--accent)] fill-current\" />\r\n <span className=\"text-xs font-bold tracking-wider\">2x Speed</span>\r\n </div>\r\n )}\r\n\r\n {/* Mobile Lock Button */}\r\n {useLock && state.controlsVisible && (\r\n <button\r\n onClick={(e) => { e.stopPropagation(); player.toggleLock(); }}\r\n className={`absolute left-4 md:left-6 bottom-24 md:bottom-28 z-50 p-3 rounded-full bg-black/50 backdrop-blur-md border border-white/10 text-white transition-all active:scale-95 ${state.isLocked ? 'text-[var(--accent)] bg-white/10' : 'hover:bg-white/10'}`}\r\n >\r\n {state.isLocked ? <LockIcon className=\"w-5 h-5\" /> : <UnlockIcon className=\"w-5 h-5\" />}\r\n </button>\r\n )}\r\n\r\n {seekAnimation && (\r\n <div\r\n key={seekAnimation.id}\r\n 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 fill-mode-forwards ${seekAnimation.type === 'rewind' ? 'left-0 rounded-r-[4rem]' : 'right-0 rounded-l-[4rem]'}`}\r\n onAnimationEnd={() => setSeekAnimation(null)}\r\n >\r\n <div className=\"flex flex-col items-center text-white drop-shadow-lg\">\r\n {seekAnimation.type === 'rewind' ? <Replay10Icon className=\"w-12 h-12 animate-pulse\" /> : <Forward10Icon className=\"w-12 h-12 animate-pulse\" />}\r\n <span className=\"font-bold text-sm mt-2 font-mono\">{seekAnimation.type === 'rewind' ? '-10s' : '+10s'}</span>\r\n </div>\r\n </div>\r\n )}\r\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>}\r\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>}\r\n\r\n {/* Center Controls - Hidden if locked or configured off */}\r\n {useCenterControls && !state.isLocked && (((!state.isPlaying && !state.isBuffering && !state.error) || state.controlsVisible) && !state.isBuffering) ? (\r\n <div\r\n className={`absolute inset-0 flex items-center justify-center z-10 transition-opacity duration-300 pointer-events-none ${state.controlsVisible || !state.isPlaying ? 'opacity-100' : 'opacity-0'}`}\r\n >\r\n <div className=\"flex items-center gap-8 md:gap-16 pointer-events-auto\">\r\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>\r\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>\r\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>\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {/* Bottom Control Bar - Hidden if locked */}\r\n <div\r\n 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 ${isControlsVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4 pointer-events-none'}`}\r\n onClick={(e) => { if (e.target === e.currentTarget) { setSettingsOpen(false); setSubtitleMenuOpen(false); setIsVolumeLocked(false); } e.stopPropagation(); }}\r\n >\r\n {/* Progress Bar (Hidden in Live Mode) */}\r\n {!config.isLive && (\r\n <div\r\n ref={progressBarRef}\r\n className=\"relative w-full h-3 group/slider mb-3 cursor-pointer touch-none flex items-center\"\r\n onMouseMove={handleProgressMove}\r\n onMouseLeave={() => { setHoverTime(null); setCurrentThumbnail(null); }}\r\n onMouseDown={handleSeekStart}\r\n onTouchStart={handleSeekStart}\r\n >\r\n {/* Highlights */}\r\n {config.highlight?.map((h, i) => (\r\n <div key={i} className=\"absolute top-1/2 -translate-y-1/2 w-1.5 h-1.5 bg-yellow-400 rounded-full z-10 pointer-events-none\" style={{ left: `${(h.time / state.duration) * 100}%` }} title={h.text} />\r\n ))}\r\n\r\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>)}\r\n\r\n {/* Track */}\r\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)' }}>\r\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}%` }} />))}\r\n <div className=\"absolute left-0 top-0 bottom-0 bg-[var(--accent)]\" style={{ width: `${((isScrubbing ? scrubbingTime : state.currentTime) / state.duration) * 100}%` }} />\r\n </div>\r\n\r\n {/* Thumb */}\r\n <div\r\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\"\r\n style={{\r\n left: `${((isScrubbing ? scrubbingTime : state.currentTime) / state.duration) * 100}%`,\r\n borderRadius: 'var(--radius-full)'\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-between pointer-events-auto\">\r\n <div className=\"flex items-center gap-3\">\r\n {controls.filter(c => c.position === 'left' || c.position === 'center').map(renderControl)}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1\">\r\n {controls.filter(c => c.position === 'right').map(renderControl)}\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\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\n\r\n// Export React Component\r\nexport { StrataPlayer };\r\n\r\n// Export Core & Plugins for advanced usage\r\nexport { StrataCore };\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","isFs","lockType","state","settings","val","seconds","s","ms","details","idx","total","title","_b","artwork","duration","position","playbackRate","message","isFatal","customMessage","error","delay","time","onCanPlay","finalMsg","buffered","tracks","t","track","index","url","retries","timeout","effectiveTimeout","i","controller","id","res","r","container","entries","entry","plugin","sources","wasPlaying","source","isRetry","srcObj","type","oldTracks","label","file","reader","content","blob","newTrackIndex","src","lang","isDefault","vol","safeVol","gain","visible","err","canvas","ctx","a","prev","direction","current","newState","scaleX","scaleY","ratio","w","initializeCastApi","isAvailable","castSession","mediaInfo","request","cues","newSettings","offset","currentOffset","delta","cue","notifId","response","contentLength","loaded","chunks","done","percent","n","newNotification","p","formatTime","h","m","fetchVttWithRetry","parseVTT","notify","lines","start","end","baseUrl","parseTime","parts","line","times","urlPart","hash","x","y","coords","useTransition","isActive","isMounted","setIsMounted","useState","isVisible","setIsVisible","useEffect","timer","toKebabCase","string","mergeClasses","classes","className","array","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","props","ArrowLeft","Bold","Camera","Captions","CaseUpper","Cast","Check","Clock","Download","Droplet","Eye","Info","LoaderCircle","LockOpen","Lock","Maximize","Minimize","Minus","Monitor","MoveVertical","Palette","Pause","PictureInPicture","Play","Plus","RefreshCcw","RotateCcw","RotateCw","Settings","SlidersHorizontal","Type","Upload","Users","Volume1","Volume2","VolumeX","X","Zap","PlayIcon","PauseIcon","VolumeHighIcon","VolumeLowIcon","VolumeMuteIcon","MaximizeIcon","MinimizeIcon","SettingsIcon","CheckIcon","PipIcon","SubtitleIcon","Subtitles","DownloadIcon","UploadIcon","ArrowLeftIcon","LoaderIcon","Loader2","CastIcon","UsersIcon","ClockIcon","MinusIcon","PlusIcon","CustomizeIcon","TypeIcon","PaletteIcon","EyeIcon","MoveVerticalIcon","ResetIcon","BoldIcon","CaseUpperIcon","BlurIcon","CameraIcon","LockIcon","UnlockIcon","Unlock","WebFullscreenIcon","FastForwardIcon","CloseIcon","InfoIcon","Replay10Icon","Forward10Icon","NotificationContainer","notifications","jsxs","jsx","SubtitleOverlay","getTextShadow","text","Menu","onClose","align","maxHeight","useRef","positionClasses","styleObj","RenderContent","MenuItem","active","onClick","hasSubmenu","icon","MenuHeader","onBack","rightAction","MenuDivider","Toggle","checked","onChange","tooltip","Slider","min","max","step","formatValue","Select","options","opt","SettingsGroup","SubtitleMenu","onSelect","onUpload","onSettingsChange","onReset","onOffsetChange","animationClass","view","setView","fileInputRef","Fragment","v","c","ContextMenu","items","containerWidth","containerHeight","menuRef","layout","setLayout","useLayoutEffect","rect","width","height","newLeft","newTop","availableHeight","handleClickOutside","item","React","VideoInfo","player","stats","setStats","q","k","THEME_COLORS","THEMES","HtmlOrNode","style","StrataPlayer","poster","autoPlay","thumbnails","textTracks","plugins","onGetInstance","useScreenshot","usePip","useSetting","useFullscreen","useFullscreenWeb","useLock","useFastForward","useFlip","useAspectRatio","useHotKey","isBackdrop","useGestureSeek","useCenterControls","fetchTimeout","containerRef","setPlayer","hasPlayed","setHasPlayed","playerHeight","setPlayerHeight","playerWidth","setPlayerWidth","useMemo","useSyncExternalStore","useCallback","settingsOpen","setSettingsOpen","subtitleMenuOpen","setSubtitleMenuOpen","activeMenu","setActiveMenu","contextMenu","setContextMenu","showVideoInfo","setShowVideoInfo","settingsTransition","subtitleTransition","isScrubbing","setIsScrubbing","scrubbingTime","setScrubbingTime","isVolumeScrubbing","setIsVolumeScrubbing","isVolumeHovered","setIsVolumeHovered","isVolumeLocked","setIsVolumeLocked","thumbnailCues","setThumbnailCues","hoverTime","setHoverTime","hoverPos","setHoverPos","currentThumbnail","setCurrentThumbnail","seekAnimation","setSeekAnimation","skipTrigger","setSkipTrigger","isFastForwarding","setIsFastForwarding","fastForwardTimerRef","originalRateRef","touchStartX","touchStartTime","isDraggingRef","clickTimeoutRef","controlsTimeoutRef","progressBarRef","volumeBarRef","animationCleanupRef","core","observer","updates","setCues","handleKeyDown","handleMouseMove","startFastForward","stopFastForward","handleTouchStart","handleTouchMove","deltaX","deltaRatio","newTime","handleTouchEnd","calculateTimeFromEvent","clientX","handleSeekStart","handleMove","moveEvent","handleUp","upEvent","calculateVolumeFromEvent","handleVolumeStart","handleProgressMove","triggerSkip","handleContainerClick","now","handleContextMenu","handleVolumeIconClick","isTouch","isMobile","VolIcon","menuMaxHeight","getIconClass","getButtonClass","iconClass","btnClass","center","isControlsVisible","isVolumeVisible","backdropClass","controls","existing","b","renderControl","_c","_d","rate","lvl","_e","theme","contextMenuItems","close","layer","range","mountStrataPlayer","root","createRoot","newProps"],"mappings":"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","x_google_ignoreList":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47]}
1
+ {"version":3,"file":"strataplayer.es.js","sources":["../core/EventBus.ts","../core/NanoStore.ts","../core/AudioEngine.ts","../core/StrataCore.ts","../utils/playerUtils.ts","../ui/hooks/useTransition.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/arrow-left.js","../node_modules/lucide-react/dist/esm/icons/bold.js","../node_modules/lucide-react/dist/esm/icons/camera.js","../node_modules/lucide-react/dist/esm/icons/captions.js","../node_modules/lucide-react/dist/esm/icons/case-upper.js","../node_modules/lucide-react/dist/esm/icons/cast.js","../node_modules/lucide-react/dist/esm/icons/check.js","../node_modules/lucide-react/dist/esm/icons/clock.js","../node_modules/lucide-react/dist/esm/icons/download.js","../node_modules/lucide-react/dist/esm/icons/droplet.js","../node_modules/lucide-react/dist/esm/icons/eye.js","../node_modules/lucide-react/dist/esm/icons/info.js","../node_modules/lucide-react/dist/esm/icons/loader-circle.js","../node_modules/lucide-react/dist/esm/icons/lock-open.js","../node_modules/lucide-react/dist/esm/icons/lock.js","../node_modules/lucide-react/dist/esm/icons/maximize.js","../node_modules/lucide-react/dist/esm/icons/minimize.js","../node_modules/lucide-react/dist/esm/icons/minus.js","../node_modules/lucide-react/dist/esm/icons/monitor.js","../node_modules/lucide-react/dist/esm/icons/move-vertical.js","../node_modules/lucide-react/dist/esm/icons/palette.js","../node_modules/lucide-react/dist/esm/icons/pause.js","../node_modules/lucide-react/dist/esm/icons/picture-in-picture.js","../node_modules/lucide-react/dist/esm/icons/play.js","../node_modules/lucide-react/dist/esm/icons/plus.js","../node_modules/lucide-react/dist/esm/icons/refresh-ccw.js","../node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../node_modules/lucide-react/dist/esm/icons/rotate-cw.js","../node_modules/lucide-react/dist/esm/icons/settings.js","../node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js","../node_modules/lucide-react/dist/esm/icons/type.js","../node_modules/lucide-react/dist/esm/icons/upload.js","../node_modules/lucide-react/dist/esm/icons/users.js","../node_modules/lucide-react/dist/esm/icons/volume-1.js","../node_modules/lucide-react/dist/esm/icons/volume-2.js","../node_modules/lucide-react/dist/esm/icons/volume-x.js","../node_modules/lucide-react/dist/esm/icons/x.js","../node_modules/lucide-react/dist/esm/icons/zap.js","../ui/Icons.tsx","../ui/components/NotificationContainer.tsx","../ui/components/SubtitleOverlay.tsx","../ui/components/Menu.tsx","../ui/components/SettingsPrimitives.tsx","../ui/components/SubtitleMenu.tsx","../ui/components/ContextMenu.tsx","../ui/components/VideoInfo.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","\r\nimport { EventBus, EventCallback } from './EventBus';\r\nimport { NanoStore } from './NanoStore';\r\nimport { AudioEngine } from './AudioEngine';\r\nimport React from 'react';\r\n\r\nexport interface Notification {\r\n id: string;\r\n message: string;\r\n type: 'info' | 'success' | 'warning' | 'error' | 'loading';\r\n duration?: number; // ms, if null then persistent\r\n progress?: number; // 0-100\r\n}\r\n\r\nexport interface TextTrackConfig {\r\n src: string;\r\n label: string;\r\n srcLang?: string;\r\n default?: boolean;\r\n kind?: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';\r\n}\r\n\r\nexport interface SubtitleSettings {\r\n useNative: boolean; // \"Native video subtitle\"\r\n fixCapitalization: boolean;\r\n backgroundOpacity: number; // 0-100\r\n backgroundBlur: boolean;\r\n backgroundBlurAmount: number; // px\r\n textSize: number; // % (100 = 1em)\r\n textStyle: 'none' | 'outline' | 'raised' | 'depressed' | 'shadow';\r\n isBold: boolean;\r\n textColor: string;\r\n verticalOffset: number; // px from bottom\r\n}\r\n\r\nexport const DEFAULT_SUBTITLE_SETTINGS: SubtitleSettings = {\r\n useNative: false,\r\n fixCapitalization: false,\r\n backgroundOpacity: 50,\r\n backgroundBlur: false,\r\n backgroundBlurAmount: 4,\r\n textSize: 100,\r\n textStyle: 'shadow',\r\n isBold: false,\r\n textColor: '#ffffff',\r\n verticalOffset: 40,\r\n};\r\n\r\nexport type PlayerTheme = 'default' | 'pixel' | 'game' | 'hacker';\r\n\r\nexport interface PlayerSource {\r\n url: string;\r\n type?: 'hls' | 'mp4' | 'webm' | 'dash' | 'mpegts' | 'webtorrent' | string;\r\n name?: string;\r\n}\r\n\r\nexport interface Highlight {\r\n time: number;\r\n text: string;\r\n}\r\n\r\n// --- Phase 2: New Interfaces ---\r\n\r\nexport interface LayerConfig {\r\n name?: string;\r\n html: string | React.ReactNode;\r\n style?: React.CSSProperties;\r\n className?: string;\r\n // Compatibility aliases\r\n click?: () => void;\r\n mounted?: (element: HTMLElement) => void;\r\n}\r\n\r\nexport interface ContextMenuItem {\r\n html?: string | React.ReactNode;\r\n disabled?: boolean;\r\n icon?: string | React.ReactNode;\r\n onClick?: (close: () => void) => void;\r\n click?: (close: () => void) => void; // Alias\r\n checked?: boolean; // Checkbox style\r\n\r\n // Formatting\r\n showBorder?: boolean; // Deprecated in favor of separator item, but kept for compat\r\n separator?: boolean; // Render as a divider line\r\n isLabel?: boolean; // Render as a category header/label\r\n}\r\n\r\nexport interface ControlItem {\r\n id?: string;\r\n position: 'left' | 'right' | 'center';\r\n index: number; // Order: 0-100\r\n html?: string | React.ReactNode; // Custom content\r\n tooltip?: string;\r\n onClick?: (core: StrataCore) => void;\r\n click?: (core: StrataCore) => void; // Alias\r\n className?: string;\r\n style?: React.CSSProperties;\r\n // Internal use for built-ins\r\n isBuiltIn?: boolean;\r\n builtInId?: string;\r\n}\r\n\r\nexport interface SettingItem {\r\n id?: string;\r\n html: string | React.ReactNode;\r\n icon?: string | React.ReactNode;\r\n tooltip?: string;\r\n // Toggle Switch Support\r\n switch?: boolean;\r\n onSwitch?: (item: SettingItem) => boolean | void;\r\n // Standard Action Support\r\n onClick?: () => void;\r\n click?: () => void; // Alias\r\n isDefault?: boolean; // Mark as one of the default settings\r\n}\r\n\r\nexport interface PlayerState {\r\n isPlaying: boolean;\r\n isBuffering: boolean;\r\n isLive: boolean;\r\n currentTime: number;\r\n duration: number;\r\n buffered: { start: number; end: number }[];\r\n volume: number;\r\n isMuted: boolean;\r\n audioGain: number;\r\n playbackRate: number;\r\n qualityLevels: { height: number; bitrate: number; index: number }[];\r\n currentQuality: number;\r\n audioTracks: { label: string; language: string; index: number }[];\r\n currentAudioTrack: number;\r\n error: string | null;\r\n isFullscreen: boolean;\r\n isPip: boolean;\r\n subtitleTracks: { label: string; language: string; index: number }[];\r\n currentSubtitle: number;\r\n subtitleOffset: number; // in seconds\r\n subtitleSettings: SubtitleSettings;\r\n activeCues: string[]; // For custom rendering\r\n viewMode: 'normal' | 'theater' | 'pip';\r\n notifications: Notification[];\r\n // Appearance\r\n iconSize: 'small' | 'medium' | 'large';\r\n themeColor: string;\r\n theme: PlayerTheme;\r\n // Sources\r\n sources: PlayerSource[];\r\n currentSourceIndex: number;\r\n\r\n // Phase 1 New Features State\r\n isLocked: boolean;\r\n flipState: { horizontal: boolean; vertical: boolean };\r\n aspectRatio: string; // 'default', '16:9', '4:3'\r\n isAutoSized: boolean; // tracks if autoSize (cover) is currently applied\r\n isLooping: boolean; // Track loop state reactively\r\n\r\n // UI State reflected in Core\r\n controlsVisible: boolean;\r\n}\r\n\r\nexport interface StrataConfig {\r\n // Basic\r\n container?: string; // Class for container\r\n id?: string;\r\n\r\n // Playback\r\n volume?: number;\r\n muted?: boolean;\r\n playbackRate?: number;\r\n audioGain?: number;\r\n loop?: boolean;\r\n playsInline?: boolean;\r\n isLive?: boolean;\r\n poster?: string; // Added to Config for Core access\r\n fetchTimeout?: number; // Default 30000ms\r\n\r\n // Appearance\r\n theme?: PlayerTheme;\r\n themeColor?: string;\r\n iconSize?: 'small' | 'medium' | 'large';\r\n backdrop?: boolean; // Blur effect\r\n autoSize?: boolean; // object-fit: cover logic\r\n\r\n // Subtitles\r\n subtitleSettings?: Partial<SubtitleSettings>;\r\n\r\n // UI Toggles\r\n screenshot?: boolean;\r\n setting?: boolean;\r\n pip?: boolean;\r\n fullscreen?: boolean;\r\n fullscreenWeb?: boolean;\r\n flip?: boolean;\r\n aspectRatio?: boolean;\r\n highlight?: Highlight[];\r\n centerControls?: boolean; // Default true\r\n\r\n // Controls / Mobile\r\n hotKey?: boolean;\r\n lock?: boolean; // Mobile lock button\r\n gesture?: boolean; // Mobile gestures\r\n gestureSeek?: boolean; // Drag to seek on mobile. Default false.\r\n fastForward?: boolean; // Long press\r\n autoOrientation?: boolean; // Mobile landscape lock (default: true)\r\n\r\n // Phase 2: Customization\r\n layers?: LayerConfig[];\r\n contextmenu?: ContextMenuItem[];\r\n controls?: ControlItem[];\r\n settings?: SettingItem[]; // Append to main menu\r\n\r\n // System\r\n useSSR?: boolean;\r\n disablePersistence?: boolean;\r\n}\r\n\r\nconst STORAGE_KEY = 'strata-settings';\r\n\r\nexport const DEFAULT_STATE: PlayerState = {\r\n isPlaying: false,\r\n isBuffering: false,\r\n isLive: false,\r\n currentTime: 0,\r\n duration: 0,\r\n buffered: [],\r\n volume: 1,\r\n isMuted: false,\r\n audioGain: 1,\r\n playbackRate: 1,\r\n qualityLevels: [],\r\n currentQuality: -1,\r\n audioTracks: [],\r\n currentAudioTrack: -1,\r\n error: null,\r\n isFullscreen: false,\r\n isPip: false,\r\n subtitleTracks: [],\r\n currentSubtitle: -1,\r\n subtitleOffset: 0,\r\n subtitleSettings: DEFAULT_SUBTITLE_SETTINGS,\r\n activeCues: [],\r\n viewMode: 'normal',\r\n notifications: [],\r\n iconSize: 'medium',\r\n themeColor: '#6366f1',\r\n theme: 'default',\r\n sources: [],\r\n currentSourceIndex: -1,\r\n // New State Defaults\r\n isLocked: false,\r\n flipState: { horizontal: false, vertical: false },\r\n aspectRatio: 'default',\r\n isAutoSized: false,\r\n isLooping: false,\r\n controlsVisible: true\r\n};\r\n\r\n// Helper to merge Defaults -> LocalStorage -> Config\r\nexport const getResolvedState = (config: StrataConfig = {}): PlayerState => {\r\n let saved: any = {};\r\n if (!config.disablePersistence && typeof window !== 'undefined') {\r\n try {\r\n const raw = localStorage.getItem(STORAGE_KEY);\r\n if (raw) saved = JSON.parse(raw);\r\n } catch (e) { /* ignore */ }\r\n }\r\n\r\n const mergedSubtitleSettings = {\r\n ...DEFAULT_SUBTITLE_SETTINGS,\r\n ...(saved.subtitleSettings || {}),\r\n ...(config.subtitleSettings || {})\r\n };\r\n\r\n return {\r\n ...DEFAULT_STATE,\r\n ...saved, // Load saved first\r\n // Override with config if present (not undefined)\r\n volume: config.volume ?? saved.volume ?? DEFAULT_STATE.volume,\r\n isMuted: config.muted ?? saved.isMuted ?? DEFAULT_STATE.isMuted,\r\n playbackRate: config.playbackRate ?? saved.playbackRate ?? DEFAULT_STATE.playbackRate,\r\n audioGain: config.audioGain ?? saved.audioGain ?? DEFAULT_STATE.audioGain,\r\n theme: config.theme ?? saved.theme ?? DEFAULT_STATE.theme,\r\n themeColor: config.themeColor ?? saved.themeColor ?? DEFAULT_STATE.themeColor,\r\n iconSize: config.iconSize ?? saved.iconSize ?? DEFAULT_STATE.iconSize,\r\n subtitleSettings: mergedSubtitleSettings,\r\n // Config overrides state for these visual modes\r\n isAutoSized: config.autoSize ?? DEFAULT_STATE.isAutoSized,\r\n isLive: config.isLive ?? saved.isLive ?? DEFAULT_STATE.isLive,\r\n isLooping: config.loop ?? saved.isLooping ?? DEFAULT_STATE.isLooping\r\n };\r\n};\r\n\r\nexport interface IPlugin {\r\n name: string;\r\n init(core: StrataCore): void;\r\n destroy?(): void;\r\n}\r\n\r\nexport class StrataCore {\r\n public video: HTMLVideoElement;\r\n public container: HTMLElement | null = null;\r\n public events: EventBus;\r\n public store: NanoStore<PlayerState>;\r\n private plugins: Map<string, IPlugin> = new Map();\r\n private audioEngine: AudioEngine;\r\n public config: StrataConfig;\r\n private resizeObserver: ResizeObserver | null = null;\r\n\r\n // Retry Logic\r\n private retryCount = 0;\r\n private maxRetries = 5;\r\n private retryTimer: any = null;\r\n private currentSource: PlayerSource | null = null;\r\n private currentSrc: string = '';\r\n private currentTracks: TextTrackConfig[] = [];\r\n\r\n // Cast\r\n private castInitialized = false;\r\n\r\n private boundCueChange: () => void;\r\n private boundFullscreenChange: () => void;\r\n\r\n constructor(config: StrataConfig = {}, videoElement?: HTMLVideoElement) {\r\n this.config = config;\r\n // Set Defaults\r\n this.config.autoOrientation = this.config.autoOrientation ?? true;\r\n this.config.fetchTimeout = this.config.fetchTimeout ?? 30000;\r\n this.config.centerControls = this.config.centerControls ?? true;\r\n this.config.gestureSeek = this.config.gestureSeek ?? false;\r\n\r\n this.video = videoElement || document.createElement('video');\r\n this.video.crossOrigin = \"anonymous\";\r\n\r\n // Init Config Props to Video\r\n if (config.playsInline !== false) this.video.playsInline = true;\r\n\r\n this.events = new EventBus();\r\n\r\n // Initialize Store with resolved state\r\n const initialState = getResolvedState(config);\r\n this.store = new NanoStore(initialState);\r\n\r\n this.audioEngine = new AudioEngine(this.video);\r\n this.boundCueChange = this.handleCueChange.bind(this);\r\n\r\n // Bind fullscreen listener once\r\n this.boundFullscreenChange = () => {\r\n const isFs = !!document.fullscreenElement;\r\n this.store.setState({ isFullscreen: isFs });\r\n this.emit('resize');\r\n this.emit(isFs ? 'fullscreen' : 'fullscreen_exit');\r\n\r\n // Auto Orientation logic\r\n if (isFs && this.config.autoOrientation && screen.orientation && 'lock' in screen.orientation) {\r\n // Basic logic: if video width > height, lock landscape\r\n const isLandscape = this.video.videoWidth > this.video.videoHeight;\r\n const lockType = isLandscape ? 'landscape' : 'portrait';\r\n try {\r\n // @ts-ignore\r\n screen.orientation.lock(lockType).catch(() => { });\r\n } catch (e) { }\r\n } else if (!isFs && screen.orientation && 'unlock' in screen.orientation) {\r\n // @ts-ignore\r\n screen.orientation.unlock();\r\n }\r\n };\r\n\r\n // Apply initial state to video element\r\n this.video.volume = initialState.volume;\r\n this.video.muted = initialState.isMuted;\r\n this.video.playbackRate = initialState.playbackRate;\r\n this.video.loop = initialState.isLooping; // Apply loop state\r\n\r\n if (initialState.audioGain > 1) {\r\n this.audioEngine.setGain(initialState.audioGain);\r\n }\r\n // Apply AutoSize\r\n if (initialState.isAutoSized) {\r\n this.video.style.objectFit = 'cover';\r\n }\r\n\r\n this.initVideoListeners();\r\n this.initMediaSession();\r\n this.initCast();\r\n\r\n // Persistence Subscriber\r\n if (!config.disablePersistence) {\r\n this.store.subscribe((state) => {\r\n const settings = {\r\n volume: state.volume,\r\n isMuted: state.isMuted,\r\n playbackRate: state.playbackRate,\r\n subtitleSettings: state.subtitleSettings,\r\n iconSize: state.iconSize,\r\n themeColor: state.themeColor,\r\n theme: state.theme,\r\n isLive: state.isLive,\r\n isLooping: state.isLooping\r\n };\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\r\n });\r\n }\r\n }\r\n\r\n // --- Instance Properties ---\r\n\r\n get playing() { return !this.video.paused && !this.video.ended && this.video.readyState > 2; }\r\n\r\n get currentTime() { return this.video.currentTime; }\r\n set currentTime(val: number) { this.seek(val); }\r\n\r\n get duration() { return this.video.duration || 0; }\r\n\r\n get paused() { return this.video.paused; }\r\n\r\n get volume() { return this.video.volume; }\r\n set volume(val: number) { this.setVolume(val); }\r\n\r\n get muted() { return this.video.muted; }\r\n set muted(val: boolean) {\r\n this.video.muted = val;\r\n this.store.setState({ isMuted: val });\r\n }\r\n\r\n get playbackRate() { return this.video.playbackRate; }\r\n set playbackRate(val: number) { this.video.playbackRate = val; }\r\n\r\n get loop() { return this.video.loop; }\r\n set loop(val: boolean) {\r\n this.video.loop = val;\r\n this.store.setState({ isLooping: val });\r\n }\r\n\r\n // --- Instance Methods ---\r\n\r\n forward(seconds: number = 10) { this.skip(seconds); }\r\n backward(seconds: number = 10) { this.skip(-seconds); }\r\n\r\n // --- Event API ---\r\n\r\n on(event: string, callback: EventCallback) { return this.events.on(event, callback); }\r\n off(event: string, callback: EventCallback) { return this.events.off(event, callback); }\r\n emit(event: string, data?: any) { return this.events.emit(event, data); }\r\n\r\n private initVideoListeners() {\r\n const s = (partial: Partial<PlayerState>) => this.store.setState(partial);\r\n\r\n const events = [\r\n 'abort', 'canplay', 'canplaythrough', 'durationchange', 'emptied', 'ended', 'error',\r\n 'loadeddata', 'loadedmetadata', 'loadstart', 'pause', 'play', 'playing', 'progress',\r\n 'ratechange', 'seeked', 'seeking', 'stalled', 'suspend', 'timeupdate', 'volumechange', 'waiting'\r\n ];\r\n\r\n // Standard video event proxying\r\n events.forEach(event => {\r\n this.video.addEventListener(event, (e) => {\r\n // 1. Emit namespaced event (e.g. video:timeupdate)\r\n this.emit(`video:${event}`, e);\r\n\r\n // 2. Emit core events (e.g. play, pause)\r\n if (event === 'play') this.emit('play');\r\n if (event === 'pause') this.emit('pause');\r\n if (event === 'ended') this.emit('ended');\r\n if (event === 'error') this.emit('error', this.video.error);\r\n if (event === 'seeked') this.emit('seek');\r\n\r\n // 3. Update internal store for UI\r\n switch (event) {\r\n case 'play':\r\n s({ isPlaying: true });\r\n if ('mediaSession' in navigator) navigator.mediaSession.playbackState = 'playing';\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'pause':\r\n s({ isPlaying: false });\r\n if ('mediaSession' in navigator) navigator.mediaSession.playbackState = 'paused';\r\n break;\r\n case 'ended':\r\n s({ isPlaying: false });\r\n if ('mediaSession' in navigator) navigator.mediaSession.playbackState = 'paused';\r\n break;\r\n\r\n case 'waiting':\r\n s({ isBuffering: true });\r\n this.emit('loading', true);\r\n break;\r\n case 'playing':\r\n s({ isBuffering: false });\r\n this.emit('loading', false);\r\n break;\r\n case 'canplay':\r\n s({ isBuffering: false });\r\n this.emit('loading', false);\r\n break;\r\n\r\n case 'loadeddata':\r\n s({ isBuffering: false });\r\n this.retryCount = 0;\r\n this.removeNotification('retry');\r\n if (this.store.get().error) s({ error: null });\r\n break;\r\n case 'loadedmetadata':\r\n this.updateMediaSessionMetadata();\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'timeupdate':\r\n if (!this.video.seeking) s({ currentTime: this.video.currentTime });\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'seeked':\r\n s({ currentTime: this.video.currentTime });\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'durationchange':\r\n s({ duration: this.video.duration });\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'volumechange': s({ volume: this.video.volume, isMuted: this.video.muted }); break;\r\n case 'ratechange':\r\n s({ playbackRate: this.video.playbackRate });\r\n this.updateMediaSessionPosition();\r\n break;\r\n case 'error': this.handleError(); break;\r\n case 'progress': this.updateBuffer(); break;\r\n case 'enterpictureinpicture': s({ isPip: true }); break;\r\n case 'leavepictureinpicture': s({ isPip: false }); break;\r\n }\r\n });\r\n });\r\n\r\n // PiP events are not in the standard list above usually\r\n this.video.addEventListener('enterpictureinpicture', () => {\r\n s({ isPip: true });\r\n this.emit('pip', true);\r\n });\r\n this.video.addEventListener('leavepictureinpicture', () => {\r\n s({ isPip: false });\r\n this.emit('pip', false);\r\n });\r\n\r\n // Global fullscreen listener to catch Esc key or browser button\r\n document.addEventListener('fullscreenchange', this.boundFullscreenChange);\r\n\r\n this.video.textTracks.addEventListener('addtrack', this.updateSubtitles.bind(this));\r\n this.video.textTracks.addEventListener('removetrack', this.updateSubtitles.bind(this));\r\n }\r\n\r\n // --- Media Session API ---\r\n\r\n private initMediaSession() {\r\n if (!('mediaSession' in navigator)) return;\r\n\r\n const ms = navigator.mediaSession;\r\n\r\n ms.setActionHandler('play', () => this.play());\r\n ms.setActionHandler('pause', () => this.pause());\r\n ms.setActionHandler('seekbackward', (details) => this.skip(details.seekOffset ? -details.seekOffset : -10));\r\n ms.setActionHandler('seekforward', (details) => this.skip(details.seekOffset || 10));\r\n ms.setActionHandler('seekto', (details) => {\r\n if (details.seekTime !== undefined) this.seek(details.seekTime);\r\n });\r\n ms.setActionHandler('stop', () => {\r\n this.pause();\r\n this.seek(0);\r\n });\r\n // Playlist controls\r\n ms.setActionHandler('previoustrack', () => {\r\n const idx = this.store.get().currentSourceIndex;\r\n if (idx > 0) this.switchSource(idx - 1);\r\n });\r\n ms.setActionHandler('nexttrack', () => {\r\n const idx = this.store.get().currentSourceIndex;\r\n const total = this.store.get().sources.length;\r\n if (idx < total - 1) this.switchSource(idx + 1);\r\n });\r\n }\r\n\r\n private updateMediaSessionMetadata() {\r\n if (!('mediaSession' in navigator)) return;\r\n\r\n const title = this.currentSource?.name || this.currentSource?.url.split('/').pop() || 'Video';\r\n\r\n const artwork = [];\r\n\r\n // 1. Prioritize configured poster or source-specific poster\r\n if (this.config.poster) {\r\n artwork.push({ src: this.config.poster, sizes: '512x512', type: 'image/jpeg' });\r\n }\r\n\r\n // 2. Fallback to relative logo path.\r\n // This avoids using import.meta.env.BASE_URL which crashes in some environments.\r\n // The browser resolves this relative to the current document's base URL.\r\n artwork.push({ src: 'logo.png', sizes: '512x512', type: 'image/png' });\r\n\r\n navigator.mediaSession.metadata = new MediaMetadata({\r\n title: title,\r\n artist: 'StrataPlayer',\r\n artwork: artwork\r\n });\r\n }\r\n\r\n private updateMediaSessionPosition() {\r\n if (!('mediaSession' in navigator)) return;\r\n\r\n const duration = this.video.duration;\r\n const position = this.video.currentTime;\r\n const playbackRate = this.video.playbackRate;\r\n\r\n if (!isNaN(duration) && isFinite(duration) && !isNaN(position)) {\r\n try {\r\n navigator.mediaSession.setPositionState({\r\n duration: Math.max(0, duration),\r\n playbackRate,\r\n position: Math.max(0, Math.min(position, duration)) // Ensure within [0, duration]\r\n });\r\n } catch (e) {\r\n console.warn(\"MediaSession Position Error:\", e);\r\n }\r\n }\r\n }\r\n\r\n public triggerError(message: string, isFatal: boolean = false) {\r\n if (isFatal) {\r\n this.handleError(message);\r\n } else {\r\n this.notify({ type: 'warning', message: `Warning: ${message}`, duration: 5000 });\r\n }\r\n }\r\n\r\n private handleError(customMessage?: string) {\r\n const error = this.video.error;\r\n const message = customMessage || error?.message || (error ? `Code ${error.code}` : 'Unknown Error');\r\n\r\n this.removeNotification('retry');\r\n this.emit('video:error', error); // Emitting video:error separately\r\n\r\n if (this.retryCount < this.maxRetries) {\r\n this.retryCount++;\r\n const delay = Math.pow(2, this.retryCount - 1) * 1500;\r\n\r\n this.notify({\r\n id: 'retry',\r\n type: 'loading',\r\n message: `Error: ${message}. Retrying (${this.retryCount}/${this.maxRetries})...`,\r\n });\r\n\r\n console.warn(`[StrataPlayer] Error: ${message}. Retrying in ${delay}ms...`);\r\n\r\n if (this.retryTimer) clearTimeout(this.retryTimer);\r\n this.retryTimer = setTimeout(() => {\r\n if (this.currentSource) {\r\n this.load(this.currentSource, this.currentTracks, true); // True = isRetry\r\n\r\n const time = this.store.get().currentTime;\r\n if (time > 0) {\r\n const onCanPlay = () => {\r\n this.video.currentTime = time;\r\n this.video.removeEventListener('canplay', onCanPlay);\r\n };\r\n this.video.addEventListener('canplay', onCanPlay);\r\n }\r\n }\r\n }, delay);\r\n } else {\r\n // Final failure\r\n this.removeNotification('retry');\r\n const finalMsg = `Failed to play after ${this.maxRetries} attempts: ${message}`;\r\n this.store.setState({ error: finalMsg });\r\n this.emit('error', finalMsg);\r\n }\r\n }\r\n\r\n private updateBuffer() {\r\n const buffered: { start: number; end: number }[] = [];\r\n for (let i = 0; i < this.video.buffered.length; i++) {\r\n buffered.push({\r\n start: this.video.buffered.start(i),\r\n end: this.video.buffered.end(i)\r\n });\r\n }\r\n this.store.setState({ buffered });\r\n }\r\n\r\n private updateSubtitles() {\r\n setTimeout(() => {\r\n const tracks = Array.from(this.video.textTracks)\r\n .filter(t => t.kind === 'subtitles' || t.kind === 'captions')\r\n .map((track, index) => ({\r\n label: track.label || track.language || `Track ${index + 1}`,\r\n language: track.language,\r\n index: index\r\n }));\r\n this.store.setState({ subtitleTracks: tracks });\r\n\r\n // Restore persisted selection if applicable and tracks exist\r\n const state = this.store.get();\r\n if (state.currentSubtitle !== -1 && tracks.length > 0 && state.currentSubtitle < tracks.length) {\r\n this.setSubtitle(state.currentSubtitle);\r\n }\r\n }, 50);\r\n }\r\n\r\n // --- Utility ---\r\n\r\n async fetchWithRetry(url: string, retries = 3, timeout?: number): Promise<Response> {\r\n const effectiveTimeout = timeout ?? this.config.fetchTimeout ?? 30000;\r\n for (let i = 0; i < retries; i++) {\r\n const controller = new AbortController();\r\n const id = setTimeout(() => controller.abort(), effectiveTimeout);\r\n try {\r\n const res = await fetch(url, { signal: controller.signal });\r\n clearTimeout(id);\r\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\r\n return res;\r\n } catch (e: any) {\r\n clearTimeout(id);\r\n if (i === retries - 1) throw e;\r\n // If it's an abort error, warn\r\n if (e.name === 'AbortError') console.warn(`Fetch timeout (${effectiveTimeout}ms) for ${url}`);\r\n await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i)));\r\n }\r\n }\r\n throw new Error('Fetch failed');\r\n }\r\n\r\n // --- Core Methods ---\r\n\r\n attach(container: HTMLElement) {\r\n this.container = container;\r\n if (!this.container.contains(this.video)) {\r\n this.video.style.width = '100%';\r\n this.video.style.height = '100%';\r\n this.video.style.objectFit = this.store.get().isAutoSized ? 'cover' : 'contain';\r\n this.video.style.backgroundColor = 'black';\r\n this.container.appendChild(this.video);\r\n }\r\n\r\n // Setup Resize Observer\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n this.emit('resize', { width: entry.contentRect.width, height: entry.contentRect.height });\r\n }\r\n });\r\n this.resizeObserver.observe(this.container);\r\n\r\n // Emit ready event\r\n this.emit('ready');\r\n }\r\n\r\n use(plugin: IPlugin) {\r\n if (this.plugins.has(plugin.name)) return;\r\n plugin.init(this);\r\n this.plugins.set(plugin.name, plugin);\r\n }\r\n\r\n setSources(sources: PlayerSource[], tracks: TextTrackConfig[] = []) {\r\n this.store.setState({ sources });\r\n this.currentTracks = tracks;\r\n if (sources.length > 0) {\r\n this.load(sources[0], tracks);\r\n }\r\n }\r\n\r\n switchSource(index: number) {\r\n const sources = this.store.get().sources;\r\n if (index >= 0 && index < sources.length) {\r\n const time = this.video.currentTime;\r\n const wasPlaying = !this.video.paused;\r\n\r\n this.load(sources[index], this.currentTracks);\r\n\r\n const onCanPlay = () => {\r\n this.video.currentTime = time;\r\n if (wasPlaying) this.video.play();\r\n this.video.removeEventListener('canplay', onCanPlay);\r\n };\r\n this.video.addEventListener('canplay', onCanPlay);\r\n }\r\n }\r\n\r\n load(source: PlayerSource | string, tracks: TextTrackConfig[] = [], isRetry = false) {\r\n if (this.retryTimer) clearTimeout(this.retryTimer);\r\n\r\n // Normalize string input to PlayerSource\r\n const srcObj: PlayerSource = typeof source === 'string' ? { url: source, type: 'auto' } : source;\r\n\r\n if (!isRetry) {\r\n this.retryCount = 0;\r\n this.store.setState({ error: null });\r\n this.removeNotification('retry');\r\n }\r\n\r\n this.currentSrc = srcObj.url;\r\n this.currentSource = srcObj;\r\n this.currentTracks = tracks;\r\n\r\n // Update index state if part of playlist\r\n const allSources = this.store.get().sources;\r\n const index = allSources.findIndex(s => s.url === srcObj.url);\r\n this.store.setState({\r\n isBuffering: true,\r\n qualityLevels: [],\r\n currentQuality: -1, // Reset quality to Auto on source switch\r\n audioTracks: [],\r\n currentAudioTrack: -1, // Reset audio track\r\n // subtitleTracks and currentSubtitle are purposely preserved\r\n currentSourceIndex: index\r\n });\r\n\r\n // Update Metadata early\r\n this.updateMediaSessionMetadata();\r\n\r\n // Determine type if auto\r\n let type = srcObj.type || 'auto';\r\n if (type === 'auto') {\r\n if (srcObj.url.includes('.m3u8')) type = 'hls';\r\n else if (srcObj.url.includes('.mpd')) type = 'dash';\r\n else if (srcObj.url.includes('.flv') || srcObj.url.includes('.ts')) type = 'mpegts';\r\n else if (srcObj.url.startsWith('magnet:') || srcObj.url.includes('.torrent')) type = 'webtorrent';\r\n else type = 'mp4';\r\n }\r\n\r\n // Emit load event with source details so plugins can decide to act\r\n this.events.emit('load', { url: srcObj.url, type });\r\n\r\n const oldTracks = this.video.getElementsByTagName('track');\r\n while (oldTracks.length > 0) {\r\n oldTracks[0].remove();\r\n }\r\n\r\n if (tracks.length > 0) {\r\n tracks.forEach(t => {\r\n this.fetchWithRetry(t.src).then(() => {\r\n this.addTextTrackInternal(t.src, t.label, t.srcLang, t.default);\r\n }).catch(e => {\r\n this.notify({ type: 'warning', message: `Failed to load subtitle: ${t.label}`, duration: 4000 });\r\n });\r\n });\r\n }\r\n\r\n // If it's standard MP4/WebM, set src directly. Plugins handle HLS/Dash/Mpegts/WebTorrent.\r\n if (type === 'mp4' || type === 'webm' || type === 'ogg') {\r\n this.video.src = srcObj.url;\r\n }\r\n }\r\n\r\n // Wrapper for external subtitle API\r\n public loadSubtitle(url: string, label: string = 'Subtitle') {\r\n this.addTextTrackInternal(url, label, undefined, true);\r\n }\r\n\r\n public addTextTrack(file: File, label: string) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n if (!e.target?.result) return;\r\n let content = e.target.result as string;\r\n if (file.name.toLowerCase().endsWith('.srt') || !content.trim().startsWith('WEBVTT')) {\r\n content = content.replace(/(\\d{2}:\\d{2}:\\d{2}),(\\d{3})/g, '$1.$2');\r\n if (!content.trim().startsWith('WEBVTT')) {\r\n content = 'WEBVTT\\n\\n' + content;\r\n }\r\n }\r\n const blob = new Blob([content], { type: 'text/vtt' });\r\n const url = URL.createObjectURL(blob);\r\n this.addTextTrackInternal(url, label, 'user', true);\r\n\r\n setTimeout(() => {\r\n const tracks = this.store.get().subtitleTracks;\r\n const newTrackIndex = tracks.findIndex(t => t.label === label);\r\n if (newTrackIndex !== -1) {\r\n this.setSubtitle(newTrackIndex);\r\n this.notify({ type: 'success', message: 'Subtitle uploaded', duration: 3000 });\r\n }\r\n }, 200);\r\n };\r\n reader.onerror = () => {\r\n this.notify({ type: 'error', message: 'Failed to read file', duration: 3000 });\r\n };\r\n reader.readAsText(file);\r\n }\r\n\r\n private addTextTrackInternal(src: string, label: string, lang: string = '', isDefault: boolean = false) {\r\n const track = document.createElement('track');\r\n track.kind = 'subtitles';\r\n track.label = label;\r\n track.src = src;\r\n track.srclang = lang;\r\n if (isDefault) track.default = true;\r\n this.video.appendChild(track);\r\n this.updateSubtitles();\r\n }\r\n\r\n play() { return this.video.play(); }\r\n pause() { return this.video.pause(); }\r\n togglePlay() { this.video.paused ? this.play() : this.pause(); }\r\n\r\n seek(time: number) {\r\n if (isNaN(time)) return;\r\n const t = Math.max(0, Math.min(time, this.video.duration));\r\n this.store.setState({ currentTime: t });\r\n this.video.currentTime = t;\r\n }\r\n\r\n skip(seconds: number) {\r\n this.seek(this.video.currentTime + seconds);\r\n }\r\n\r\n setVolume(vol: number) {\r\n const safeVol = Math.max(0, Math.min(vol, 1));\r\n this.video.volume = safeVol;\r\n if (safeVol > 0 && this.video.muted) this.video.muted = false;\r\n if (safeVol === 0) this.video.muted = true;\r\n }\r\n\r\n toggleMute() {\r\n this.video.muted = !this.video.muted;\r\n }\r\n\r\n setAudioGain(gain: number) {\r\n this.store.setState({ audioGain: gain });\r\n this.audioEngine.setGain(gain);\r\n }\r\n\r\n setQuality(index: number) {\r\n this.store.setState({ currentQuality: index });\r\n this.events.emit('quality-request', index);\r\n }\r\n\r\n setAudioTrack(index: number) {\r\n this.store.setState({ currentAudioTrack: index });\r\n this.events.emit('audio-track-request', index);\r\n }\r\n\r\n setControlsVisible(visible: boolean) {\r\n if (this.store.get().controlsVisible !== visible) {\r\n this.store.setState({ controlsVisible: visible });\r\n this.emit('control', visible);\r\n }\r\n }\r\n\r\n async toggleFullscreen() {\r\n if (!this.container) return;\r\n try {\r\n if (!document.fullscreenElement) {\r\n await this.container.requestFullscreen();\r\n // Orientation lock handled in boundFullscreenChange\r\n } else {\r\n await document.exitFullscreen();\r\n }\r\n } catch (err) {\r\n console.error('Fullscreen toggle failed', err);\r\n }\r\n }\r\n\r\n togglePip() {\r\n if (document.pictureInPictureElement) {\r\n document.exitPictureInPicture();\r\n } else if (this.video !== document.pictureInPictureElement && (this.video as any).requestPictureInPicture) {\r\n (this.video as any).requestPictureInPicture();\r\n }\r\n }\r\n\r\n screenshot() {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = this.video.videoWidth;\r\n canvas.height = this.video.videoHeight;\r\n const ctx = canvas.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(this.video, 0, 0, canvas.width, canvas.height);\r\n try {\r\n const url = canvas.toDataURL('image/png');\r\n const a = document.createElement('a');\r\n a.download = `screenshot-${new Date().toISOString()}.png`;\r\n a.href = url;\r\n a.click();\r\n this.notify({ type: 'success', message: 'Screenshot saved', duration: 2000 });\r\n } catch (e) {\r\n this.notify({ type: 'error', message: 'Failed to take screenshot', duration: 3000 });\r\n }\r\n }\r\n }\r\n\r\n toggleLock() {\r\n this.store.setState((prev) => ({ isLocked: !prev.isLocked }));\r\n }\r\n\r\n toggleLoop() {\r\n this.video.loop = !this.video.loop;\r\n this.store.setState({ isLooping: this.video.loop });\r\n this.notify({ type: 'info', message: `Loop: ${this.video.loop ? 'On' : 'Off'}`, duration: 1500 });\r\n }\r\n\r\n setFlip(direction: 'horizontal' | 'vertical') {\r\n const current = this.store.get().flipState;\r\n const newState = {\r\n ...current,\r\n [direction]: !current[direction]\r\n };\r\n this.store.setState({ flipState: newState });\r\n\r\n const scaleX = newState.horizontal ? -1 : 1;\r\n const scaleY = newState.vertical ? -1 : 1;\r\n this.video.style.transform = `scale(${scaleX}, ${scaleY})`;\r\n }\r\n\r\n setAspectRatio(ratio: string) {\r\n // ratio: 'default' | '16:9' | '4:3'\r\n this.store.setState({ aspectRatio: ratio });\r\n\r\n if (ratio === 'default') {\r\n this.video.style.objectFit = this.store.get().isAutoSized ? 'cover' : 'contain';\r\n // Reset explicit sizing\r\n this.video.style.width = '100%';\r\n this.video.style.height = '100%';\r\n return;\r\n }\r\n\r\n this.video.style.objectFit = 'contain';\r\n this.notify({ type: 'info', message: `Aspect Ratio: ${ratio} (CSS support limited)`, duration: 2000 });\r\n }\r\n\r\n private initCast() {\r\n const w = window as any;\r\n const initializeCastApi = () => {\r\n if (this.castInitialized) return;\r\n try {\r\n if (w.cast && w.cast.framework && w.chrome && w.chrome.cast) {\r\n const CastContext = w.cast.framework.CastContext;\r\n CastContext.getInstance().setOptions({\r\n receiverApplicationId: w.chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,\r\n autoJoinPolicy: w.chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED\r\n });\r\n this.castInitialized = true;\r\n }\r\n } catch (e) {\r\n console.warn('Cast Init Error or already initialized', e);\r\n }\r\n };\r\n\r\n if (w.cast && w.cast.framework) {\r\n initializeCastApi();\r\n } else {\r\n w.__onGCastApiAvailable = (isAvailable: boolean) => {\r\n if (isAvailable) initializeCastApi();\r\n };\r\n }\r\n }\r\n\r\n requestCast() {\r\n const w = window as any;\r\n if (w.cast && w.cast.framework) {\r\n try {\r\n if (!this.castInitialized) this.initCast();\r\n w.cast.framework.CastContext.getInstance().requestSession()\r\n .then(() => {\r\n this.loadMediaToCast();\r\n })\r\n .catch((e: any) => {\r\n if (e !== 'cancel') this.notify({ type: 'error', message: 'Cast failed: ' + e, duration: 3000 });\r\n });\r\n } catch (e) {\r\n this.notify({ type: 'warning', message: 'Cast not available yet', duration: 3000 });\r\n }\r\n } else {\r\n this.notify({ type: 'warning', message: 'Cast API not loaded', duration: 3000 });\r\n }\r\n }\r\n\r\n private loadMediaToCast() {\r\n const w = window as any;\r\n try {\r\n const castSession = w.cast.framework.CastContext.getInstance().getCurrentSession();\r\n if (!castSession) return;\r\n const mediaInfo = new w.chrome.cast.media.MediaInfo(this.currentSrc, this.currentSrc.includes('.m3u8') ? 'application/x-mpegurl' : 'video/mp4');\r\n const request = new w.chrome.cast.media.LoadRequest(mediaInfo);\r\n castSession.loadMedia(request).then(() => {\r\n this.notify({ type: 'success', message: 'Casting...', duration: 3000 });\r\n }).catch((e: any) => console.error('Cast load error', e));\r\n } catch (e) {\r\n console.error(\"Failed to load media into Cast session\", e);\r\n }\r\n }\r\n\r\n private handleCueChange() {\r\n const state = this.store.get();\r\n if (state.currentSubtitle === -1) {\r\n this.store.setState({ activeCues: [] });\r\n return;\r\n }\r\n\r\n // Find active track\r\n const tracks = Array.from(this.video.textTracks).filter(t => t.kind === 'subtitles' || t.kind === 'captions');\r\n const track = tracks[state.currentSubtitle];\r\n\r\n if (track && track.activeCues) {\r\n const cues = Array.from(track.activeCues).map((c: any) => c.text);\r\n this.store.setState({ activeCues: cues });\r\n } else {\r\n this.store.setState({ activeCues: [] });\r\n }\r\n }\r\n\r\n setSubtitle(index: number) {\r\n // Remove listeners from old tracks\r\n Array.from(this.video.textTracks).forEach(t => {\r\n t.removeEventListener('cuechange', this.boundCueChange);\r\n t.mode = 'hidden'; // Reset to hidden before applying new state\r\n });\r\n\r\n this.store.setState({ currentSubtitle: index, subtitleOffset: 0, activeCues: [] });\r\n\r\n if (index !== -1) {\r\n // Find active track in the filtered list logic\r\n const tracks = Array.from(this.video.textTracks).filter(t => t.kind === 'subtitles' || t.kind === 'captions');\r\n const track = tracks[index];\r\n if (track) {\r\n const settings = this.store.get().subtitleSettings;\r\n // If using Native, mode = showing. If custom, mode = hidden (but not disabled, so cues update)\r\n track.mode = settings.useNative ? 'showing' : 'hidden';\r\n track.addEventListener('cuechange', this.boundCueChange);\r\n\r\n // Initial trigger\r\n this.handleCueChange();\r\n }\r\n }\r\n }\r\n\r\n updateSubtitleSettings(settings: Partial<SubtitleSettings>) {\r\n const current = this.store.get().subtitleSettings;\r\n const newSettings = { ...current, ...settings };\r\n this.store.setState({ subtitleSettings: newSettings });\r\n\r\n // If switching native/custom, re-apply track mode\r\n if (settings.useNative !== undefined) {\r\n this.setSubtitle(this.store.get().currentSubtitle);\r\n }\r\n }\r\n\r\n resetSubtitleSettings() {\r\n this.store.setState({ subtitleSettings: DEFAULT_SUBTITLE_SETTINGS });\r\n this.setSubtitle(this.store.get().currentSubtitle); // Re-apply modes\r\n }\r\n\r\n setSubtitleOffset(offset: number) {\r\n const currentOffset = this.store.get().subtitleOffset;\r\n const delta = offset - currentOffset;\r\n\r\n if (Math.abs(delta) < 0.001) return;\r\n\r\n Array.from(this.video.textTracks).forEach((track) => {\r\n // If custom (hidden) or native (showing), we adjust cues\r\n if ((track.mode === 'showing' || track.mode === 'hidden') && track.cues) {\r\n Array.from(track.cues).forEach((cue: any) => {\r\n cue.startTime += delta;\r\n cue.endTime += delta;\r\n });\r\n }\r\n });\r\n\r\n this.store.setState({ subtitleOffset: offset });\r\n this.notify({ type: 'info', message: `Subtitle Offset: ${offset > 0 ? '+' : ''}${offset.toFixed(1)}s`, duration: 1500 });\r\n }\r\n\r\n async download() { /* same as before */\r\n if (!this.video.src) return;\r\n const src = this.video.src;\r\n if (src.includes('blob:') || src.includes('.m3u8')) {\r\n this.notify({ type: 'warning', message: 'Stream download not supported in browser.', duration: 4000 });\r\n return;\r\n }\r\n const notifId = this.notify({ type: 'loading', message: 'Preparing download...', progress: 0 });\r\n try {\r\n const response = await this.fetchWithRetry(src);\r\n if (!response.body) throw new Error('No body');\r\n const reader = response.body.getReader();\r\n const contentLength = response.headers.get('Content-Length');\r\n const total = contentLength ? parseInt(contentLength, 10) : 0;\r\n let loaded = 0;\r\n const chunks = [];\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n chunks.push(value);\r\n loaded += value.length;\r\n if (total) {\r\n const percent = Math.round((loaded / total) * 100);\r\n this.notify({ id: notifId, type: 'loading', message: `Downloading... ${percent}%`, progress: percent });\r\n }\r\n }\r\n const blob = new Blob(chunks);\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.style.display = 'none';\r\n a.href = url;\r\n a.download = src.split('/').pop()?.split('?')[0] || 'video.mp4';\r\n document.body.appendChild(a);\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n document.body.removeChild(a);\r\n this.notify({ id: notifId, type: 'success', message: 'Saved!', duration: 3000 });\r\n } catch (e: any) {\r\n this.notify({ id: notifId, type: 'error', message: 'Download failed.', duration: 4000 });\r\n window.open(src, '_blank');\r\n }\r\n }\r\n\r\n notify(n: Omit<Notification, 'id'> & { id?: string }) {\r\n const id = n.id || Math.random().toString(36).substr(2, 9);\r\n const newNotification: Notification = { ...n, id };\r\n this.store.setState({ notifications: [newNotification] });\r\n if (n.duration) setTimeout(() => this.removeNotification(id), n.duration);\r\n return id;\r\n }\r\n\r\n removeNotification(id: string) {\r\n const current = this.store.get().notifications;\r\n this.store.setState({ notifications: current.filter(n => n.id !== id) });\r\n }\r\n\r\n setAppearance(settings: { iconSize?: 'small' | 'medium' | 'large', themeColor?: string, theme?: PlayerTheme }) {\r\n this.store.setState(prev => ({\r\n ...prev,\r\n ...settings\r\n }));\r\n }\r\n\r\n destroy() {\r\n if (this.retryTimer) clearTimeout(this.retryTimer);\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n }\r\n document.removeEventListener('fullscreenchange', this.boundFullscreenChange);\r\n this.video.pause();\r\n this.video.src = '';\r\n const oldTracks = this.video.getElementsByTagName('track');\r\n while (oldTracks.length > 0) oldTracks[0].remove();\r\n this.emit('destroy');\r\n this.events.destroy();\r\n this.store.destroy();\r\n this.plugins.forEach(p => p.destroy && p.destroy());\r\n this.plugins.clear();\r\n this.video.remove();\r\n this.audioEngine.destroy();\r\n }\r\n}\r\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, timeout = 20000): Promise<string> => {\r\n for (let i = 0; i < retries; i++) {\r\n const controller = new AbortController();\r\n const id = setTimeout(() => controller.abort(), timeout);\r\n try {\r\n const res = await fetch(url, { signal: controller.signal });\r\n clearTimeout(id);\r\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\r\n return await res.text();\r\n } catch (e: any) {\r\n clearTimeout(id);\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, timeout: number = 20000): Promise<ThumbnailCue[]> => {\r\n try {\r\n const text = await fetchVttWithRetry(url, 3, timeout);\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 * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props\n })\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ArrowLeft = createLucideIcon(\"ArrowLeft\", [\n [\"path\", { d: \"m12 19-7-7 7-7\", key: \"1l729n\" }],\n [\"path\", { d: \"M19 12H5\", key: \"x3x0zl\" }]\n]);\n\nexport { ArrowLeft as default };\n//# sourceMappingURL=arrow-left.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Bold = createLucideIcon(\"Bold\", [\n [\n \"path\",\n { d: \"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\", key: \"mg9rjx\" }\n ]\n]);\n\nexport { Bold as default };\n//# sourceMappingURL=bold.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Camera = createLucideIcon(\"Camera\", [\n [\n \"path\",\n {\n d: \"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\",\n key: \"1tc9qg\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"3\", key: \"1vg3eu\" }]\n]);\n\nexport { Camera as default };\n//# sourceMappingURL=camera.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Captions = createLucideIcon(\"Captions\", [\n [\"rect\", { width: \"18\", height: \"14\", x: \"3\", y: \"5\", rx: \"2\", ry: \"2\", key: \"12ruh7\" }],\n [\"path\", { d: \"M7 15h4M15 15h2M7 11h2M13 11h4\", key: \"1ueiar\" }]\n]);\n\nexport { Captions as default };\n//# sourceMappingURL=captions.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CaseUpper = createLucideIcon(\"CaseUpper\", [\n [\"path\", { d: \"m3 15 4-8 4 8\", key: \"1vwr6u\" }],\n [\"path\", { d: \"M4 13h6\", key: \"1r9ots\" }],\n [\"path\", { d: \"M15 11h4.5a2 2 0 0 1 0 4H15V7h4a2 2 0 0 1 0 4\", key: \"1sqfas\" }]\n]);\n\nexport { CaseUpper as default };\n//# sourceMappingURL=case-upper.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Cast = createLucideIcon(\"Cast\", [\n [\"path\", { d: \"M2 8V6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6\", key: \"3zrzxg\" }],\n [\"path\", { d: \"M2 12a9 9 0 0 1 8 8\", key: \"g6cvee\" }],\n [\"path\", { d: \"M2 16a5 5 0 0 1 4 4\", key: \"1y1dii\" }],\n [\"line\", { x1: \"2\", x2: \"2.01\", y1: \"20\", y2: \"20\", key: \"xu2jvo\" }]\n]);\n\nexport { Cast as default };\n//# sourceMappingURL=cast.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Check = createLucideIcon(\"Check\", [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]]);\n\nexport { Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Clock = createLucideIcon(\"Clock\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16 14\", key: \"68esgv\" }]\n]);\n\nexport { Clock as default };\n//# sourceMappingURL=clock.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Download = createLucideIcon(\"Download\", [\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"polyline\", { points: \"7 10 12 15 17 10\", key: \"2ggqvy\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"15\", y2: \"3\", key: \"1vk2je\" }]\n]);\n\nexport { Download as default };\n//# sourceMappingURL=download.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Droplet = createLucideIcon(\"Droplet\", [\n [\n \"path\",\n {\n d: \"M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z\",\n key: \"c7niix\"\n }\n ]\n]);\n\nexport { Droplet as default };\n//# sourceMappingURL=droplet.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Eye = createLucideIcon(\"Eye\", [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Eye as default };\n//# sourceMappingURL=eye.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Info = createLucideIcon(\"Info\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n]);\n\nexport { Info as default };\n//# sourceMappingURL=info.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LoaderCircle = createLucideIcon(\"LoaderCircle\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]\n]);\n\nexport { LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LockOpen = createLucideIcon(\"LockOpen\", [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 9.9-1\", key: \"1mm8w8\" }]\n]);\n\nexport { LockOpen as default };\n//# sourceMappingURL=lock-open.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Lock = createLucideIcon(\"Lock\", [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n]);\n\nexport { Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Maximize = createLucideIcon(\"Maximize\", [\n [\"path\", { d: \"M8 3H5a2 2 0 0 0-2 2v3\", key: \"1dcmit\" }],\n [\"path\", { d: \"M21 8V5a2 2 0 0 0-2-2h-3\", key: \"1e4gt3\" }],\n [\"path\", { d: \"M3 16v3a2 2 0 0 0 2 2h3\", key: \"wsl5sc\" }],\n [\"path\", { d: \"M16 21h3a2 2 0 0 0 2-2v-3\", key: \"18trek\" }]\n]);\n\nexport { Maximize as default };\n//# sourceMappingURL=maximize.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Minimize = createLucideIcon(\"Minimize\", [\n [\"path\", { d: \"M8 3v3a2 2 0 0 1-2 2H3\", key: \"hohbtr\" }],\n [\"path\", { d: \"M21 8h-3a2 2 0 0 1-2-2V3\", key: \"5jw1f3\" }],\n [\"path\", { d: \"M3 16h3a2 2 0 0 1 2 2v3\", key: \"198tvr\" }],\n [\"path\", { d: \"M16 21v-3a2 2 0 0 1 2-2h3\", key: \"ph8mxp\" }]\n]);\n\nexport { Minimize as default };\n//# sourceMappingURL=minimize.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Minus = createLucideIcon(\"Minus\", [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]]);\n\nexport { Minus as default };\n//# sourceMappingURL=minus.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Monitor = createLucideIcon(\"Monitor\", [\n [\"rect\", { width: \"20\", height: \"14\", x: \"2\", y: \"3\", rx: \"2\", key: \"48i651\" }],\n [\"line\", { x1: \"8\", x2: \"16\", y1: \"21\", y2: \"21\", key: \"1svkeh\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"17\", y2: \"21\", key: \"vw1qmm\" }]\n]);\n\nexport { Monitor as default };\n//# sourceMappingURL=monitor.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst MoveVertical = createLucideIcon(\"MoveVertical\", [\n [\"path\", { d: \"M12 2v20\", key: \"t6zp3m\" }],\n [\"path\", { d: \"m8 18 4 4 4-4\", key: \"bh5tu3\" }],\n [\"path\", { d: \"m8 6 4-4 4 4\", key: \"ybng9g\" }]\n]);\n\nexport { MoveVertical as default };\n//# sourceMappingURL=move-vertical.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Palette = createLucideIcon(\"Palette\", [\n [\"circle\", { cx: \"13.5\", cy: \"6.5\", r: \".5\", fill: \"currentColor\", key: \"1okk4w\" }],\n [\"circle\", { cx: \"17.5\", cy: \"10.5\", r: \".5\", fill: \"currentColor\", key: \"f64h9f\" }],\n [\"circle\", { cx: \"8.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"fotxhn\" }],\n [\"circle\", { cx: \"6.5\", cy: \"12.5\", r: \".5\", fill: \"currentColor\", key: \"qy21gx\" }],\n [\n \"path\",\n {\n d: \"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z\",\n key: \"12rzf8\"\n }\n ]\n]);\n\nexport { Palette as default };\n//# sourceMappingURL=palette.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pause = createLucideIcon(\"Pause\", [\n [\"rect\", { x: \"14\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"zuxfzm\" }],\n [\"rect\", { x: \"6\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"1okwgv\" }]\n]);\n\nexport { Pause as default };\n//# sourceMappingURL=pause.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst PictureInPicture = createLucideIcon(\"PictureInPicture\", [\n [\n \"path\",\n {\n d: \"M8 4.5v5H3m-1-6 6 6m13 0v-3c0-1.16-.84-2-2-2h-7m-9 9v2c0 1.05.95 2 2 2h3\",\n key: \"bcd8fb\"\n }\n ],\n [\"rect\", { width: \"10\", height: \"7\", x: \"12\", y: \"13.5\", ry: \"2\", key: \"136fx3\" }]\n]);\n\nexport { PictureInPicture as default };\n//# sourceMappingURL=picture-in-picture.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Play = createLucideIcon(\"Play\", [\n [\"polygon\", { points: \"6 3 20 12 6 21 6 3\", key: \"1oa8hb\" }]\n]);\n\nexport { Play as default };\n//# sourceMappingURL=play.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Plus = createLucideIcon(\"Plus\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n]);\n\nexport { Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RefreshCcw = createLucideIcon(\"RefreshCcw\", [\n [\"path\", { d: \"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"14sxne\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }],\n [\"path\", { d: \"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\", key: \"1hlbsb\" }],\n [\"path\", { d: \"M16 16h5v5\", key: \"ccwih5\" }]\n]);\n\nexport { RefreshCcw as default };\n//# sourceMappingURL=refresh-ccw.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCcw = createLucideIcon(\"RotateCcw\", [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n]);\n\nexport { RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCw = createLucideIcon(\"RotateCw\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\", key: \"1p45f6\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }]\n]);\n\nexport { RotateCw as default };\n//# sourceMappingURL=rotate-cw.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Settings = createLucideIcon(\"Settings\", [\n [\n \"path\",\n {\n d: \"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\",\n key: \"1qme2f\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Settings as default };\n//# sourceMappingURL=settings.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst SlidersHorizontal = createLucideIcon(\"SlidersHorizontal\", [\n [\"line\", { x1: \"21\", x2: \"14\", y1: \"4\", y2: \"4\", key: \"obuewd\" }],\n [\"line\", { x1: \"10\", x2: \"3\", y1: \"4\", y2: \"4\", key: \"1q6298\" }],\n [\"line\", { x1: \"21\", x2: \"12\", y1: \"12\", y2: \"12\", key: \"1iu8h1\" }],\n [\"line\", { x1: \"8\", x2: \"3\", y1: \"12\", y2: \"12\", key: \"ntss68\" }],\n [\"line\", { x1: \"21\", x2: \"16\", y1: \"20\", y2: \"20\", key: \"14d8ph\" }],\n [\"line\", { x1: \"12\", x2: \"3\", y1: \"20\", y2: \"20\", key: \"m0wm8r\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"2\", y2: \"6\", key: \"14e1ph\" }],\n [\"line\", { x1: \"8\", x2: \"8\", y1: \"10\", y2: \"14\", key: \"1i6ji0\" }],\n [\"line\", { x1: \"16\", x2: \"16\", y1: \"18\", y2: \"22\", key: \"1lctlv\" }]\n]);\n\nexport { SlidersHorizontal as default };\n//# sourceMappingURL=sliders-horizontal.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Type = createLucideIcon(\"Type\", [\n [\"polyline\", { points: \"4 7 4 4 20 4 20 7\", key: \"1nosan\" }],\n [\"line\", { x1: \"9\", x2: \"15\", y1: \"20\", y2: \"20\", key: \"swin9y\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"4\", y2: \"20\", key: \"1tx1rr\" }]\n]);\n\nexport { Type as default };\n//# sourceMappingURL=type.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Upload = createLucideIcon(\"Upload\", [\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"polyline\", { points: \"17 8 12 3 7 8\", key: \"t8dd8p\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"3\", y2: \"15\", key: \"widbto\" }]\n]);\n\nexport { Upload as default };\n//# sourceMappingURL=upload.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Users = createLucideIcon(\"Users\", [\n [\"path\", { d: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\", key: \"1yyitq\" }],\n [\"circle\", { cx: \"9\", cy: \"7\", r: \"4\", key: \"nufk8\" }],\n [\"path\", { d: \"M22 21v-2a4 4 0 0 0-3-3.87\", key: \"kshegd\" }],\n [\"path\", { d: \"M16 3.13a4 4 0 0 1 0 7.75\", key: \"1da9ce\" }]\n]);\n\nexport { Users as default };\n//# sourceMappingURL=users.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Volume1 = createLucideIcon(\"Volume1\", [\n [\n \"path\",\n {\n d: \"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\",\n key: \"uqj9uw\"\n }\n ],\n [\"path\", { d: \"M16 9a5 5 0 0 1 0 6\", key: \"1q6k2b\" }]\n]);\n\nexport { Volume1 as default };\n//# sourceMappingURL=volume-1.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Volume2 = createLucideIcon(\"Volume2\", [\n [\n \"path\",\n {\n d: \"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\",\n key: \"uqj9uw\"\n }\n ],\n [\"path\", { d: \"M16 9a5 5 0 0 1 0 6\", key: \"1q6k2b\" }],\n [\"path\", { d: \"M19.364 18.364a9 9 0 0 0 0-12.728\", key: \"ijwkga\" }]\n]);\n\nexport { Volume2 as default };\n//# sourceMappingURL=volume-2.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst VolumeX = createLucideIcon(\"VolumeX\", [\n [\n \"path\",\n {\n d: \"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\",\n key: \"uqj9uw\"\n }\n ],\n [\"line\", { x1: \"22\", x2: \"16\", y1: \"9\", y2: \"15\", key: \"1ewh16\" }],\n [\"line\", { x1: \"16\", x2: \"22\", y1: \"9\", y2: \"15\", key: \"5ykzw1\" }]\n]);\n\nexport { VolumeX as default };\n//# sourceMappingURL=volume-x.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","/**\n * @license lucide-react v0.462.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Zap = createLucideIcon(\"Zap\", [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n]);\n\nexport { Zap as default };\n//# sourceMappingURL=zap.js.map\n","\r\n// Re-export icons from lucide-react for consistency\r\nimport {\r\n Play,\r\n Pause,\r\n Volume2,\r\n Volume1,\r\n VolumeX,\r\n Maximize,\r\n Minimize,\r\n Settings,\r\n Check,\r\n PictureInPicture,\r\n Subtitles,\r\n Download,\r\n ArrowLeft,\r\n Upload,\r\n Loader2,\r\n RotateCcw,\r\n RotateCw,\r\n Cast,\r\n Users,\r\n Clock,\r\n Minus,\r\n Plus,\r\n SlidersHorizontal,\r\n Type,\r\n Palette,\r\n Eye,\r\n MoveVertical,\r\n RefreshCcw,\r\n Bold,\r\n CaseUpper,\r\n Droplet,\r\n Camera,\r\n Lock,\r\n Unlock,\r\n Monitor,\r\n Zap,\r\n Ratio,\r\n Expand,\r\n X,\r\n Info,\r\n Copy,\r\n Menu,\r\n ChevronRight\r\n} from 'lucide-react';\r\n\r\nexport const PlayIcon = Play;\r\nexport const PauseIcon = Pause;\r\nexport const VolumeHighIcon = Volume2;\r\nexport const VolumeLowIcon = Volume1;\r\nexport const VolumeMuteIcon = VolumeX;\r\nexport const MaximizeIcon = Maximize;\r\nexport const MinimizeIcon = Minimize;\r\nexport const SettingsIcon = Settings;\r\nexport const CheckIcon = Check;\r\nexport const PipIcon = PictureInPicture;\r\nexport const SubtitleIcon = Subtitles;\r\nexport const DownloadIcon = Download;\r\nexport const UploadIcon = Upload;\r\nexport const ArrowLeftIcon = ArrowLeft;\r\nexport const LoaderIcon = Loader2;\r\nexport const CastIcon = Cast;\r\nexport const UsersIcon = Users;\r\nexport const ClockIcon = Clock;\r\nexport const MinusIcon = Minus;\r\nexport const PlusIcon = Plus;\r\nexport const CustomizeIcon = SlidersHorizontal;\r\nexport const TypeIcon = Type;\r\nexport const PaletteIcon = Palette;\r\nexport const EyeIcon = Eye;\r\nexport const MoveVerticalIcon = MoveVertical;\r\nexport const ResetIcon = RefreshCcw;\r\nexport const BoldIcon = Bold;\r\nexport const CaseUpperIcon = CaseUpper;\r\nexport const BlurIcon = Droplet;\r\nexport const CameraIcon = Camera;\r\nexport const LockIcon = Lock;\r\nexport const UnlockIcon = Unlock;\r\nexport const WebFullscreenIcon = Monitor;\r\nexport const FastForwardIcon = Zap;\r\nexport const RatioIcon = Ratio;\r\nexport const ExpandIcon = Expand;\r\nexport const CloseIcon = X;\r\nexport const InfoIcon = Info;\r\nexport const CopyIcon = Copy;\r\nexport const MenuIcon = Menu;\r\nexport const ChevronRightIcon = ChevronRight;\r\n\r\n// Custom 10s Skip Icons using Lucide base\r\nexport const Replay10Icon = ({ className }: { className?: string }) => (\r\n <div className={`relative flex items-center justify-center ${className}`}>\r\n <RotateCcw className=\"w-full h-full\" strokeWidth={2} />\r\n <span className=\"absolute inset-0 flex items-center justify-center text-[32%] font-bold select-none mt-[1px]\">10</span>\r\n </div>\r\n);\r\n\r\nexport const Forward10Icon = ({ className }: { className?: string }) => (\r\n <div className={`relative flex items-center justify-center ${className}`}>\r\n <RotateCw className=\"w-full h-full\" strokeWidth={2} />\r\n <span className=\"absolute inset-0 flex items-center justify-center text-[32%] font-bold select-none mt-[1px]\">10</span>\r\n </div>\r\n);\r\n\r\nexport const StrataLogo = ({ className }: { className?: string }) => {\r\n // Use Vite's BASE_URL env variable to construct the path relative to the deployment root.\r\n // In dev, this is \"/\", so result is \"/logo.png\".\r\n // In prod, this is \"/StrataPlayer/\", so result is \"/StrataPlayer/logo.png\".\r\n const base = import.meta.env?.BASE_URL || '/';\r\n const src = `${base}logo.png`;\r\n\r\n return <img src={src} alt=\"StrataPlayer Logo\" className={className} />;\r\n};\r\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 max-w-[85%] md:max-w-[400px]\">\r\n {notifications.map((n) => (\r\n <div\r\n key={n.id}\r\n className={`\r\n bg-zinc-950/90 backdrop-blur-md border border-white/10 text-white px-4 py-3 rounded-lg shadow-xl text-sm font-medium flex items-start gap-3 animate-in slide-in-from-left-2 fade-in duration-300 pointer-events-auto\r\n w-fit max-w-full\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)] shrink-0 mt-0.5\" />}\r\n <div className=\"flex flex-col gap-1 min-w-0\">\r\n <span className=\"break-words line-clamp-4 leading-relaxed whitespace-pre-wrap\">{n.message}</span>\r\n {typeof n.progress === 'number' && (\r\n <div className=\"h-1 w-full bg-white/10 rounded-full overflow-hidden mt-1.5\">\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\n// Helper for rendering string/node safely\r\nconst RenderContent = ({ content, className }: { content: string | React.ReactNode, className?: string }) => {\r\n if (typeof content === 'string') {\r\n // If it looks like HTML, use dangerous. Otherwise regular text.\r\n if (content.trim().startsWith('<')) return <span className={className} dangerouslySetInnerHTML={{ __html: content }} />;\r\n return <span className={className}>{content}</span>;\r\n }\r\n return <span className={className}>{content}</span>;\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 flex items-center justify-center w-4 h-4\"><RenderContent content={icon} /></span>}\r\n <span className={`font-medium truncate text-sm flex items-center ${active ? 'text-[var(--accent)]' : ''}`} title={typeof label === 'string' ? label : undefined}>\r\n <RenderContent content={label} />\r\n </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\n// Helper for rendering string/node safely (duplicated from Menu for isolation)\r\nconst RenderContent = ({ content }: { content: string | React.ReactNode }) => {\r\n if (typeof content === 'string') {\r\n if (content.trim().startsWith('<')) return <span dangerouslySetInnerHTML={{ __html: content }} />;\r\n return <span>{content}</span>;\r\n }\r\n return <>{content}</>;\r\n};\r\n\r\nexport const Toggle = ({ label, checked, onChange, icon, tooltip }: 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 flex items-center justify-center w-4 h-4\"><RenderContent content={icon} /></span>}\r\n <div className=\"flex flex-col\">\r\n <span className=\"text-sm text-zinc-300 font-medium group-hover:text-white transition-colors flex items-center\">\r\n <RenderContent content={label} />\r\n </span>\r\n {tooltip && <span className=\"text-[10px] text-zinc-500\">{tooltip}</span>}\r\n </div>\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 flex items-center justify-center w-4 h-4\"><RenderContent content={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 flex items-center justify-center w-4 h-4\"><RenderContent content={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, onOffsetChange, 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\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 <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={() => onOffsetChange(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={() => onOffsetChange(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","\r\nimport React, { useRef, useEffect, useState, useLayoutEffect } from 'react';\r\nimport { ContextMenuItem } from '../../core/StrataCore';\r\nimport { CheckIcon } from '../Icons';\r\n\r\ninterface ContextMenuProps {\r\n x: number;\r\n y: number;\r\n items: ContextMenuItem[];\r\n onClose: () => void;\r\n containerWidth: number;\r\n containerHeight: number;\r\n}\r\n\r\nconst RenderContent = ({ content }: { content: string | React.ReactNode }) => {\r\n if (typeof content === 'string') {\r\n if (content.trim().startsWith('<')) return <span dangerouslySetInnerHTML={{ __html: content }} />;\r\n return <span>{content}</span>;\r\n }\r\n return <>{content}</>;\r\n};\r\n\r\nexport const ContextMenu = ({ x, y, items, onClose, containerWidth, containerHeight }: ContextMenuProps) => {\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const [layout, setLayout] = useState<{ top: number, left: number, maxHeight?: number, opacity: number }>({\r\n top: y,\r\n left: x,\r\n opacity: 0\r\n });\r\n\r\n useLayoutEffect(() => {\r\n if (!menuRef.current) return;\r\n\r\n const rect = menuRef.current.getBoundingClientRect();\r\n const width = rect.width;\r\n // Since we render all items initially, height is accurate\r\n const height = rect.height;\r\n\r\n let newLeft = x;\r\n let newTop = y;\r\n\r\n // Horizontal Logic: Flip left if overflowing right\r\n if (x + width > containerWidth - 10) {\r\n newLeft = x - width;\r\n }\r\n // Clamp left edge\r\n if (newLeft < 10) newLeft = 10;\r\n if (newLeft + width > containerWidth) newLeft = Math.max(10, containerWidth - width - 10);\r\n\r\n // Vertical Logic: Flip up if overflowing bottom\r\n if (y + height > containerHeight - 10) {\r\n newTop = y - height;\r\n }\r\n\r\n let availableHeight = containerHeight - 20;\r\n\r\n // Clamp top edge\r\n if (newTop < 10) newTop = 10;\r\n\r\n // If after flipping/clamping it still overflows bottom, we must shift up or limit height\r\n if (newTop + height > containerHeight - 10) {\r\n newTop = Math.max(10, containerHeight - height - 10);\r\n // If even at top it overflows, height is capped by container\r\n }\r\n\r\n setLayout({\r\n top: newTop,\r\n left: newLeft,\r\n maxHeight: availableHeight,\r\n opacity: 1\r\n });\r\n\r\n }, [x, y, items, containerWidth, containerHeight]);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\r\n onClose();\r\n }\r\n };\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, [onClose]);\r\n\r\n return (\r\n <div\r\n ref={menuRef}\r\n className=\"absolute z-50 min-w-[200px] bg-[var(--bg-panel)] backdrop-blur-xl border-[length:var(--border-width)] border-white/10 shadow-2xl p-1.5 font-[family-name:var(--font-main)] overflow-y-auto hide-scrollbar flex flex-col\"\r\n style={{\r\n top: layout.top,\r\n left: layout.left,\r\n maxHeight: layout.maxHeight,\r\n opacity: layout.opacity,\r\n borderRadius: 'var(--radius-lg)'\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {items.map((item, index) => {\r\n // Separator Logic: 0 height with top border for a crisp line\r\n if (item.separator) {\r\n return <div key={index} className=\"h-0 border-t border-white/10 mx-2 my-1.5\" />;\r\n }\r\n\r\n // Label Logic\r\n if (item.isLabel) {\r\n return (\r\n <div key={index} className=\"px-3 py-1.5 text-[10px] font-bold text-zinc-500 uppercase tracking-wider select-none\">\r\n <RenderContent content={item.html || ''} />\r\n </div>\r\n );\r\n }\r\n\r\n // Standard Interactive Item\r\n return (\r\n <React.Fragment key={index}>\r\n <button\r\n onClick={() => {\r\n if (!item.disabled) {\r\n if (item.click) item.click(onClose);\r\n else if (item.onClick) item.onClick(onClose);\r\n }\r\n }}\r\n disabled={item.disabled}\r\n className={`w-full text-left px-3 py-2.5 flex items-center justify-between hover:bg-white/10 focus:bg-white/10 focus:outline-none transition-colors text-sm text-zinc-200 disabled:opacity-50 disabled:cursor-not-allowed group my-0.5`}\r\n style={{ borderRadius: 'var(--radius)' }}\r\n >\r\n <div className=\"flex items-center gap-3 overflow-hidden\">\r\n {item.icon && <span className=\"text-zinc-400 w-4 h-4 flex items-center justify-center shrink-0 group-hover:text-zinc-300 transition-colors\"><RenderContent content={item.icon} /></span>}\r\n <span className={`flex items-center font-medium truncate ${item.checked ? 'text-[var(--accent)]' : ''}`}><RenderContent content={item.html || ''} /></span>\r\n </div>\r\n {item.checked && <CheckIcon className=\"w-4 h-4 text-[var(--accent)] shrink-0 ml-2\" />}\r\n </button>\r\n {/* Legacy support for showBorder, though item.separator is preferred now */}\r\n {item.showBorder && <div className=\"h-0 border-t border-white/10 mx-2 my-1\" />}\r\n </React.Fragment>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n","\r\nimport React, { useEffect, useState } from 'react';\r\nimport { StrataCore } from '../../core/StrataCore';\r\nimport { CloseIcon } from '../Icons';\r\n\r\nexport const VideoInfo = ({ player, onClose }: { player: StrataCore, onClose: () => void }) => {\r\n const [stats, setStats] = useState<Record<string, string | number>>({});\r\n\r\n useEffect(() => {\r\n const update = () => {\r\n if (!player.video) return;\r\n const v = player.video;\r\n const q = (v as any).getVideoPlaybackQuality ? (v as any).getVideoPlaybackQuality() : null;\r\n\r\n setStats({\r\n 'Player Size': `${v.offsetWidth} x ${v.offsetHeight}`,\r\n 'Video Resolution': `${v.videoWidth} x ${v.videoHeight}`,\r\n 'Current Time': `${v.currentTime.toFixed(3)}s`,\r\n 'Duration': `${v.duration.toFixed(3)}s`,\r\n 'Volume': `${Math.round(v.volume * 100)}%`,\r\n 'Dropped Frames': q ? q.droppedVideoFrames : 'N/A',\r\n 'Buffer': v.buffered.length > 0 ? `${(v.buffered.end(v.buffered.length - 1) - v.currentTime).toFixed(2)}s` : '0s',\r\n 'Engine': player.store.get().sources[player.store.get().currentSourceIndex]?.type || 'native',\r\n 'URL': v.currentSrc\r\n });\r\n };\r\n update();\r\n const timer = setInterval(update, 1000);\r\n return () => clearInterval(timer);\r\n }, [player]);\r\n\r\n return (\r\n <div className=\"absolute inset-0 z-[60] flex items-center justify-center bg-black/60 backdrop-blur-sm p-4 animate-in fade-in duration-200\">\r\n <div\r\n className=\"bg-[var(--bg-panel)] border border-white/10 rounded-xl w-full max-w-md shadow-2xl relative font-mono text-xs text-zinc-300 flex flex-col\"\r\n style={{ borderRadius: 'var(--radius)', maxHeight: '90%' }}\r\n >\r\n <div className=\"p-5 pb-0 flex-shrink-0 relative\">\r\n <button\r\n onClick={(e) => { e.stopPropagation(); onClose(); }}\r\n className=\"absolute top-3 right-3 p-1.5 text-zinc-400 hover:text-white hover:bg-white/10 rounded-full transition-colors\"\r\n >\r\n <CloseIcon className=\"w-4 h-4\" />\r\n </button>\r\n <h3 className=\"text-sm font-bold text-white mb-4 uppercase tracking-wider border-b border-white/10 pb-2\">Video Statistics</h3>\r\n </div>\r\n\r\n <div className=\"overflow-y-auto hide-scrollbar p-5 pt-0 space-y-2.5 flex-1 min-h-0\">\r\n {Object.entries(stats).map(([k, v]) => (\r\n <div key={k} className=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-1\">\r\n <span className=\"text-zinc-500 font-bold shrink-0\">{k}</span>\r\n <span className=\"text-zinc-200 truncate select-all font-medium bg-white/5 px-1.5 py-0.5 rounded break-all text-right\" title={String(v)}>{String(v)}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\r\nimport React, { useEffect, useRef, useState, useSyncExternalStore, useCallback, useMemo } from 'react';\r\nimport { StrataCore, PlayerState, TextTrackConfig, SubtitleSettings, PlayerTheme, StrataConfig, getResolvedState, DEFAULT_STATE, IPlugin, PlayerSource, ControlItem, ContextMenuItem, SettingItem } from '../core/StrataCore';\r\nimport { formatTime, parseVTT, ThumbnailCue } from '../utils/playerUtils';\r\nimport { useTransition } from './hooks/useTransition';\r\nimport { NotificationContainer } from './components/NotificationContainer';\r\nimport { SubtitleOverlay } from './components/SubtitleOverlay';\r\nimport { Menu, MenuItem, MenuHeader, MenuDivider } from './components/Menu';\r\nimport { SubtitleMenu } from './components/SubtitleMenu';\r\nimport { ContextMenu } from './components/ContextMenu';\r\nimport { VideoInfo } from './components/VideoInfo';\r\nimport { SettingsGroup, Toggle } from './components/SettingsPrimitives';\r\nimport {\r\n PlayIcon, PauseIcon, VolumeHighIcon, VolumeLowIcon, VolumeMuteIcon,\r\n MaximizeIcon, MinimizeIcon, SettingsIcon, PipIcon,\r\n SubtitleIcon, DownloadIcon, Replay10Icon, Forward10Icon,\r\n LoaderIcon, CastIcon, UsersIcon, PaletteIcon, CheckIcon,\r\n CustomizeIcon, CameraIcon, LockIcon, UnlockIcon, WebFullscreenIcon,\r\n FastForwardIcon, RatioIcon, ExpandIcon, InfoIcon\r\n} from './Icons';\r\n\r\ndeclare module 'react' {\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n 'google-cast-launcher': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;\r\n }\r\n }\r\n}\r\n\r\n// --- Main Player Component ---\r\n\r\ninterface StrataPlayerProps extends StrataConfig {\r\n src?: string; // Optional if sources are provided\r\n type?: string; // Optional: Explicitly define type for the src (e.g. 'hls', 'dash')\r\n sources?: PlayerSource[]; // Array of sources\r\n poster?: string;\r\n thumbnails?: string; // URL to VTT thumbnails\r\n textTracks?: TextTrackConfig[];\r\n plugins?: IPlugin[]; // Allow injecting plugins from outside\r\n autoPlay?: boolean; // Added prop\r\n onGetInstance?: (core: StrataCore) => void; // Expose instance\r\n}\r\n\r\nconst THEME_COLORS = [\r\n { label: 'Strata', value: '#6366f1' },\r\n { label: 'Emerald', value: '#10b981' },\r\n { label: 'Rose', value: '#f43f5e' },\r\n { label: 'Amber', value: '#f59e0b' },\r\n { label: 'Sky', value: '#0ea5e9' },\r\n { label: 'Violet', value: '#8b5cf6' },\r\n];\r\n\r\nconst THEMES: { label: string, value: PlayerTheme, color: string }[] = [\r\n { label: 'Default', value: 'default', color: '#6366f1' },\r\n { label: 'Pixel', value: 'pixel', color: '#ef4444' },\r\n { label: 'Game', value: 'game', color: '#eab308' },\r\n { label: 'Hacker', value: 'hacker', color: '#22c55e' },\r\n];\r\n\r\n// Helper to render HTML strings safely or pass nodes through\r\nconst HtmlOrNode = ({ content, className, style }: { content: string | React.ReactNode, className?: string, style?: React.CSSProperties }) => {\r\n if (typeof content === 'string') {\r\n if (content.trim().startsWith('<')) {\r\n return <div className={className} style={style} dangerouslySetInnerHTML={{ __html: content }} />;\r\n }\r\n return <div className={className} style={style}>{content}</div>;\r\n }\r\n return <div className={className} style={style}>{content}</div>;\r\n};\r\n\r\nexport const StrataPlayer = (props: StrataPlayerProps) => {\r\n const { src, type, sources, poster, autoPlay, thumbnails, textTracks, plugins, onGetInstance, ...config } = props;\r\n\r\n // Default configs for optionals\r\n const useScreenshot = config.screenshot ?? false;\r\n const usePip = config.pip ?? true;\r\n const useSetting = config.setting ?? true;\r\n const useFullscreen = config.fullscreen ?? true;\r\n const useFullscreenWeb = config.fullscreenWeb ?? false;\r\n const useLock = config.lock ?? false;\r\n const useFastForward = config.fastForward ?? true;\r\n const useFlip = config.flip ?? true;\r\n const useAspectRatio = config.aspectRatio ?? true;\r\n const useHotKey = config.hotKey ?? true;\r\n const isBackdrop = config.backdrop ?? true;\r\n const useGestureSeek = config.gestureSeek ?? false;\r\n const useCenterControls = config.centerControls ?? true;\r\n const fetchTimeout = config.fetchTimeout ?? 30000;\r\n\r\n // Default AutoOrientation to true\r\n const useAutoOrientation = config.autoOrientation ?? true;\r\n\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const [player, setPlayer] = useState<StrataCore | null>(null);\r\n const [hasPlayed, setHasPlayed] = useState(false);\r\n const [playerHeight, setPlayerHeight] = useState(0);\r\n const [playerWidth, setPlayerWidth] = useState(0);\r\n\r\n // Resolve initial state based on props + defaults + localStorage BEFORE mounting\r\n const initialState = useMemo(() => getResolvedState(config), []);\r\n\r\n const state = useSyncExternalStore<PlayerState>(\r\n useCallback((cb) => player ? player.store.subscribe(cb) : () => { }, [player]),\r\n () => player ? player.store.get() : initialState,\r\n () => initialState\r\n );\r\n\r\n const [settingsOpen, setSettingsOpen] = useState(false);\r\n const [subtitleMenuOpen, setSubtitleMenuOpen] = useState(false);\r\n const [activeMenu, setActiveMenu] = useState<'main' | 'quality' | 'speed' | 'audio' | 'boost' | 'party' | 'appearance' | 'sources' | 'flip' | 'ratio'>('main');\r\n\r\n // Context Menu State\r\n const [contextMenu, setContextMenu] = useState<{ x: number, y: number, visible: boolean }>({ x: 0, y: 0, visible: false });\r\n const [showVideoInfo, setShowVideoInfo] = useState(false);\r\n\r\n // Transition States\r\n const settingsTransition = useTransition(settingsOpen, 200);\r\n const subtitleTransition = useTransition(subtitleMenuOpen, 200);\r\n\r\n // Seek & Scrubbing State\r\n const [isScrubbing, setIsScrubbing] = useState(false);\r\n const [scrubbingTime, setScrubbingTime] = useState(0);\r\n const [isVolumeScrubbing, setIsVolumeScrubbing] = useState(false);\r\n const [isVolumeHovered, setIsVolumeHovered] = useState(false);\r\n const [isVolumeLocked, setIsVolumeLocked] = useState(false); // For mobile/touch\r\n\r\n const [thumbnailCues, setThumbnailCues] = useState<ThumbnailCue[]>([]);\r\n const [hoverTime, setHoverTime] = useState<number | null>(null);\r\n const [hoverPos, setHoverPos] = useState<number>(0);\r\n const [currentThumbnail, setCurrentThumbnail] = useState<ThumbnailCue | null>(null);\r\n const [seekAnimation, setSeekAnimation] = useState<{ type: 'forward' | 'rewind', id: number } | null>(null);\r\n const [skipTrigger, setSkipTrigger] = useState<'forward' | 'rewind' | null>(null);\r\n\r\n // Fast Forward State\r\n const [isFastForwarding, setIsFastForwarding] = useState(false);\r\n const fastForwardTimerRef = useRef<any>(null);\r\n const originalRateRef = useRef<number>(1);\r\n\r\n // Gesture Refs\r\n const touchStartX = useRef<number | null>(null);\r\n const touchStartTime = useRef<number>(0);\r\n const isDraggingRef = useRef(false);\r\n\r\n const clickTimeoutRef = useRef<any>(null);\r\n const controlsTimeoutRef = useRef<any>(null);\r\n const progressBarRef = useRef<HTMLDivElement>(null);\r\n const volumeBarRef = useRef<HTMLDivElement>(null);\r\n const animationCleanupRef = useRef<any>(null);\r\n\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n // Pass poster into core config so metadata can use it\r\n const core = new StrataCore({ ...config, poster });\r\n\r\n // Register plugins\r\n if (plugins && plugins.length > 0) {\r\n plugins.forEach(p => core.use(p));\r\n }\r\n\r\n core.attach(containerRef.current);\r\n setPlayer(core);\r\n if (onGetInstance) onGetInstance(core);\r\n\r\n const observer = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n setPlayerHeight(entry.contentRect.height);\r\n setPlayerWidth(entry.contentRect.width);\r\n }\r\n });\r\n observer.observe(containerRef.current);\r\n\r\n return () => {\r\n observer.disconnect();\r\n core.destroy();\r\n setPlayer(null);\r\n };\r\n }, []);\r\n\r\n // Reactive Prop Updates\r\n useEffect(() => {\r\n if (!player) return;\r\n const updates: any = {};\r\n if (config.theme !== undefined && config.theme !== state.theme) updates.theme = config.theme;\r\n if (config.themeColor !== undefined && config.themeColor !== state.themeColor) updates.themeColor = config.themeColor;\r\n if (config.iconSize !== undefined && config.iconSize !== state.iconSize) updates.iconSize = config.iconSize;\r\n\r\n if (Object.keys(updates).length > 0) {\r\n player.setAppearance(updates);\r\n }\r\n\r\n if (config.volume !== undefined && Math.abs(config.volume - state.volume) > 0.01) player.setVolume(config.volume);\r\n if (config.muted !== undefined && config.muted !== state.isMuted) {\r\n if (config.muted) player.video.muted = true;\r\n else { player.video.muted = false; }\r\n }\r\n }, [player, config.theme, config.themeColor, config.iconSize, config.volume, config.muted]);\r\n\r\n useEffect(() => {\r\n if (!player) return;\r\n const tracks = textTracks || [];\r\n if (sources && sources.length > 0) {\r\n setHasPlayed(false);\r\n player.setSources(sources, tracks);\r\n } else if (src) {\r\n setHasPlayed(false);\r\n player.setSources([{ url: src, type: type || 'auto' }], tracks);\r\n }\r\n }, [src, type, sources, textTracks, player]);\r\n\r\n useEffect(() => {\r\n if (player && autoPlay) {\r\n player.video.muted = true;\r\n player.store.setState({ isMuted: true });\r\n player.play().catch(() => { });\r\n }\r\n }, [player, autoPlay]);\r\n\r\n useEffect(() => {\r\n if (state.isPlaying && !hasPlayed) setHasPlayed(true);\r\n }, [state.isPlaying, hasPlayed]);\r\n\r\n useEffect(() => {\r\n if (thumbnails && player) {\r\n parseVTT(thumbnails, player.notify.bind(player), fetchTimeout).then(setCues => setThumbnailCues(setCues));\r\n } else setThumbnailCues([]);\r\n }, [thumbnails, player, fetchTimeout]);\r\n\r\n // Safety cleanup for seek animation if onAnimationEnd fails\r\n useEffect(() => {\r\n if (seekAnimation) {\r\n if (animationCleanupRef.current) clearTimeout(animationCleanupRef.current);\r\n animationCleanupRef.current = setTimeout(() => {\r\n setSeekAnimation(null);\r\n }, 600); // slightly longer than 500ms animation\r\n }\r\n return () => {\r\n if (animationCleanupRef.current) clearTimeout(animationCleanupRef.current);\r\n };\r\n }, [seekAnimation]);\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (!player || !useHotKey) return;\r\n if (document.activeElement?.tagName === 'INPUT') return;\r\n switch (e.key.toLowerCase()) {\r\n case ' ': case 'k': e.preventDefault(); player.togglePlay(); break;\r\n case 'arrowright': e.preventDefault(); player.skip(5); break;\r\n case 'arrowleft': e.preventDefault(); player.skip(-5); break;\r\n case 'arrowup': e.preventDefault(); player.setVolume(player.video.volume + 0.1); break;\r\n case 'arrowdown': e.preventDefault(); player.setVolume(player.video.volume - 0.1); break;\r\n case 'f': e.preventDefault(); player.toggleFullscreen(); break;\r\n case 'm': e.preventDefault(); player.toggleMute(); break;\r\n }\r\n };\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => window.removeEventListener('keydown', handleKeyDown);\r\n }, [player, useHotKey]);\r\n\r\n const handleMouseMove = () => {\r\n if (!player) return;\r\n // Even if locked, we want to wake up controls so the lock button becomes visible\r\n player.setControlsVisible(true);\r\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\r\n if (settingsOpen || subtitleMenuOpen) return;\r\n controlsTimeoutRef.current = setTimeout(() => {\r\n if (!state.isPlaying || settingsOpen || subtitleMenuOpen) return;\r\n player.setControlsVisible(false);\r\n }, 2500);\r\n };\r\n\r\n useEffect(() => {\r\n if (!player) return;\r\n if (!settingsOpen && !subtitleMenuOpen && state.isPlaying) handleMouseMove();\r\n else if (settingsOpen || subtitleMenuOpen) {\r\n player.setControlsVisible(true);\r\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\r\n }\r\n }, [settingsOpen, subtitleMenuOpen, state.isPlaying, player]);\r\n\r\n // --- Fast Forward Logic ---\r\n const startFastForward = useCallback(() => {\r\n if (!useFastForward || !player || !state.isPlaying || state.isLocked) return;\r\n originalRateRef.current = player.video.playbackRate;\r\n fastForwardTimerRef.current = setTimeout(() => {\r\n player.video.playbackRate = 2;\r\n setIsFastForwarding(true);\r\n }, 500); // 500ms delay for long press\r\n }, [useFastForward, player, state.isPlaying, state.isLocked]);\r\n\r\n const stopFastForward = useCallback(() => {\r\n if (fastForwardTimerRef.current) clearTimeout(fastForwardTimerRef.current);\r\n if (isFastForwarding && player) {\r\n player.video.playbackRate = originalRateRef.current; // Restore original rate\r\n setIsFastForwarding(false);\r\n }\r\n }, [isFastForwarding, player]);\r\n\r\n // --- Gesture Seek Logic ---\r\n const handleTouchStart = (e: React.TouchEvent) => {\r\n startFastForward();\r\n\r\n if (useGestureSeek && !state.isLocked) {\r\n touchStartX.current = e.touches[0].clientX;\r\n touchStartTime.current = state.currentTime;\r\n isDraggingRef.current = false;\r\n }\r\n };\r\n\r\n const handleTouchMove = (e: React.TouchEvent) => {\r\n if (state.isLocked) return;\r\n\r\n // If we are moving and gesture seek is enabled\r\n if (useGestureSeek && touchStartX.current !== null) {\r\n const deltaX = e.touches[0].clientX - touchStartX.current;\r\n\r\n // Threshold to start dragging\r\n if (Math.abs(deltaX) > 10) {\r\n // If we start dragging, cancel any pending fast forward\r\n stopFastForward();\r\n\r\n isDraggingRef.current = true;\r\n setIsScrubbing(true);\r\n\r\n if (containerRef.current && state.duration) {\r\n const rect = containerRef.current.getBoundingClientRect();\r\n // Sensitivity: map drag distance to timeline progress directly relative to container width\r\n const deltaRatio = deltaX / rect.width;\r\n const newTime = Math.max(0, Math.min(state.duration, touchStartTime.current + (deltaRatio * state.duration)));\r\n setScrubbingTime(newTime);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleTouchEnd = (e: React.TouchEvent) => {\r\n stopFastForward();\r\n\r\n if (useGestureSeek && isDraggingRef.current) {\r\n player?.seek(scrubbingTime);\r\n setIsScrubbing(false);\r\n isDraggingRef.current = false;\r\n touchStartX.current = null;\r\n // Prevent subsequent click event from toggling play\r\n return;\r\n }\r\n\r\n touchStartX.current = null;\r\n };\r\n\r\n const calculateTimeFromEvent = (e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent) => {\r\n if (!progressBarRef.current || !state.duration) return 0;\r\n const rect = progressBarRef.current.getBoundingClientRect();\r\n const clientX = 'touches' in e ? (e as TouchEvent).touches[0].clientX : (e as MouseEvent).clientX;\r\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\r\n return pct * state.duration;\r\n };\r\n\r\n const handleSeekStart = (e: React.MouseEvent | React.TouchEvent) => {\r\n if (state.isLocked) return;\r\n setIsScrubbing(true);\r\n setScrubbingTime(calculateTimeFromEvent(e));\r\n const handleMove = (moveEvent: MouseEvent | TouchEvent) => setScrubbingTime(calculateTimeFromEvent(moveEvent));\r\n const handleUp = (upEvent: MouseEvent | TouchEvent) => {\r\n player?.seek(calculateTimeFromEvent(upEvent));\r\n setIsScrubbing(false);\r\n document.removeEventListener('mousemove', handleMove); document.removeEventListener('touchmove', handleMove);\r\n document.removeEventListener('mouseup', handleUp); document.removeEventListener('touchend', handleUp);\r\n };\r\n document.addEventListener('mousemove', handleMove); document.addEventListener('touchmove', handleMove);\r\n document.addEventListener('mouseup', handleUp); document.addEventListener('touchend', handleUp);\r\n };\r\n\r\n const calculateVolumeFromEvent = (e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent) => {\r\n if (!volumeBarRef.current) return 0;\r\n const rect = volumeBarRef.current.getBoundingClientRect();\r\n const clientX = 'touches' in e ? (e as TouchEvent).touches[0].clientX : (e as MouseEvent).clientX;\r\n return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\r\n };\r\n\r\n const handleVolumeStart = (e: React.MouseEvent | React.TouchEvent) => {\r\n if (!player || state.isLocked) return;\r\n setIsVolumeScrubbing(true);\r\n player.setVolume(calculateVolumeFromEvent(e));\r\n const handleMove = (moveEvent: MouseEvent | TouchEvent) => player.setVolume(calculateVolumeFromEvent(moveEvent));\r\n const handleUp = () => {\r\n setIsVolumeScrubbing(false);\r\n document.removeEventListener('mousemove', handleMove); document.removeEventListener('touchmove', handleMove);\r\n document.removeEventListener('mouseup', handleUp); document.removeEventListener('touchend', handleUp);\r\n };\r\n document.addEventListener('mousemove', handleMove); document.addEventListener('touchmove', handleMove);\r\n document.addEventListener('mouseup', handleUp); document.addEventListener('touchend', handleUp);\r\n };\r\n\r\n const handleProgressMove = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (!state.duration || state.isLive) return;\r\n const rect = e.currentTarget.getBoundingClientRect();\r\n const percent = (e.clientX - rect.left) / rect.width;\r\n const time = percent * state.duration;\r\n setHoverPos(percent * 100);\r\n setHoverTime(time);\r\n if (thumbnailCues.length > 0) setCurrentThumbnail(thumbnailCues.find(c => time >= c.start && time < c.end) || null);\r\n };\r\n\r\n const triggerSkip = (direction: 'forward' | 'rewind') => {\r\n if (!player || state.isLocked) return;\r\n player.skip(direction === 'forward' ? 10 : -10);\r\n setSkipTrigger(direction);\r\n setTimeout(() => setSkipTrigger(null), 300);\r\n };\r\n\r\n const handleContainerClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (!player) return;\r\n\r\n // If we just finished a drag gesture, ignore the click\r\n if (isDraggingRef.current) {\r\n isDraggingRef.current = false;\r\n return;\r\n }\r\n\r\n // Close menus on outside click\r\n if (settingsOpen) setSettingsOpen(false);\r\n if (subtitleMenuOpen) setSubtitleMenuOpen(false);\r\n if (isVolumeLocked) setIsVolumeLocked(false);\r\n if (contextMenu.visible) setContextMenu({ ...contextMenu, visible: false });\r\n\r\n // Wake up controls so lock button is visible if locked\r\n player.setControlsVisible(true);\r\n if (controlsTimeoutRef.current) clearTimeout(controlsTimeoutRef.current);\r\n controlsTimeoutRef.current = setTimeout(() => {\r\n if (!state.isPlaying || settingsOpen || subtitleMenuOpen) return;\r\n player.setControlsVisible(false);\r\n }, 2500);\r\n\r\n // If locked, do nothing else (prevent play/pause, seek, double tap)\r\n if (state.isLocked) return;\r\n\r\n const rect = e.currentTarget.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const width = rect.width;\r\n const now = Date.now();\r\n\r\n if (clickTimeoutRef.current) {\r\n clearTimeout(clickTimeoutRef.current);\r\n clickTimeoutRef.current = null;\r\n if (x < width * 0.35) { triggerSkip('rewind'); setSeekAnimation({ type: 'rewind', id: now }); }\r\n else if (x > width * 0.65) { triggerSkip('forward'); setSeekAnimation({ type: 'forward', id: now }); }\r\n else player.toggleFullscreen();\r\n } else {\r\n clickTimeoutRef.current = setTimeout(() => {\r\n player.togglePlay();\r\n clickTimeoutRef.current = null;\r\n }, 250);\r\n }\r\n };\r\n\r\n const handleContextMenu = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n if (state.isLocked) return;\r\n\r\n const rect = containerRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\n\r\n setContextMenu({\r\n visible: true,\r\n x: e.clientX - rect.left,\r\n y: e.clientY - rect.top\r\n });\r\n };\r\n\r\n const handleVolumeIconClick = (e: React.MouseEvent | React.TouchEvent) => {\r\n e.stopPropagation();\r\n\r\n // Robust touch/mobile detection\r\n const isTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n const isMobile = window.matchMedia('(hover: none)').matches || isTouch;\r\n\r\n if (isVolumeLocked) {\r\n setIsVolumeLocked(false);\r\n return;\r\n }\r\n\r\n if (isMobile) {\r\n setIsVolumeLocked(true);\r\n } else {\r\n // Desktop default behavior: Mute toggle\r\n player?.toggleMute();\r\n }\r\n };\r\n\r\n const VolIcon = state.isMuted || state.volume === 0 ? VolumeMuteIcon : state.volume < 0.5 ? VolumeLowIcon : VolumeHighIcon;\r\n\r\n const menuMaxHeight = Math.max(100, playerHeight - 120);\r\n\r\n const getIconClass = () => {\r\n switch (state.iconSize) {\r\n case 'small': return 'w-4 h-4';\r\n case 'large': return 'w-6 h-6';\r\n default: return 'w-5 h-5';\r\n }\r\n }\r\n const getButtonClass = () => {\r\n switch (state.iconSize) {\r\n case 'small': return 'p-2 min-w-[32px] min-h-[32px]';\r\n case 'large': return 'p-3 min-w-[44px] min-h-[44px]'; // Larger touch targets\r\n default: return 'p-2.5 min-w-[36px] min-h-[36px]';\r\n }\r\n }\r\n const iconClass = getIconClass();\r\n const btnClass = getButtonClass();\r\n\r\n const getCenterSizes = () => {\r\n switch (state.iconSize) {\r\n case 'small':\r\n return {\r\n playBtn: 'w-14 h-14',\r\n playIcon: 'w-6 h-6',\r\n skipBtn: 'w-10 h-10',\r\n skipIcon: 'w-5 h-5'\r\n };\r\n case 'large':\r\n return {\r\n playBtn: 'w-24 h-24',\r\n playIcon: 'w-12 h-12',\r\n skipBtn: 'w-16 h-16',\r\n skipIcon: 'w-8 h-8'\r\n };\r\n default: // medium\r\n return {\r\n playBtn: 'w-20 h-20',\r\n playIcon: 'w-9 h-9',\r\n skipBtn: 'w-12 h-12',\r\n skipIcon: 'w-6 h-6'\r\n };\r\n }\r\n }\r\n const center = getCenterSizes();\r\n\r\n // Bottom Controls Visibility: Show if paused, or actively showing controls, or menus open. \r\n // HIDDEN IF LOCKED.\r\n // Use state.controlsVisible from Core to sync with external listeners (like ArtPlayer consumers)\r\n const isControlsVisible = !state.isLocked && (state.controlsVisible || !state.isPlaying || settingsOpen || subtitleMenuOpen);\r\n const isVolumeVisible = isVolumeHovered || isVolumeScrubbing || isVolumeLocked;\r\n\r\n const backdropClass = isBackdrop ? 'backdrop-blur-xl bg-black/80' : 'bg-black/95';\r\n\r\n // --- Dynamic Controls Rendering ---\r\n const controls: ControlItem[] = useMemo(() => {\r\n const items: ControlItem[] = [\r\n { id: 'play', position: 'left', index: 10, isBuiltIn: true },\r\n { id: 'volume', position: 'left', index: 20, isBuiltIn: true },\r\n { id: 'time', position: 'left', index: 30, isBuiltIn: true },\r\n { id: 'subtitle', position: 'right', index: 80, isBuiltIn: true },\r\n { id: 'screenshot', position: 'right', index: 85, isBuiltIn: true },\r\n { id: 'pip', position: 'right', index: 90, isBuiltIn: true },\r\n { id: 'download', position: 'right', index: 95, isBuiltIn: true },\r\n { id: 'settings', position: 'right', index: 100, isBuiltIn: true },\r\n { id: 'fullscreenWeb', position: 'right', index: 110, isBuiltIn: true },\r\n { id: 'fullscreen', position: 'right', index: 120, isBuiltIn: true },\r\n ];\r\n\r\n if (config.controls) {\r\n // Merge user controls\r\n config.controls.forEach(c => {\r\n const existing = items.find(i => i.id === c.id);\r\n if (existing) {\r\n Object.assign(existing, c); // Override\r\n } else {\r\n items.push(c);\r\n }\r\n });\r\n }\r\n\r\n // Filter based on config toggles\r\n return items.filter(c => {\r\n if (c.id === 'screenshot' && !useScreenshot) return false;\r\n if (c.id === 'pip' && !usePip) return false;\r\n if (c.id === 'settings' && !useSetting) return false;\r\n if (c.id === 'fullscreen' && !useFullscreen) return false;\r\n if (c.id === 'fullscreenWeb' && !useFullscreenWeb) return false;\r\n return true;\r\n }).sort((a, b) => a.index - b.index);\r\n }, [config.controls, useScreenshot, usePip, useSetting, useFullscreen, useFullscreenWeb]);\r\n\r\n const renderControl = (item: ControlItem) => {\r\n if (!item.isBuiltIn) {\r\n // Render custom user control\r\n return (\r\n <button\r\n key={item.index}\r\n onClick={() => {\r\n if (item.click) item.click(player!);\r\n else if (item.onClick) item.onClick(player!);\r\n }}\r\n className={`strata-control-btn text-zinc-300 hover:text-white transition-colors hover:bg-white/10 focus:outline-none flex items-center justify-center ${btnClass} ${item.className || ''}`}\r\n style={{ borderRadius: 'var(--radius)', ...item.style }}\r\n title={item.tooltip}\r\n >\r\n <HtmlOrNode content={item.html || ''} />\r\n </button>\r\n );\r\n }\r\n\r\n // Built-ins\r\n switch (item.id) {\r\n case 'play':\r\n return (\r\n <button key=\"play\" 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)' }}>\r\n {state.isPlaying ? <PauseIcon className={`${iconClass} fill-current`} /> : <PlayIcon className={`${iconClass} fill-current`} />}\r\n </button>\r\n );\r\n case 'volume':\r\n return (\r\n <div key=\"volume\" className=\"flex items-center gap-2 group/vol relative\"\r\n onMouseEnter={() => { if (window.matchMedia('(hover: hover)').matches) setIsVolumeHovered(true); }}\r\n onMouseLeave={() => { if (window.matchMedia('(hover: hover)').matches) setIsVolumeHovered(false); }}\r\n >\r\n <button onClick={handleVolumeIconClick} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }}>\r\n <VolIcon className={iconClass} />\r\n </button>\r\n <div className={`relative h-8 flex items-center transition-all duration-300 ease-out overflow-hidden ${isVolumeVisible ? 'w-28 opacity-100 ml-1' : 'w-0 opacity-0'}`}>\r\n <div ref={volumeBarRef} className=\"relative w-full h-full flex items-center cursor-pointer px-2\" onMouseDown={handleVolumeStart} onTouchStart={handleVolumeStart}>\r\n <div className=\"w-full h-1 bg-white/20 overflow-hidden\" style={{ borderRadius: 'var(--radius-full)' }}>\r\n <div className=\"h-full bg-white\" style={{ width: `${(state.isMuted ? 0 : state.volume) * 100}%`, borderRadius: 'var(--radius-full)' }}></div>\r\n </div>\r\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)' }} />\r\n </div>\r\n </div>\r\n {isVolumeVisible && <div 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\" style={{ left: `calc(52px + ${(state.isMuted ? 0 : state.volume) * 80}px)` }}>{state.isMuted ? '0%' : `${Math.round(state.volume * 100)}%`}</div>}\r\n </div>\r\n );\r\n case 'time':\r\n return config.isLive ? (\r\n <div key=\"live\" className=\"flex items-center gap-2 px-2 py-0.5 bg-red-500/10 border border-red-500/20 rounded-md\">\r\n <div className=\"w-2 h-2 rounded-full bg-red-500 animate-pulse\" />\r\n <span className=\"text-[10px] font-bold text-red-500 tracking-wider\">LIVE</span>\r\n </div>\r\n ) : (\r\n <div key=\"time\" 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>\r\n );\r\n case 'subtitle':\r\n return (\r\n <div key=\"subtitle\" className=\"relative\">\r\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>\r\n {subtitleTransition.isMounted && (\r\n <SubtitleMenu\r\n tracks={state.subtitleTracks} current={state.currentSubtitle} onSelect={(idx: number) => player?.setSubtitle(idx)}\r\n onUpload={(file: File) => player?.addTextTrack(file, file.name)} onClose={() => setSubtitleMenuOpen(false)}\r\n settings={state.subtitleSettings} onSettingsChange={(s: Partial<SubtitleSettings>) => player?.updateSubtitleSettings(s)}\r\n onReset={() => player?.resetSubtitleSettings()} offset={state.subtitleOffset} onOffsetChange={(val: number) => player?.setSubtitleOffset(val)}\r\n maxHeight={menuMaxHeight} animationClass={`strata-backdrop ${backdropClass} ${subtitleTransition.isVisible ? 'opacity-100 translate-y-0 scale-100' : 'opacity-0 translate-y-2 scale-95'}`}\r\n />\r\n )}\r\n </div>\r\n );\r\n case 'screenshot': return <button key=\"ss\" onClick={() => player?.screenshot()} 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)' }} title=\"Screenshot\"><CameraIcon className={iconClass} /></button>;\r\n case 'pip': return <button key=\"pip\" 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>;\r\n case 'download': return <button key=\"dl\" 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>;\r\n case 'fullscreen': return <button key=\"fs\" 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>;\r\n case 'fullscreenWeb': return <button key=\"fsw\" className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 hidden sm:block focus:outline-none ${btnClass}`} style={{ borderRadius: 'var(--radius)' }} title=\"Web Fullscreen\"><WebFullscreenIcon className={iconClass} /></button>;\r\n case 'settings':\r\n return (\r\n <div key=\"settings\" className=\"relative\">\r\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>\r\n {settingsTransition.isMounted && (<Menu onClose={() => setSettingsOpen(false)} align=\"right\" maxHeight={menuMaxHeight} className={`strata-backdrop ${backdropClass} ${settingsTransition.isVisible ? 'opacity-100 translate-y-0 scale-100' : 'opacity-0 translate-y-2 scale-95'}`}><div className=\"w-full\">\r\n {activeMenu === '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 sticky top-0 z-10 backdrop-blur-md\" style={{ borderRadius: 'var(--radius)' }}><span>Settings</span></div>\r\n {state.sources.length > 1 && <MenuItem label=\"Source\" value={state.sources[state.currentSourceIndex]?.name || `Source ${state.currentSourceIndex + 1}`} onClick={() => setActiveMenu('sources')} hasSubmenu />}\r\n <MenuItem label=\"Speed\" value={`${state.playbackRate}x`} onClick={() => setActiveMenu('speed')} hasSubmenu />\r\n <MenuItem label=\"Quality\" value={state.currentQuality === -1 ? 'Auto' : `${state.qualityLevels[state.currentQuality]?.height}p`} onClick={() => setActiveMenu('quality')} hasSubmenu />\r\n <MenuItem label=\"Audio\" value={state.audioTracks[state.currentAudioTrack]?.label || 'Default'} onClick={() => setActiveMenu('audio')} hasSubmenu />\r\n {useFlip && <MenuItem label=\"Flip\" value={state.flipState.horizontal ? 'H' : state.flipState.vertical ? 'V' : 'Normal'} onClick={() => setActiveMenu('flip')} hasSubmenu />}\r\n {useAspectRatio && <MenuItem label=\"Aspect Ratio\" value={state.aspectRatio} onClick={() => setActiveMenu('ratio')} hasSubmenu />}\r\n <MenuDivider />\r\n <MenuItem label=\"Audio Boost\" value={state.audioGain > 1 ? `${state.audioGain}x` : 'Off'} onClick={() => setActiveMenu('boost')} hasSubmenu />\r\n <MenuItem label=\"Watch Party\" icon={<UsersIcon className=\"w-4 h-4\" />} onClick={() => setActiveMenu('party')} hasSubmenu />\r\n <MenuItem label=\"Cast to Device\" icon={<CastIcon className=\"w-4 h-4\" />} onClick={() => { player?.requestCast(); setSettingsOpen(false); }} />\r\n {/* Custom user settings appended */}\r\n {config.settings?.map((s, i) => (\r\n s.switch !== undefined ? (\r\n <div key={`cust-${i}`} className=\"px-1\">\r\n <Toggle\r\n label={s.html}\r\n icon={s.icon}\r\n checked={s.switch}\r\n tooltip={s.tooltip}\r\n onChange={(val: boolean) => { if (s.onSwitch) s.onSwitch(s); }}\r\n />\r\n </div>\r\n ) : (\r\n <MenuItem\r\n key={`cust-${i}`}\r\n label={s.html}\r\n icon={s.icon}\r\n onClick={() => {\r\n if (s.click) s.click();\r\n else if (s.onClick) s.onClick();\r\n setSettingsOpen(false);\r\n }}\r\n />\r\n )\r\n ))}\r\n <MenuDivider />\r\n <MenuItem label=\"Appearance\" icon={<PaletteIcon className=\"w-4 h-4\" />} onClick={() => setActiveMenu('appearance')} hasSubmenu />\r\n </div>\r\n )}\r\n {/* Submenus... (Logic remains same as previous phase, just collapsed here for brevity in rendering block, but included fully in final output) */}\r\n {['speed', 'quality', 'audio', 'boost', 'party', 'appearance', 'sources', 'flip', 'ratio'].includes(activeMenu) && (\r\n <div className=\"animate-in slide-in-from-right-4 fade-in duration-200\">\r\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)} />))}</>)}\r\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} />))}</>)}\r\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)} />))}</>)}\r\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)} />))}</>)}\r\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)} />))}</>)}\r\n {activeMenu === 'flip' && (\r\n <>\r\n <MenuHeader label=\"Video Flip\" onBack={() => setActiveMenu('main')} />\r\n <div className=\"p-2 space-y-1\">\r\n <Toggle label=\"Horizontal Flip\" checked={state.flipState.horizontal} onChange={() => player?.setFlip('horizontal')} />\r\n <Toggle label=\"Vertical Flip\" checked={state.flipState.vertical} onChange={() => player?.setFlip('vertical')} />\r\n </div>\r\n </>\r\n )}\r\n {activeMenu === 'ratio' && (\r\n <>\r\n <MenuHeader label=\"Aspect Ratio\" onBack={() => setActiveMenu('main')} />\r\n {['default', '16:9', '4:3'].map(r => (\r\n <MenuItem key={r} label={r === 'default' ? 'Default' : r} active={state.aspectRatio === r} onClick={() => player?.setAspectRatio(r)} />\r\n ))}\r\n </>\r\n )}\r\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></>)}\r\n {activeMenu === 'appearance' && (\r\n <>\r\n <MenuHeader label=\"Appearance\" onBack={() => setActiveMenu('main')} />\r\n <div className=\"pb-1\">\r\n <SettingsGroup title=\"Theme\">\r\n <div className=\"grid grid-cols-2 gap-2 px-3\">\r\n {THEMES.map(theme => (\r\n <button key={theme.value} onClick={() => player?.setAppearance({ theme: theme.value, themeColor: theme.color })} 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'}`} style={{ borderRadius: 'var(--radius)' }}>{theme.label}</button>\r\n ))}\r\n </div>\r\n </SettingsGroup>\r\n <SettingsGroup title=\"Icon Size\">\r\n <div className=\"grid grid-cols-3 gap-1 px-3\">\r\n {(['small', 'medium', 'large'] as const).map(s => (\r\n <button key={s} onClick={() => player?.setAppearance({ iconSize: s })} 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'}`} style={{ borderRadius: 'var(--radius)' }}>{s.charAt(0).toUpperCase() + s.slice(1)}</button>\r\n ))}\r\n </div>\r\n </SettingsGroup>\r\n <SettingsGroup title=\"Theme Color\">\r\n <div className=\"grid grid-cols-6 gap-2 px-3\">\r\n {THEME_COLORS.map(c => (\r\n <button key={c.value} title={c.label} onClick={() => player?.setAppearance({ themeColor: c.value })} 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'}`} style={{ backgroundColor: c.value, borderRadius: 'var(--radius-full)' }}>{state.themeColor === c.value && <CheckIcon className=\"w-3 h-3 text-white mx-auto stroke-[3]\" />}</button>\r\n ))}\r\n </div>\r\n <div className=\"px-3 pt-4\">\r\n <div className=\"flex items-center gap-3 bg-white/5 p-2 hover:bg-white/10 transition-colors group\" style={{ borderRadius: 'var(--radius)' }}>\r\n <div className=\"relative w-6 h-6 overflow-hidden ring-1 ring-white/20\" style={{ borderRadius: 'var(--radius-full)' }}>\r\n <input type=\"color\" value={state.themeColor} onChange={(e) => player?.setAppearance({ themeColor: e.target.value })} className=\"absolute inset-[-4px] w-[150%] h-[150%] cursor-pointer p-0 border-0\" />\r\n </div>\r\n <span className=\"text-xs text-zinc-400 font-medium group-hover:text-zinc-200\">Custom Color</span>\r\n <span className=\"text-[10px] font-mono text-zinc-500 ml-auto uppercase\">{state.themeColor}</span>\r\n </div>\r\n </div>\r\n </SettingsGroup>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div></Menu>)}\r\n </div>\r\n );\r\n default: return null;\r\n }\r\n };\r\n\r\n // --- Dynamic Context Menu ---\r\n const contextMenuItems: ContextMenuItem[] = useMemo(() => {\r\n const items: ContextMenuItem[] = [\r\n // Loop (Playback Group)\r\n { html: 'Playback', isLabel: true },\r\n {\r\n html: 'Loop',\r\n checked: state.isLooping,\r\n onClick: () => player?.toggleLoop()\r\n },\r\n { separator: true },\r\n\r\n // Flip (Transform Group)\r\n { html: 'Transform', isLabel: true },\r\n { html: 'Flip Horizontal', onClick: () => player?.setFlip('horizontal') },\r\n { html: 'Flip Vertical', onClick: () => player?.setFlip('vertical') },\r\n { separator: true },\r\n\r\n // Aspect Ratio Group\r\n { html: 'Aspect Ratio', isLabel: true },\r\n { html: 'Default', checked: state.aspectRatio === 'default', onClick: () => player?.setAspectRatio('default') },\r\n { html: '16:9', checked: state.aspectRatio === '16:9', onClick: () => player?.setAspectRatio('16:9') },\r\n { html: '4:3', checked: state.aspectRatio === '4:3', onClick: () => player?.setAspectRatio('4:3') },\r\n { separator: true },\r\n\r\n // Stats\r\n {\r\n html: 'Video Info',\r\n icon: <InfoIcon className=\"w-3.5 h-3.5\" />,\r\n onClick: () => setShowVideoInfo(true)\r\n },\r\n { separator: true }\r\n ];\r\n\r\n if (config.contextmenu) {\r\n items.push(...config.contextmenu);\r\n }\r\n\r\n // Branding\r\n items.push({\r\n html: <span className=\"text-zinc-500 text-xs font-semibold tracking-wide\">StrataPlayer</span>,\r\n disabled: true\r\n });\r\n\r\n // Always append Close at the very end\r\n items.push({\r\n html: 'Close',\r\n onClick: (close) => close(), // Wrapper handles close\r\n icon: <div className=\"text-red-400\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" /></svg></div>\r\n });\r\n\r\n return items;\r\n }, [config.contextmenu, state.aspectRatio, state.isLooping, player]);\r\n\r\n return (\r\n <div\r\n id={config.id}\r\n ref={containerRef}\r\n className={`group relative w-full h-full bg-black overflow-hidden select-none font-[family-name:var(--font-main)] outline-none rounded-[var(--radius)] text-zinc-100 strata-player-reset ${config.container || ''}`}\r\n // touch-action: manipulation improves tap response\r\n style={{ touchAction: 'manipulation', '--accent': state.themeColor } as React.CSSProperties}\r\n onMouseMove={handleMouseMove}\r\n onMouseLeave={() => { if (state.isPlaying && !settingsOpen && !subtitleMenuOpen && player) player.setControlsVisible(false); }}\r\n\r\n // Mouse Events\r\n onMouseDown={startFastForward}\r\n onMouseUp={stopFastForward}\r\n\r\n // Touch Events (Unified Gesture Logic)\r\n onTouchStart={handleTouchStart}\r\n onTouchMove={handleTouchMove}\r\n onTouchEnd={handleTouchEnd}\r\n\r\n onContextMenu={handleContextMenu}\r\n tabIndex={0}\r\n role=\"region\"\r\n aria-label=\"Video Player\"\r\n data-theme={state.theme}\r\n >\r\n {/* Same styles block as before */}\r\n <style>{`\r\n [data-theme=\"default\"] {\r\n --radius: 0.75rem;\r\n --radius-lg: 0.75rem;\r\n --radius-sm: 0.375rem;\r\n --radius-full: 9999px;\r\n --font-main: \"Inter\", sans-serif;\r\n --border-width: 0px;\r\n --bg-panel: rgba(9, 9, 11, 0.95);\r\n --tooltip-bg: #ffffff;\r\n --tooltip-text: #000000;\r\n --tooltip-border: 0px solid transparent;\r\n }\r\n [data-theme=\"pixel\"] {\r\n --radius: 0px;\r\n --radius-lg: 0px;\r\n --radius-sm: 0px;\r\n --radius-full: 0px;\r\n --font-main: \"Press Start 2P\", cursive;\r\n --border-width: 2px;\r\n --bg-panel: #000000;\r\n --tooltip-bg: #000000;\r\n --tooltip-text: #ffffff;\r\n --tooltip-border: 2px solid #ffffff;\r\n image-rendering: pixelated;\r\n }\r\n [data-theme=\"game\"] {\r\n --radius: 4px;\r\n --radius-lg: 6px;\r\n --radius-sm: 2px;\r\n --radius-full: 4px;\r\n --font-main: \"Cinzel\", serif;\r\n --border-width: 1px;\r\n --bg-panel: #0a0a0a;\r\n --tooltip-bg: #1a1a1a;\r\n --tooltip-text: #ffffff;\r\n --tooltip-border: 1px solid var(--accent);\r\n }\r\n [data-theme=\"hacker\"] {\r\n --radius: 0px;\r\n --radius-lg: 0px;\r\n --radius-sm: 0px;\r\n --radius-full: 0px;\r\n --font-main: \"JetBrains Mono\", monospace;\r\n --border-width: 1px;\r\n --bg-panel: #000000;\r\n --tooltip-bg: #000000;\r\n --tooltip-text: var(--accent);\r\n --tooltip-border: 1px solid var(--accent);\r\n text-shadow: 0 0 5px var(--accent);\r\n }\r\n \r\n [data-theme=\"pixel\"] .strata-control-btn {\r\n border: 2px solid white;\r\n background: black;\r\n }\r\n [data-theme=\"pixel\"] .strata-control-btn:hover {\r\n background: white;\r\n color: black;\r\n }\r\n [data-theme=\"pixel\"] .strata-range-input::-webkit-slider-thumb {\r\n border-radius: 0 !important;\r\n height: 16px !important;\r\n width: 16px !important;\r\n box-shadow: none !important;\r\n }\r\n \r\n [data-theme=\"hacker\"] .strata-scanlines {\r\n background: linear-gradient(\r\n to bottom,\r\n rgba(255,255,255,0),\r\n rgba(255,255,255,0) 50%,\r\n rgba(0,0,0,0.2) 50%,\r\n rgba(0,0,0,0.2)\r\n );\r\n background-size: 100% 4px;\r\n position: absolute;\r\n inset: 0;\r\n pointer-events: none;\r\n z-index: 40;\r\n }\r\n\r\n .strata-tooltip {\r\n background-color: var(--tooltip-bg);\r\n color: var(--tooltip-text);\r\n border: var(--tooltip-border);\r\n border-radius: var(--radius-sm);\r\n font-family: var(--font-main);\r\n }\r\n \r\n /* Override Backdrop for specific themes if needed */\r\n [data-theme=\"pixel\"] .strata-backdrop { backdrop-filter: none; background: #000; }\r\n [data-theme=\"hacker\"] .strata-backdrop { backdrop-filter: none; background: #000; }\r\n `}</style>\r\n\r\n {state.theme === 'hacker' && <div className=\"strata-scanlines\" />}\r\n\r\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>}\r\n {player && (\r\n <>\r\n {/* Custom Layers */}\r\n {config.layers?.map((layer, idx) => (\r\n <div\r\n key={idx}\r\n className={`absolute inset-0 pointer-events-none z-10 ${layer.className || ''}`}\r\n style={layer.style}\r\n >\r\n <HtmlOrNode content={layer.html || ''} className=\"w-full h-full\" />\r\n </div>\r\n ))}\r\n\r\n <NotificationContainer notifications={state.notifications} />\r\n <SubtitleOverlay cues={state.activeCues} settings={state.subtitleSettings} />\r\n\r\n {/* Main Interaction Layer */}\r\n <div className=\"absolute inset-0 z-0\" onClick={handleContainerClick} aria-hidden=\"true\" />\r\n\r\n {poster && !hasPlayed && (\r\n <div\r\n className=\"absolute inset-0 bg-cover bg-center z-[5] pointer-events-none\"\r\n style={{ backgroundImage: `url(${poster})` }}\r\n />\r\n )}\r\n\r\n {/* Context Menu */}\r\n {contextMenu.visible && (\r\n <ContextMenu\r\n x={contextMenu.x}\r\n y={contextMenu.y}\r\n items={contextMenuItems}\r\n onClose={() => setContextMenu({ ...contextMenu, visible: false })}\r\n containerWidth={playerWidth}\r\n containerHeight={playerHeight}\r\n />\r\n )}\r\n\r\n {/* Video Info Modal */}\r\n {showVideoInfo && player && (\r\n <VideoInfo player={player} onClose={() => setShowVideoInfo(false)} />\r\n )}\r\n\r\n {/* Fast Forward Overlay */}\r\n {isFastForwarding && (\r\n <div className=\"absolute top-8 left-1/2 -translate-x-1/2 bg-black/50 backdrop-blur-md px-4 py-2 rounded-full flex items-center gap-2 z-40 animate-in fade-in zoom-in duration-200\">\r\n <FastForwardIcon className=\"w-4 h-4 text-[var(--accent)] fill-current\" />\r\n <span className=\"text-xs font-bold tracking-wider\">2x Speed</span>\r\n </div>\r\n )}\r\n\r\n {/* Mobile Lock Button */}\r\n {useLock && state.controlsVisible && (\r\n <button\r\n onClick={(e) => { e.stopPropagation(); player.toggleLock(); }}\r\n className={`absolute left-4 md:left-6 bottom-24 md:bottom-28 z-50 p-3 rounded-full bg-black/50 backdrop-blur-md border border-white/10 text-white transition-all active:scale-95 ${state.isLocked ? 'text-[var(--accent)] bg-white/10' : 'hover:bg-white/10'}`}\r\n >\r\n {state.isLocked ? <LockIcon className=\"w-5 h-5\" /> : <UnlockIcon className=\"w-5 h-5\" />}\r\n </button>\r\n )}\r\n\r\n {seekAnimation && (\r\n <div\r\n key={seekAnimation.id}\r\n 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 fill-mode-forwards ${seekAnimation.type === 'rewind' ? 'left-0 rounded-r-[4rem]' : 'right-0 rounded-l-[4rem]'}`}\r\n onAnimationEnd={() => setSeekAnimation(null)}\r\n >\r\n <div className=\"flex flex-col items-center text-white drop-shadow-lg\">\r\n {seekAnimation.type === 'rewind' ? <Replay10Icon className=\"w-12 h-12 animate-pulse\" /> : <Forward10Icon className=\"w-12 h-12 animate-pulse\" />}\r\n <span className=\"font-bold text-sm mt-2 font-mono\">{seekAnimation.type === 'rewind' ? '-10s' : '+10s'}</span>\r\n </div>\r\n </div>\r\n )}\r\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>}\r\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>}\r\n\r\n {/* Center Controls - Hidden if locked or configured off */}\r\n {useCenterControls && !state.isLocked && (((!state.isPlaying && !state.isBuffering && !state.error) || state.controlsVisible) && !state.isBuffering) ? (\r\n <div\r\n className={`absolute inset-0 flex items-center justify-center z-10 transition-opacity duration-300 pointer-events-none ${state.controlsVisible || !state.isPlaying ? 'opacity-100' : 'opacity-0'}`}\r\n >\r\n <div className=\"flex items-center gap-8 md:gap-16 pointer-events-auto\">\r\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>\r\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>\r\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>\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {/* Bottom Control Bar - Hidden if locked */}\r\n <div\r\n 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 ${isControlsVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4 pointer-events-none'}`}\r\n onClick={(e) => { if (e.target === e.currentTarget) { setSettingsOpen(false); setSubtitleMenuOpen(false); setIsVolumeLocked(false); } e.stopPropagation(); }}\r\n >\r\n {/* Progress Bar (Hidden in Live Mode) */}\r\n {!config.isLive && (\r\n <div\r\n ref={progressBarRef}\r\n className=\"relative w-full h-3 group/slider mb-3 cursor-pointer touch-none flex items-center\"\r\n onMouseMove={handleProgressMove}\r\n onMouseLeave={() => { setHoverTime(null); setCurrentThumbnail(null); }}\r\n onMouseDown={handleSeekStart}\r\n onTouchStart={handleSeekStart}\r\n >\r\n {/* Highlights */}\r\n {config.highlight?.map((h, i) => (\r\n <div key={i} className=\"absolute top-1/2 -translate-y-1/2 w-1.5 h-1.5 bg-yellow-400 rounded-full z-10 pointer-events-none\" style={{ left: `${(h.time / state.duration) * 100}%` }} title={h.text} />\r\n ))}\r\n\r\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>)}\r\n\r\n {/* Track */}\r\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)' }}>\r\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}%` }} />))}\r\n <div className=\"absolute left-0 top-0 bottom-0 bg-[var(--accent)]\" style={{ width: `${((isScrubbing ? scrubbingTime : state.currentTime) / state.duration) * 100}%` }} />\r\n </div>\r\n\r\n {/* Thumb */}\r\n <div\r\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\"\r\n style={{\r\n left: `${((isScrubbing ? scrubbingTime : state.currentTime) / state.duration) * 100}%`,\r\n borderRadius: 'var(--radius-full)'\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-between pointer-events-auto\">\r\n <div className=\"flex items-center gap-3\">\r\n {controls.filter(c => c.position === 'left' || c.position === 'center').map(renderControl)}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1\">\r\n {controls.filter(c => c.position === 'right').map(renderControl)}\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","\r\nimport './index.css';\r\nimport React from 'react';\r\nimport { createRoot } from 'react-dom/client';\r\nimport { StrataPlayer } from './ui/StrataPlayer';\r\nimport {\r\n StrataCore,\r\n PlayerState,\r\n PlayerSource,\r\n StrataConfig,\r\n TextTrackConfig,\r\n IPlugin,\r\n SubtitleSettings,\r\n PlayerTheme,\r\n Highlight,\r\n LayerConfig,\r\n ContextMenuItem,\r\n ControlItem,\r\n SettingItem,\r\n Notification\r\n} from './core/StrataCore';\r\n\r\n// Export React Component\r\nexport { StrataPlayer };\r\n\r\n// Export Core & Plugins for advanced usage\r\nexport { StrataCore };\r\nexport type {\r\n PlayerState,\r\n PlayerSource,\r\n StrataConfig,\r\n TextTrackConfig,\r\n IPlugin,\r\n SubtitleSettings,\r\n PlayerTheme,\r\n Highlight,\r\n LayerConfig,\r\n ContextMenuItem,\r\n ControlItem,\r\n SettingItem,\r\n Notification\r\n};\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","isFs","lockType","state","settings","val","seconds","s","ms","details","idx","total","title","_b","artwork","duration","position","playbackRate","message","isFatal","customMessage","error","delay","time","onCanPlay","finalMsg","buffered","tracks","t","track","index","url","retries","timeout","effectiveTimeout","i","controller","id","res","r","container","entries","entry","plugin","sources","wasPlaying","source","isRetry","srcObj","type","oldTracks","label","file","reader","content","blob","newTrackIndex","src","lang","isDefault","vol","safeVol","gain","visible","err","canvas","ctx","a","prev","direction","current","newState","scaleX","scaleY","ratio","w","initializeCastApi","isAvailable","castSession","mediaInfo","request","cues","newSettings","offset","currentOffset","delta","cue","notifId","response","contentLength","loaded","chunks","done","percent","n","newNotification","p","formatTime","h","m","fetchVttWithRetry","parseVTT","notify","lines","start","end","baseUrl","parseTime","parts","line","times","urlPart","hash","x","y","coords","useTransition","isActive","isMounted","setIsMounted","useState","isVisible","setIsVisible","useEffect","timer","toKebabCase","string","mergeClasses","classes","className","array","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","props","ArrowLeft","Bold","Camera","Captions","CaseUpper","Cast","Check","Clock","Download","Droplet","Eye","Info","LoaderCircle","LockOpen","Lock","Maximize","Minimize","Minus","Monitor","MoveVertical","Palette","Pause","PictureInPicture","Play","Plus","RefreshCcw","RotateCcw","RotateCw","Settings","SlidersHorizontal","Type","Upload","Users","Volume1","Volume2","VolumeX","X","Zap","PlayIcon","PauseIcon","VolumeHighIcon","VolumeLowIcon","VolumeMuteIcon","MaximizeIcon","MinimizeIcon","SettingsIcon","CheckIcon","PipIcon","SubtitleIcon","Subtitles","DownloadIcon","UploadIcon","ArrowLeftIcon","LoaderIcon","Loader2","CastIcon","UsersIcon","ClockIcon","MinusIcon","PlusIcon","CustomizeIcon","TypeIcon","PaletteIcon","EyeIcon","MoveVerticalIcon","ResetIcon","BoldIcon","CaseUpperIcon","BlurIcon","CameraIcon","LockIcon","UnlockIcon","Unlock","WebFullscreenIcon","FastForwardIcon","CloseIcon","InfoIcon","Replay10Icon","Forward10Icon","NotificationContainer","notifications","jsxs","jsx","SubtitleOverlay","getTextShadow","text","Menu","onClose","align","maxHeight","useRef","positionClasses","styleObj","RenderContent","MenuItem","active","onClick","hasSubmenu","icon","MenuHeader","onBack","rightAction","MenuDivider","Toggle","checked","onChange","tooltip","Slider","min","max","step","formatValue","Select","options","opt","SettingsGroup","SubtitleMenu","onSelect","onUpload","onSettingsChange","onReset","onOffsetChange","animationClass","view","setView","fileInputRef","Fragment","v","c","ContextMenu","items","containerWidth","containerHeight","menuRef","layout","setLayout","useLayoutEffect","rect","width","height","newLeft","newTop","availableHeight","handleClickOutside","item","React","VideoInfo","player","stats","setStats","q","k","THEME_COLORS","THEMES","HtmlOrNode","style","StrataPlayer","poster","autoPlay","thumbnails","textTracks","plugins","onGetInstance","useScreenshot","usePip","useSetting","useFullscreen","useFullscreenWeb","useLock","useFastForward","useFlip","useAspectRatio","useHotKey","isBackdrop","useGestureSeek","useCenterControls","fetchTimeout","containerRef","setPlayer","hasPlayed","setHasPlayed","playerHeight","setPlayerHeight","playerWidth","setPlayerWidth","useMemo","useSyncExternalStore","useCallback","settingsOpen","setSettingsOpen","subtitleMenuOpen","setSubtitleMenuOpen","activeMenu","setActiveMenu","contextMenu","setContextMenu","showVideoInfo","setShowVideoInfo","settingsTransition","subtitleTransition","isScrubbing","setIsScrubbing","scrubbingTime","setScrubbingTime","isVolumeScrubbing","setIsVolumeScrubbing","isVolumeHovered","setIsVolumeHovered","isVolumeLocked","setIsVolumeLocked","thumbnailCues","setThumbnailCues","hoverTime","setHoverTime","hoverPos","setHoverPos","currentThumbnail","setCurrentThumbnail","seekAnimation","setSeekAnimation","skipTrigger","setSkipTrigger","isFastForwarding","setIsFastForwarding","fastForwardTimerRef","originalRateRef","touchStartX","touchStartTime","isDraggingRef","clickTimeoutRef","controlsTimeoutRef","progressBarRef","volumeBarRef","animationCleanupRef","core","observer","updates","setCues","handleKeyDown","handleMouseMove","startFastForward","stopFastForward","handleTouchStart","handleTouchMove","deltaX","deltaRatio","newTime","handleTouchEnd","calculateTimeFromEvent","clientX","handleSeekStart","handleMove","moveEvent","handleUp","upEvent","calculateVolumeFromEvent","handleVolumeStart","handleProgressMove","triggerSkip","handleContainerClick","now","handleContextMenu","handleVolumeIconClick","isTouch","isMobile","VolIcon","menuMaxHeight","getIconClass","getButtonClass","iconClass","btnClass","center","isControlsVisible","isVolumeVisible","backdropClass","controls","existing","b","renderControl","_c","_d","rate","lvl","_e","theme","contextMenuItems","close","layer","range","mountStrataPlayer","root","createRoot","newProps"],"mappings":"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","x_google_ignoreList":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47]}