strataplayer 1.2.13 → 1.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/StrataCore.d.ts +2 -0
- package/dist/strataplayer.cjs.js +6 -6
- package/dist/strataplayer.cjs.js.map +1 -1
- package/dist/strataplayer.es.js +697 -578
- package/dist/strataplayer.es.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/ui/Icons.d.ts +30 -0
- package/dist/ui/components/Menu.d.ts +1 -1
- package/dist/utils/playerUtils.d.ts +1 -0
- package/package.json +1 -1
|
@@ -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","../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 isWebFullscreen: 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 isWebFullscreen: 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 toggleWebFullscreen() {\r\n const isWebFs = this.store.get().isWebFullscreen;\r\n\r\n // If native fullscreen is active, exit it first to avoid conflicts\r\n if (document.fullscreenElement) {\r\n document.exitFullscreen().catch(() => { });\r\n }\r\n\r\n const newState = !isWebFs;\r\n this.store.setState({ isWebFullscreen: newState });\r\n\r\n // Lock body scroll when in web fullscreen\r\n if (typeof document !== 'undefined') {\r\n document.body.style.overflow = newState ? 'hidden' : '';\r\n }\r\n\r\n this.emit('webfullscreen', newState);\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\r\n // Clean up web fullscreen scroll lock if active\r\n if (this.store.get().isWebFullscreen && typeof document !== 'undefined') {\r\n document.body.style.overflow = '';\r\n }\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","\r\nimport React from 'react';\r\n\r\n// Base SVG Wrapper matching Lucide defaults\r\nconst Icon = ({ className, children, fill = \"none\", strokeWidth = 2, viewBox = \"0 0 24 24\" }: { className?: string, children: React.ReactNode, fill?: string, strokeWidth?: number, viewBox?: string }) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox={viewBox}\r\n fill={fill}\r\n stroke=\"currentColor\"\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n {children}\r\n </svg>\r\n);\r\n\r\nexport const PlayIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"5 3 19 12 5 21 5 3\" />\r\n </Icon>\r\n);\r\n\r\nexport const PauseIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"4\" height=\"16\" x=\"6\" y=\"4\" rx=\"1\" />\r\n <rect width=\"4\" height=\"16\" x=\"14\" y=\"4\" rx=\"1\" />\r\n </Icon>\r\n);\r\n\r\nexport const VolumeHighIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" />\r\n <path d=\"M19.07 4.93a10 10 0 0 1 0 14.14\" />\r\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\" />\r\n </Icon>\r\n);\r\n\r\nexport const VolumeLowIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" />\r\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\" />\r\n </Icon>\r\n);\r\n\r\nexport const VolumeMuteIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" />\r\n <line x1=\"23\" x2=\"17\" y1=\"9\" y2=\"15\" />\r\n <line x1=\"17\" x2=\"23\" y1=\"9\" y2=\"15\" />\r\n </Icon>\r\n);\r\n\r\nexport const MaximizeIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3\" />\r\n <path d=\"M21 8V5a2 2 0 0 0-2-2h-3\" />\r\n <path d=\"M3 16v3a2 2 0 0 0 2 2h3\" />\r\n <path d=\"M16 21h3a2 2 0 0 0 2-2v-3\" />\r\n </Icon>\r\n);\r\n\r\nexport const MinimizeIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3\" />\r\n <path d=\"M21 8h-3a2 2 0 0 1-2-2V3\" />\r\n <path d=\"M3 16h3a2 2 0 0 1 2 2v3\" />\r\n <path d=\"M16 21v-3a2 2 0 0 1 2-2h3\" />\r\n </Icon>\r\n);\r\n\r\nexport const SettingsIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path 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-.09a2 2 0 0 1-1-1.74v-.47a2 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\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\r\n </Icon>\r\n);\r\n\r\nexport const CheckIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M20 6 9 17l-5-5\" />\r\n </Icon>\r\n);\r\n\r\nexport const PipIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M21 9V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v10c0 1.1.9 2 2 2h4\" />\r\n <rect x=\"12\" y=\"13\" width=\"10\" height=\"7\" rx=\"2\" />\r\n </Icon>\r\n);\r\n\r\nexport const SubtitleIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"18\" height=\"14\" x=\"3\" y=\"5\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M7 15h4\" />\r\n <path d=\"M15 15h2\" />\r\n <path d=\"M7 11h2\" />\r\n <path d=\"M13 11h4\" />\r\n </Icon>\r\n);\r\n\r\nexport const DownloadIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"7 10 12 15 17 10\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"15\" y2=\"3\" />\r\n </Icon>\r\n);\r\n\r\nexport const UploadIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"17 8 12 3 7 8\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\" />\r\n </Icon>\r\n);\r\n\r\nexport const ArrowLeftIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"m12 19-7-7 7-7\" />\r\n <path d=\"M19 12H5\" />\r\n </Icon>\r\n);\r\n\r\nexport const LoaderIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\r\n </Icon>\r\n);\r\n\r\nexport const CastIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M2 16.1A5 5 0 0 1 5.9 20\" />\r\n <path d=\"M2 12.05A9 9 0 0 1 9.95 20\" />\r\n <path d=\"M2 8V6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6\" />\r\n <line x1=\"2\" x2=\"2.01\" y1=\"20\" y2=\"20\" />\r\n </Icon>\r\n);\r\n\r\nexport const UsersIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\r\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\r\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\r\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\r\n </Icon>\r\n);\r\n\r\nexport const ClockIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <polyline points=\"12 6 12 12 16 14\" />\r\n </Icon>\r\n);\r\n\r\nexport const MinusIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M5 12h14\" />\r\n </Icon>\r\n);\r\n\r\nexport const PlusIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M5 12h14\" />\r\n <path d=\"M12 5v14\" />\r\n </Icon>\r\n);\r\n\r\nexport const CustomizeIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M4 21v-7\" />\r\n <path d=\"M4 10V3\" />\r\n <path d=\"M12 21v-9\" />\r\n <path d=\"M12 8V3\" />\r\n <path d=\"M20 21v-5\" />\r\n <path d=\"M20 12V3\" />\r\n <path d=\"M1 14h6\" />\r\n <path d=\"M9 8h6\" />\r\n <path d=\"M17 16h6\" />\r\n </Icon>\r\n);\r\n\r\nexport const TypeIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polyline points=\"4 7 4 4 20 4 20 7\" />\r\n <line x1=\"9\" x2=\"15\" y1=\"20\" y2=\"20\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"4\" y2=\"20\" />\r\n </Icon>\r\n);\r\n\r\nexport const PaletteIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <circle cx=\"13.5\" cy=\"6.5\" r=\".5\" fill=\"currentColor\" />\r\n <circle cx=\"17.5\" cy=\"10.5\" r=\".5\" fill=\"currentColor\" />\r\n <circle cx=\"8.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\r\n <circle cx=\"6.5\" cy=\"12.5\" r=\".5\" fill=\"currentColor\" />\r\n <path 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\" />\r\n </Icon>\r\n);\r\n\r\nexport const EyeIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\r\n </Icon>\r\n);\r\n\r\nexport const MoveVerticalIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polyline points=\"8 18 12 22 16 18\" />\r\n <polyline points=\"8 6 12 2 16 6\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"2\" y2=\"22\" />\r\n </Icon>\r\n);\r\n\r\nexport const ResetIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\r\n <path d=\"M3 3v5h5\" />\r\n </Icon>\r\n);\r\n\r\nexport const BoldIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\r\n <path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\r\n </Icon>\r\n);\r\n\r\nexport const CaseUpperIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"m3 17 4-10 4 10\" />\r\n <path d=\"M4 13h6\" />\r\n <path d=\"M15 12h4.5a2.5 2.5 0 0 1 0 5H15V7h4a2.5 2.5 0 0 1 0 5h-4\" />\r\n </Icon>\r\n);\r\n\r\nexport const BlurIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path 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\" />\r\n </Icon>\r\n);\r\n\r\nexport const CameraIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path 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\" />\r\n <circle cx=\"12\" cy=\"13\" r=\"3\" />\r\n </Icon>\r\n);\r\n\r\nexport const LockIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\r\n </Icon>\r\n);\r\n\r\nexport const UnlockIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M7 11V7a5 5 0 0 1 9.9-1\" />\r\n </Icon>\r\n);\r\n\r\nexport const WebFullscreenIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\" />\r\n <line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\" />\r\n </Icon>\r\n);\r\n\r\nexport const FastForwardIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"13 19 22 12 13 5 13 19\" />\r\n <polygon points=\"2 19 11 12 2 5 2 19\" />\r\n </Icon>\r\n);\r\n\r\nexport const ZapIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\" />\r\n </Icon>\r\n);\r\n\r\nexport const RatioIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"5\" rx=\"2\" />\r\n <line x1=\"2\" x2=\"22\" y1=\"12\" y2=\"12\" />\r\n </Icon>\r\n);\r\n\r\nexport const ExpandIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"m21 21-6-6m6 6v-4.8m0 4.8h-4.8\" />\r\n <path d=\"M3 16.2V21m0 0h4.8M3 21l6-6\" />\r\n <path d=\"M21 7.8V3m0 0h-4.8M21 3l-6 6\" />\r\n <path d=\"M3 7.8V3m0 0h4.8M3 3l6 6\" />\r\n </Icon>\r\n);\r\n\r\nexport const CloseIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </Icon>\r\n);\r\n\r\nexport const InfoIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 16v-4\" />\r\n <path d=\"M12 8h.01\" />\r\n </Icon>\r\n);\r\n\r\nexport const CopyIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\r\n </Icon>\r\n);\r\n\r\nexport const MenuIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\" />\r\n </Icon>\r\n);\r\n\r\nexport const ChevronRightIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"m9 18 6-6-6-6\" />\r\n </Icon>\r\n);\r\n\r\n// Custom Composite Icons (Reusing Base Icons + Text)\r\nexport const Replay10Icon = ({ className }: { className?: string }) => (\r\n <div className={`relative flex items-center justify-center ${className}`}>\r\n <Icon className=\"w-full h-full\">\r\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\r\n <path d=\"M3 3v5h5\" />\r\n </Icon>\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 <Icon className=\"w-full h-full\">\r\n <path d=\"M21 12a9 9 0 1 1-9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\r\n <path d=\"M21 3v5h-5\" />\r\n </Icon>\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 const base = import.meta.env?.BASE_URL || '/';\r\n const src = `${base}logo.png`;\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-25 flex flex-col gap-2 pointer-events-none font-sans max-w-[85%] md:max-w-[320px]\">\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-3 py-2 rounded-lg shadow-xl text-xs font-medium flex items-start gap-2.5 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-3.5 h-3.5 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-0.5 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-1 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 { createPortal } from 'react-dom';\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, Slider, Select } 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 const [isMobile, setIsMobile] = useState(false);\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 setIsMobile('ontouchstart' in window || navigator.maxTouchPoints > 0);\r\n\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 // Note: Autoplay might be blocked by browsers if not muted, but user requested unmuted default.\r\n player.play().catch(() => {\r\n // If autoplay fails (likely due to audio), we could fallback to mute, but keeping strictly as requested.\r\n console.warn('Autoplay failed (likely needs user interaction)');\r\n });\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 const key = e.key.toLowerCase();\r\n switch (key) {\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 case 'escape':\r\n // Check store directly to avoid stale state in closure\r\n if (player.store.get().isWebFullscreen) {\r\n e.preventDefault();\r\n player.toggleWebFullscreen();\r\n }\r\n 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 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 rounded-md border border-white/10\" style={{ backgroundColor: `${state.themeColor}1a`, borderColor: `${state.themeColor}33` }}>\r\n <div className=\"w-2 h-2 rounded-full animate-pulse\" style={{ backgroundColor: state.themeColor }} />\r\n <span className=\"text-[10px] font-bold tracking-wider\" style={{ color: state.themeColor }}>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 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\" onClick={() => player?.toggleWebFullscreen()} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 hidden sm:block focus:outline-none ${btnClass} ${state.isWebFullscreen ? 'text-[var(--accent)]' : ''}`} 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 const isWebFs = state.isWebFullscreen;\r\n\r\n const playerContent = (\r\n <div\r\n id={config.id}\r\n ref={containerRef}\r\n className={`group bg-black overflow-hidden select-none font-[family-name:var(--font-main)] outline-none text-zinc-100 strata-player-reset ${isWebFs ? 'fixed inset-0 z-[2147483647] w-screen h-screen rounded-none' : 'relative w-full h-full rounded-[var(--radius)]'} ${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\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 && isMobile && 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 duration-300 active:scale-125 active:opacity-80 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 duration-300 active:scale-90 active:opacity-80 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 duration-300 active:scale-125 active:opacity-80 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 py-4 bg-gradient-to-t from-black/90 via-black/50 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 if (isWebFs && typeof document !== 'undefined') {\r\n return createPortal(playerContent, document.body);\r\n }\r\n\r\n return playerContent;\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","isWebFs","newState","canvas","ctx","prev","direction","current","scaleX","scaleY","ratio","w","initializeCastApi","isAvailable","castSession","mediaInfo","request","cues","c","newSettings","offset","currentOffset","delta","cue","notifId","response","contentLength","loaded","chunks","done","percent","a","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","Icon","className","children","fill","strokeWidth","viewBox","jsx","PlayIcon","PauseIcon","jsxs","VolumeHighIcon","VolumeLowIcon","VolumeMuteIcon","MaximizeIcon","MinimizeIcon","SettingsIcon","CheckIcon","PipIcon","SubtitleIcon","DownloadIcon","UploadIcon","ArrowLeftIcon","LoaderIcon","CastIcon","UsersIcon","ClockIcon","MinusIcon","PlusIcon","CustomizeIcon","TypeIcon","PaletteIcon","EyeIcon","MoveVerticalIcon","ResetIcon","BoldIcon","CaseUpperIcon","BlurIcon","CameraIcon","LockIcon","UnlockIcon","WebFullscreenIcon","FastForwardIcon","CloseIcon","InfoIcon","Replay10Icon","Forward10Icon","NotificationContainer","notifications","SubtitleOverlay","getTextShadow","text","Menu","onClose","align","maxHeight","ref","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","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","props","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","isMobile","setIsMobile","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","VolIcon","menuMaxHeight","getIconClass","getButtonClass","iconClass","btnClass","center","isControlsVisible","isVolumeVisible","backdropClass","controls","existing","b","renderControl","_c","_d","rate","lvl","_e","theme","contextMenuItems","close","playerContent","layer","range","createPortal","mountStrataPlayer","root","createRoot","newProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"strataplayer.es.js","sources":["../core/EventBus.ts","../core/NanoStore.ts","../core/AudioEngine.ts","../utils/playerUtils.ts","../core/StrataCore.ts","../ui/hooks/useTransition.tsx","../ui/Icons.tsx","../ui/components/NotificationContainer.tsx","../ui/components/SubtitleOverlay.tsx","../ui/components/Menu.tsx","../ui/components/SettingsPrimitives.tsx","../ui/components/SubtitleMenu.tsx","../ui/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\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\nexport const injectLibraryResources = () => {\r\n if (typeof document === 'undefined') return;\r\n\r\n // 1. Google Fonts\r\n if (!document.getElementById('strata-fonts')) {\r\n // Preconnects for performance\r\n const pre1 = document.createElement('link');\r\n pre1.rel = 'preconnect';\r\n pre1.href = 'https://fonts.googleapis.com';\r\n document.head.appendChild(pre1);\r\n\r\n const pre2 = document.createElement('link');\r\n pre2.rel = 'preconnect';\r\n pre2.href = 'https://fonts.gstatic.com';\r\n pre2.crossOrigin = 'anonymous';\r\n document.head.appendChild(pre2);\r\n\r\n // Main Font Sheet\r\n const link = document.createElement('link');\r\n link.id = 'strata-fonts';\r\n link.rel = 'stylesheet';\r\n link.href = 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&family=Press+Start+2P&family=Cinzel:wght@400;600;700&display=swap';\r\n document.head.appendChild(link);\r\n }\r\n\r\n // 2. Google Cast SDK\r\n // Ensure we don't inject if already present\r\n if (!document.querySelector('script[src*=\"cast_sender.js\"]') && !(window as any).cast) {\r\n const script = document.createElement('script');\r\n script.src = 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1';\r\n document.head.appendChild(script);\r\n }\r\n};\r\n","\r\nimport { EventBus, EventCallback } from './EventBus';\r\nimport { NanoStore } from './NanoStore';\r\nimport { AudioEngine } from './AudioEngine';\r\nimport { injectLibraryResources } from '../utils/playerUtils';\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 isWebFullscreen: 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 sourceStatuses: Record<number, 'success' | 'error' | undefined>;\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 isWebFullscreen: 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 sourceStatuses: {},\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 sourceStatuses: {} // Never persist statuses\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 injectLibraryResources(); // Ensure fonts and external SDKs are loaded\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 // Mark source as success\r\n this.updateSourceStatus('success');\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 // Mark source as success\r\n this.updateSourceStatus('success');\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 private updateSourceStatus(status: 'success' | 'error') {\r\n const idx = this.store.get().currentSourceIndex;\r\n if (idx !== -1) {\r\n this.store.setState((prev) => ({\r\n sourceStatuses: { ...prev.sourceStatuses, [idx]: status }\r\n }));\r\n }\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 // Mark source as error\r\n this.updateSourceStatus('error');\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 toggleWebFullscreen() {\r\n const isWebFs = this.store.get().isWebFullscreen;\r\n\r\n // If native fullscreen is active, exit it first to avoid conflicts\r\n if (document.fullscreenElement) {\r\n document.exitFullscreen().catch(() => { });\r\n }\r\n\r\n const newState = !isWebFs;\r\n this.store.setState({ isWebFullscreen: newState });\r\n\r\n // Lock body scroll when in web fullscreen\r\n if (typeof document !== 'undefined') {\r\n document.body.style.overflow = newState ? 'hidden' : '';\r\n }\r\n\r\n this.emit('webfullscreen', newState);\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\r\n // Clean up web fullscreen scroll lock if active\r\n if (this.store.get().isWebFullscreen && typeof document !== 'undefined') {\r\n document.body.style.overflow = '';\r\n }\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\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","\r\nimport React from 'react';\r\n\r\n// Base SVG Wrapper matching Lucide defaults\r\nconst Icon = ({ className, children, fill = \"none\", strokeWidth = 2, viewBox = \"0 0 24 24\" }: { className?: string, children: React.ReactNode, fill?: string, strokeWidth?: number, viewBox?: string }) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox={viewBox}\r\n fill={fill}\r\n stroke=\"currentColor\"\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n {children}\r\n </svg>\r\n);\r\n\r\nexport const PlayIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"5 3 19 12 5 21 5 3\" />\r\n </Icon>\r\n);\r\n\r\nexport const PauseIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"4\" height=\"16\" x=\"6\" y=\"4\" rx=\"1\" />\r\n <rect width=\"4\" height=\"16\" x=\"14\" y=\"4\" rx=\"1\" />\r\n </Icon>\r\n);\r\n\r\nexport const VolumeHighIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" />\r\n <path d=\"M19.07 4.93a10 10 0 0 1 0 14.14\" />\r\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\" />\r\n </Icon>\r\n);\r\n\r\nexport const VolumeLowIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" />\r\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\" />\r\n </Icon>\r\n);\r\n\r\nexport const VolumeMuteIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" />\r\n <line x1=\"23\" x2=\"17\" y1=\"9\" y2=\"15\" />\r\n <line x1=\"17\" x2=\"23\" y1=\"9\" y2=\"15\" />\r\n </Icon>\r\n);\r\n\r\nexport const MaximizeIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3\" />\r\n <path d=\"M21 8V5a2 2 0 0 0-2-2h-3\" />\r\n <path d=\"M3 16v3a2 2 0 0 0 2 2h3\" />\r\n <path d=\"M16 21h3a2 2 0 0 0 2-2v-3\" />\r\n </Icon>\r\n);\r\n\r\nexport const MinimizeIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3\" />\r\n <path d=\"M21 8h-3a2 2 0 0 1-2-2V3\" />\r\n <path d=\"M3 16h3a2 2 0 0 1 2 2v3\" />\r\n <path d=\"M16 21v-3a2 2 0 0 1 2-2h3\" />\r\n </Icon>\r\n);\r\n\r\nexport const SettingsIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path 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-.09a2 2 0 0 1-1-1.74v-.47a2 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\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\r\n </Icon>\r\n);\r\n\r\nexport const CheckIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M20 6 9 17l-5-5\" />\r\n </Icon>\r\n);\r\n\r\nexport const PipIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M21 9V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v10c0 1.1.9 2 2 2h4\" />\r\n <rect x=\"12\" y=\"13\" width=\"10\" height=\"7\" rx=\"2\" />\r\n </Icon>\r\n);\r\n\r\nexport const SubtitleIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"18\" height=\"14\" x=\"3\" y=\"5\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M7 15h4\" />\r\n <path d=\"M15 15h2\" />\r\n <path d=\"M7 11h2\" />\r\n <path d=\"M13 11h4\" />\r\n </Icon>\r\n);\r\n\r\nexport const DownloadIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"7 10 12 15 17 10\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"15\" y2=\"3\" />\r\n </Icon>\r\n);\r\n\r\nexport const UploadIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"17 8 12 3 7 8\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\" />\r\n </Icon>\r\n);\r\n\r\nexport const ArrowLeftIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"m12 19-7-7 7-7\" />\r\n <path d=\"M19 12H5\" />\r\n </Icon>\r\n);\r\n\r\nexport const LoaderIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\r\n </Icon>\r\n);\r\n\r\nexport const CastIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M2 16.1A5 5 0 0 1 5.9 20\" />\r\n <path d=\"M2 12.05A9 9 0 0 1 9.95 20\" />\r\n <path d=\"M2 8V6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6\" />\r\n <line x1=\"2\" x2=\"2.01\" y1=\"20\" y2=\"20\" />\r\n </Icon>\r\n);\r\n\r\nexport const UsersIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\r\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\r\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\r\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\r\n </Icon>\r\n);\r\n\r\nexport const ClockIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <polyline points=\"12 6 12 12 16 14\" />\r\n </Icon>\r\n);\r\n\r\nexport const MinusIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M5 12h14\" />\r\n </Icon>\r\n);\r\n\r\nexport const PlusIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M5 12h14\" />\r\n <path d=\"M12 5v14\" />\r\n </Icon>\r\n);\r\n\r\nexport const CustomizeIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M4 21v-7\" />\r\n <path d=\"M4 10V3\" />\r\n <path d=\"M12 21v-9\" />\r\n <path d=\"M12 8V3\" />\r\n <path d=\"M20 21v-5\" />\r\n <path d=\"M20 12V3\" />\r\n <path d=\"M1 14h6\" />\r\n <path d=\"M9 8h6\" />\r\n <path d=\"M17 16h6\" />\r\n </Icon>\r\n);\r\n\r\nexport const TypeIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polyline points=\"4 7 4 4 20 4 20 7\" />\r\n <line x1=\"9\" x2=\"15\" y1=\"20\" y2=\"20\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"4\" y2=\"20\" />\r\n </Icon>\r\n);\r\n\r\nexport const PaletteIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <circle cx=\"13.5\" cy=\"6.5\" r=\".5\" fill=\"currentColor\" />\r\n <circle cx=\"17.5\" cy=\"10.5\" r=\".5\" fill=\"currentColor\" />\r\n <circle cx=\"8.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\r\n <circle cx=\"6.5\" cy=\"12.5\" r=\".5\" fill=\"currentColor\" />\r\n <path 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\" />\r\n </Icon>\r\n);\r\n\r\nexport const EyeIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\r\n </Icon>\r\n);\r\n\r\nexport const MoveVerticalIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polyline points=\"8 18 12 22 16 18\" />\r\n <polyline points=\"8 6 12 2 16 6\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"2\" y2=\"22\" />\r\n </Icon>\r\n);\r\n\r\nexport const ResetIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\r\n <path d=\"M3 3v5h5\" />\r\n </Icon>\r\n);\r\n\r\nexport const BoldIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\r\n <path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\r\n </Icon>\r\n);\r\n\r\nexport const CaseUpperIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"m3 17 4-10 4 10\" />\r\n <path d=\"M4 13h6\" />\r\n <path d=\"M15 12h4.5a2.5 2.5 0 0 1 0 5H15V7h4a2.5 2.5 0 0 1 0 5h-4\" />\r\n </Icon>\r\n);\r\n\r\nexport const BlurIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path 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\" />\r\n </Icon>\r\n);\r\n\r\nexport const CameraIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path 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\" />\r\n <circle cx=\"12\" cy=\"13\" r=\"3\" />\r\n </Icon>\r\n);\r\n\r\nexport const LockIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\r\n </Icon>\r\n);\r\n\r\nexport const UnlockIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M7 11V7a5 5 0 0 1 9.9-1\" />\r\n </Icon>\r\n);\r\n\r\nexport const WebFullscreenIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\" />\r\n <line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\" />\r\n </Icon>\r\n);\r\n\r\nexport const FastForwardIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"13 19 22 12 13 5 13 19\" />\r\n <polygon points=\"2 19 11 12 2 5 2 19\" />\r\n </Icon>\r\n);\r\n\r\nexport const ZapIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\" />\r\n </Icon>\r\n);\r\n\r\nexport const RatioIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"5\" rx=\"2\" />\r\n <line x1=\"2\" x2=\"22\" y1=\"12\" y2=\"12\" />\r\n </Icon>\r\n);\r\n\r\nexport const ExpandIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"m21 21-6-6m6 6v-4.8m0 4.8h-4.8\" />\r\n <path d=\"M3 16.2V21m0 0h4.8M3 21l6-6\" />\r\n <path d=\"M21 7.8V3m0 0h-4.8M21 3l-6 6\" />\r\n <path d=\"M3 7.8V3m0 0h4.8M3 3l6 6\" />\r\n </Icon>\r\n);\r\n\r\nexport const CloseIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </Icon>\r\n);\r\n\r\nexport const InfoIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 16v-4\" />\r\n <path d=\"M12 8h.01\" />\r\n </Icon>\r\n);\r\n\r\nexport const CopyIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\r\n </Icon>\r\n);\r\n\r\nexport const MenuIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\" />\r\n </Icon>\r\n);\r\n\r\nexport const ChevronRightIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"m9 18 6-6-6-6\" />\r\n </Icon>\r\n);\r\n\r\nexport const ServerIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"20\" height=\"8\" x=\"2\" y=\"2\" rx=\"2\" ry=\"2\" />\r\n <rect width=\"20\" height=\"8\" x=\"2\" y=\"14\" rx=\"2\" ry=\"2\" />\r\n <line x1=\"6\" x2=\"6.01\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"6\" x2=\"6.01\" y1=\"18\" y2=\"18\" />\r\n </Icon>\r\n);\r\n\r\nexport const LayersIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\" />\r\n <polyline points=\"2 17 12 22 22 17\" />\r\n <polyline points=\"2 12 12 17 22 12\" />\r\n </Icon>\r\n);\r\n\r\nexport const CropIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M6 2v14a2 2 0 0 0 2 2h14\" />\r\n <path d=\"M18 22V8a2 2 0 0 0-2-2H2\" />\r\n </Icon>\r\n);\r\n\r\nexport const SpeakerIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <rect width=\"16\" height=\"20\" x=\"4\" y=\"2\" rx=\"2\" />\r\n <circle cx=\"12\" cy=\"14\" r=\"4\" />\r\n <line x1=\"12\" x2=\"12.01\" y1=\"6\" y2=\"6\" />\r\n </Icon>\r\n);\r\n\r\nexport const GaugeIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"m12 14 4-4\" />\r\n <path d=\"M3.34 19a10 10 0 1 1 17.32 0\" />\r\n </Icon>\r\n);\r\n\r\nexport const SlidersIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <line x1=\"4\" x2=\"4\" y1=\"21\" y2=\"14\" />\r\n <line x1=\"4\" x2=\"4\" y1=\"10\" y2=\"3\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"21\" y2=\"12\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"3\" />\r\n <line x1=\"20\" x2=\"20\" y1=\"21\" y2=\"16\" />\r\n <line x1=\"20\" x2=\"20\" y1=\"12\" y2=\"3\" />\r\n <line x1=\"2\" x2=\"6\" y1=\"14\" y2=\"14\" />\r\n <line x1=\"10\" x2=\"14\" y1=\"8\" y2=\"8\" />\r\n <line x1=\"18\" x2=\"22\" y1=\"16\" y2=\"16\" />\r\n </Icon>\r\n);\r\n\r\nexport const MusicIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M9 18V5l12-2v13\" />\r\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\r\n <circle cx=\"18\" cy=\"16\" r=\"3\" />\r\n </Icon>\r\n);\r\n\r\nexport const FlipIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <polyline points=\"16 16 12 20 8 16\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"20\" y2=\"10\" />\r\n <path d=\"M12 4a8 8 0 0 1 8 8\" />\r\n <path d=\"M20 4v8\" />\r\n <path d=\"M4 4v8\" />\r\n <path d=\"M4 12a8 8 0 0 1 8-8\" />\r\n </Icon>\r\n);\r\n\r\nexport const WifiIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <path d=\"M5 12.55a11 11 0 0 1 14.08 0\" />\r\n <path d=\"M1.42 9a16 16 0 0 1 21.16 0\" />\r\n <path d=\"M8.53 16.11a6 6 0 0 1 6.95 0\" />\r\n <line x1=\"12\" x2=\"12.01\" y1=\"20\" y2=\"20\" />\r\n </Icon>\r\n);\r\n\r\nexport const AlertCircleIcon = ({ className }: { className?: string }) => (\r\n <Icon className={className}>\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\" />\r\n <line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\" />\r\n </Icon>\r\n);\r\n\r\n// Custom Composite Icons (Reusing Base Icons + Text)\r\nexport const Replay10Icon = ({ className }: { className?: string }) => (\r\n <div className={`relative flex items-center justify-center ${className}`}>\r\n <Icon className=\"w-full h-full\">\r\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\r\n <path d=\"M3 3v5h5\" />\r\n </Icon>\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 <Icon className=\"w-full h-full\">\r\n <path d=\"M21 12a9 9 0 1 1-9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\r\n <path d=\"M21 3v5h-5\" />\r\n </Icon>\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 const base = import.meta.env?.BASE_URL || '/';\r\n const src = `${base}logo.png`;\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-25 flex flex-col gap-2 pointer-events-none font-sans max-w-[85%] md:max-w-[320px]\">\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-3 py-2 rounded-lg shadow-xl text-xs font-medium flex items-start gap-2.5 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-3.5 h-3.5 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-0.5 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, useLayoutEffect, useState, useEffect } 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 containerRef = useRef<HTMLDivElement>(null);\r\n const contentRef = useRef<HTMLDivElement>(null);\r\n const [height, setHeight] = useState<number | 'auto'>('auto');\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 // Smooth height animation logic\r\n useLayoutEffect(() => {\r\n if (!contentRef.current) return;\r\n\r\n const updateHeight = () => {\r\n if (contentRef.current) {\r\n setHeight(contentRef.current.offsetHeight);\r\n }\r\n };\r\n\r\n const observer = new ResizeObserver(updateHeight);\r\n observer.observe(contentRef.current);\r\n\r\n // Initial measure\r\n updateHeight();\r\n\r\n return () => observer.disconnect();\r\n }, []);\r\n\r\n // Constrain dynamic height by maxHeight prop if provided\r\n const calculatedStyle = {\r\n height: height === 'auto' ? 'auto' : `${height + 14}px`, // + padding\r\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\r\n };\r\n\r\n return (\r\n <div\r\n ref={containerRef}\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-[height,opacity,transform] duration-300 ease-out ${className}`}\r\n style={{ ...calculatedStyle, 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={contentRef}>{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, rightIcon }: 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 {rightIcon}\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-1 w-4 h-4 transition-transform shadow-sm ${checked ? 'translate-x-5' : 'translate-x-0'}`}\r\n style={{\r\n borderRadius: 'var(--radius-full)',\r\n backgroundColor: checked ? 'var(--accent-contrast)' : '#ffffff'\r\n }}\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 { createPortal } from 'react-dom';\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, Slider, Select } 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 ServerIcon, LayersIcon, CropIcon, SpeakerIcon, FlipIcon, GaugeIcon, MusicIcon, WifiIcon, AlertCircleIcon\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// Helper to determine best contrast color (black or white) for a given hex background\r\nfunction getContrastColor(hex: string) {\r\n if (!hex) return '#ffffff';\r\n hex = hex.replace('#', '');\r\n if (hex.length === 3) {\r\n hex = hex.split('').map(char => char + char).join('');\r\n }\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n const yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;\r\n return (yiq >= 128) ? '#000000' : '#ffffff';\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 const [isMobile, setIsMobile] = useState(false);\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 accentContrast = useMemo(() => getContrastColor(state.themeColor), [state.themeColor]);\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 setIsMobile('ontouchstart' in window || navigator.maxTouchPoints > 0);\r\n\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 // Note: Autoplay might be blocked by browsers if not muted, but user requested unmuted default.\r\n player.play().catch(() => {\r\n // If autoplay fails (likely due to audio), we could fallback to mute, but keeping strictly as requested.\r\n console.warn('Autoplay failed (likely needs user interaction)');\r\n });\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 const key = e.key.toLowerCase();\r\n switch (key) {\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 case 'escape':\r\n // Check store directly to avoid stale state in closure\r\n if (player.store.get().isWebFullscreen) {\r\n e.preventDefault();\r\n player.toggleWebFullscreen();\r\n }\r\n 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\r\n // Prevent gestures if menus are open\r\n if (settingsOpen || subtitleMenuOpen) {\r\n setSettingsOpen(false);\r\n setSubtitleMenuOpen(false);\r\n return;\r\n }\r\n\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, settingsOpen, subtitleMenuOpen]);\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 // Prevent gestures if menus are open\r\n if (settingsOpen || subtitleMenuOpen) {\r\n setSettingsOpen(false);\r\n setSubtitleMenuOpen(false);\r\n return;\r\n }\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\r\n // Ensure menus close when interacting with progress bar\r\n if (settingsOpen || subtitleMenuOpen) {\r\n setSettingsOpen(false);\r\n setSubtitleMenuOpen(false);\r\n }\r\n\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. If menus were open, stop here (don't toggle play/seek).\r\n if (settingsOpen || subtitleMenuOpen) {\r\n setSettingsOpen(false);\r\n setSubtitleMenuOpen(false);\r\n return;\r\n }\r\n\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 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 rounded-md border border-white/10\" style={{ backgroundColor: `${state.themeColor}1a`, borderColor: `${state.themeColor}33` }}>\r\n <div className=\"w-2 h-2 rounded-full animate-pulse\" style={{ backgroundColor: state.themeColor }} />\r\n <span className=\"text-[10px] font-bold tracking-wider\" style={{ color: state.themeColor }}>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 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\" onClick={() => player?.toggleWebFullscreen()} className={`strata-control-btn text-zinc-300 hover:text-white hover:bg-white/10 hidden sm:block focus:outline-none ${btnClass} ${state.isWebFullscreen ? 'text-[var(--accent)]' : ''}`} 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\r\n {/* Source - Top Priority */}\r\n {state.sources.length > 1 && (\r\n <>\r\n <MenuItem label=\"Source\" icon={<ServerIcon className=\"w-4 h-4\" />} value={state.sources[state.currentSourceIndex]?.name || `Source ${state.currentSourceIndex + 1}`} onClick={() => setActiveMenu('sources')} hasSubmenu />\r\n <MenuDivider />\r\n </>\r\n )}\r\n\r\n {/* Playback Configuration */}\r\n <MenuItem label=\"Quality\" icon={<LayersIcon className=\"w-4 h-4\" />} value={state.currentQuality === -1 ? 'Auto' : `${state.qualityLevels[state.currentQuality]?.height}p`} onClick={() => setActiveMenu('quality')} hasSubmenu />\r\n <MenuItem label=\"Speed\" icon={<GaugeIcon className=\"w-4 h-4\" />} value={`${state.playbackRate}x`} onClick={() => setActiveMenu('speed')} hasSubmenu />\r\n <MenuItem label=\"Audio\" icon={<MusicIcon className=\"w-4 h-4\" />} value={state.audioTracks[state.currentAudioTrack]?.label || 'Default'} onClick={() => setActiveMenu('audio')} hasSubmenu />\r\n\r\n <MenuDivider />\r\n\r\n {/* Visual Adjustments */}\r\n {useFlip && <MenuItem label=\"Flip\" icon={<FlipIcon className=\"w-4 h-4\" />} value={state.flipState.horizontal ? 'H' : state.flipState.vertical ? 'V' : 'Normal'} onClick={() => setActiveMenu('flip')} hasSubmenu />}\r\n {useAspectRatio && <MenuItem label=\"Aspect Ratio\" icon={<CropIcon className=\"w-4 h-4\" />} value={state.aspectRatio} onClick={() => setActiveMenu('ratio')} hasSubmenu />}\r\n\r\n {/* Audio Tools */}\r\n <MenuItem label=\"Audio Boost\" icon={<SpeakerIcon className=\"w-4 h-4\" />} value={state.audioGain > 1 ? `${state.audioGain}x` : 'Off'} onClick={() => setActiveMenu('boost')} hasSubmenu />\r\n\r\n <MenuDivider />\r\n\r\n {/* Network & Social */}\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\r\n {/* Custom User Settings */}\r\n {config.settings && config.settings.length > 0 && <MenuDivider />}\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\r\n <MenuDivider />\r\n\r\n {/* Appearance - Bottom */}\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' && (\r\n <>\r\n <MenuHeader label=\"Select Source\" onBack={() => setActiveMenu('main')} />\r\n {state.sources.map((src, i) => {\r\n const status = state.sourceStatuses[i];\r\n const statusIcon = status === 'success'\r\n ? <WifiIcon className=\"w-3.5 h-3.5 text-emerald-500\" />\r\n : status === 'error'\r\n ? <AlertCircleIcon className=\"w-3.5 h-3.5 text-red-500\" />\r\n : null;\r\n return (\r\n <MenuItem\r\n key={i}\r\n label={src.name || `Source ${i + 1}`}\r\n value={src.type}\r\n active={state.currentSourceIndex === i}\r\n rightIcon={statusIcon}\r\n onClick={() => player?.switchSource(i)}\r\n />\r\n );\r\n })}\r\n </>\r\n )}\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 const isWebFs = state.isWebFullscreen;\r\n\r\n const playerContent = (\r\n <div\r\n id={config.id}\r\n ref={containerRef}\r\n className={`group bg-black overflow-hidden select-none font-[family-name:var(--font-main)] outline-none text-zinc-100 strata-player-reset ${isWebFs ? 'fixed inset-0 z-[2147483647] w-screen h-screen rounded-none' : 'relative w-full h-full rounded-[var(--radius)]'} ${config.container || ''}`}\r\n // touch-action: manipulation improves tap response\r\n style={{ touchAction: 'manipulation', '--accent': state.themeColor, '--accent-contrast': accentContrast } 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\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 && isMobile && 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 duration-300 active:scale-125 active:opacity-80 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 duration-300 active:scale-90 active:opacity-80 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 duration-300 active:scale-125 active:opacity-80 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 py-4 bg-gradient-to-t from-black/90 via-black/50 to-transparent ${isControlsVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4 pointer-events-none'}`}\r\n onClick={(e) => {\r\n if (settingsOpen || subtitleMenuOpen) {\r\n setSettingsOpen(false);\r\n setSubtitleMenuOpen(false);\r\n }\r\n // Only stop prop if we are not closing menus, or do we want clicks on bar to NEVER toggle play?\r\n // Standard behavior: Clicking empty space on control bar does nothing (stops prop).\r\n // But we added menu closing logic above.\r\n if (e.target === e.currentTarget) {\r\n setIsVolumeLocked(false);\r\n }\r\n e.stopPropagation();\r\n }}\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 if (isWebFs && typeof document !== 'undefined') {\r\n return createPortal(playerContent, document.body);\r\n }\r\n\r\n return playerContent;\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","formatTime","seconds","h","m","s","fetchVttWithRetry","url","retries","timeout","i","controller","id","res","r","parseVTT","notify","lines","cues","start","end","baseUrl","parseTime","t","parts","line","times","urlPart","hash","x","y","w","coords","injectLibraryResources","pre1","pre2","link","script","DEFAULT_SUBTITLE_SETTINGS","STORAGE_KEY","DEFAULT_STATE","getResolvedState","config","saved","raw","mergedSubtitleSettings","StrataCore","videoElement","isFs","lockType","state","settings","val","status","idx","prev","ms","details","total","title","_b","artwork","duration","position","playbackRate","message","isFatal","customMessage","error","delay","time","onCanPlay","finalMsg","buffered","tracks","track","index","effectiveTimeout","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","isWebFs","newState","canvas","ctx","direction","current","scaleX","scaleY","ratio","initializeCastApi","isAvailable","castSession","mediaInfo","request","c","newSettings","offset","currentOffset","delta","cue","notifId","response","contentLength","loaded","chunks","done","percent","a","n","newNotification","p","useTransition","isActive","isMounted","setIsMounted","useState","isVisible","setIsVisible","useEffect","timer","Icon","className","children","fill","strokeWidth","viewBox","jsx","PlayIcon","PauseIcon","jsxs","VolumeHighIcon","VolumeLowIcon","VolumeMuteIcon","MaximizeIcon","MinimizeIcon","SettingsIcon","CheckIcon","PipIcon","SubtitleIcon","DownloadIcon","UploadIcon","ArrowLeftIcon","LoaderIcon","CastIcon","UsersIcon","ClockIcon","MinusIcon","PlusIcon","CustomizeIcon","TypeIcon","PaletteIcon","EyeIcon","MoveVerticalIcon","ResetIcon","BoldIcon","CaseUpperIcon","BlurIcon","CameraIcon","LockIcon","UnlockIcon","WebFullscreenIcon","FastForwardIcon","CloseIcon","InfoIcon","ServerIcon","LayersIcon","CropIcon","SpeakerIcon","GaugeIcon","MusicIcon","FlipIcon","WifiIcon","AlertCircleIcon","Replay10Icon","Forward10Icon","NotificationContainer","notifications","SubtitleOverlay","getTextShadow","text","Menu","onClose","align","maxHeight","containerRef","useRef","contentRef","height","setHeight","positionClasses","useLayoutEffect","updateHeight","observer","calculatedStyle","RenderContent","MenuItem","active","onClick","hasSubmenu","icon","rightIcon","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","ContextMenu","items","containerWidth","containerHeight","menuRef","layout","setLayout","rect","width","newLeft","newTop","availableHeight","handleClickOutside","item","React","VideoInfo","player","stats","setStats","q","k","getContrastColor","hex","char","g","b","THEME_COLORS","THEMES","HtmlOrNode","style","StrataPlayer","props","poster","autoPlay","thumbnails","textTracks","plugins","onGetInstance","useScreenshot","usePip","useSetting","useFullscreen","useFullscreenWeb","useLock","useFastForward","useFlip","useAspectRatio","useHotKey","isBackdrop","useGestureSeek","useCenterControls","fetchTimeout","setPlayer","hasPlayed","setHasPlayed","playerHeight","setPlayerHeight","playerWidth","setPlayerWidth","isMobile","setIsMobile","useMemo","useSyncExternalStore","useCallback","accentContrast","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","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","VolIcon","menuMaxHeight","getIconClass","getButtonClass","iconClass","btnClass","center","isControlsVisible","isVolumeVisible","backdropClass","controls","existing","renderControl","_c","_d","statusIcon","rate","lvl","_e","theme","contextMenuItems","close","playerContent","layer","range","createPortal","mountStrataPlayer","root","createRoot","newProps"],"mappings":"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"}
|