@livepeer-frameworks/player-wc 0.2.11 → 0.3.1

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.
Files changed (42) hide show
  1. package/dist/esm/components/controls/fw-fullscreen-button.js +1 -1
  2. package/dist/esm/components/controls/fw-live-badge.js +1 -1
  3. package/dist/esm/components/controls/fw-play-button.js +1 -1
  4. package/dist/esm/components/controls/fw-skip-button.js +1 -1
  5. package/dist/esm/components/controls/fw-time-display.js +1 -1
  6. package/dist/esm/components/controls/fw-volume-control.js +1 -1
  7. package/dist/esm/components/fw-context-menu.js +1 -1
  8. package/dist/esm/components/fw-dev-mode-panel.js +1 -1
  9. package/dist/esm/components/fw-dvd-logo.js +1 -1
  10. package/dist/esm/components/fw-error-overlay.js +1 -1
  11. package/dist/esm/components/fw-idle-screen.js +1 -1
  12. package/dist/esm/components/fw-loading-screen.js +1 -1
  13. package/dist/esm/components/fw-loading-spinner.js +1 -1
  14. package/dist/esm/components/fw-player-controls.js +3 -1
  15. package/dist/esm/components/fw-player-controls.js.map +1 -1
  16. package/dist/esm/components/fw-player.js +1 -1
  17. package/dist/esm/components/fw-seek-bar.js +82 -2
  18. package/dist/esm/components/fw-seek-bar.js.map +1 -1
  19. package/dist/esm/components/fw-settings-menu.js +1 -1
  20. package/dist/esm/components/fw-skip-indicator.js +1 -1
  21. package/dist/esm/components/fw-speed-indicator.js +1 -1
  22. package/dist/esm/components/fw-stats-panel.js +1 -1
  23. package/dist/esm/components/fw-stream-state-overlay.js +1 -1
  24. package/dist/esm/components/fw-subtitle-renderer.js +1 -1
  25. package/dist/esm/components/fw-thumbnail-overlay.js +1 -1
  26. package/dist/esm/components/fw-title-overlay.js +1 -1
  27. package/dist/esm/components/fw-toast.js +1 -1
  28. package/dist/esm/components/fw-volume-control.js +1 -1
  29. package/dist/esm/controllers/player-controller-host.js +4 -0
  30. package/dist/esm/controllers/player-controller-host.js.map +1 -1
  31. package/dist/esm/node_modules/.pnpm/{@rollup_plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3 → @rollup_plugin-typescript@12.3.0_rollup@4.60.1_tslib@2.8.1_typescript@6.0.2}/node_modules/tslib/tslib.es6.js.map +1 -1
  32. package/dist/esm/styles/shared-styles.js +17 -1
  33. package/dist/esm/styles/shared-styles.js.map +1 -1
  34. package/dist/fw-player.iife.js +104 -82
  35. package/dist/types/components/fw-seek-bar.d.ts +9 -0
  36. package/dist/types/controllers/player-controller-host.d.ts +2 -1
  37. package/package.json +8 -8
  38. package/src/components/fw-player-controls.ts +2 -0
  39. package/src/components/fw-seek-bar.ts +84 -1
  40. package/src/controllers/player-controller-host.ts +9 -0
  41. package/src/styles/shared-styles.ts +17 -1
  42. /package/dist/esm/node_modules/.pnpm/{@rollup_plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3 → @rollup_plugin-typescript@12.3.0_rollup@4.60.1_tslib@2.8.1_typescript@6.0.2}/node_modules/tslib/tslib.es6.js +0 -0
@@ -1,4 +1,4 @@
1
- import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js';
1
+ import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.60.1_tslib@2.8.1_typescript@6.0.2/node_modules/tslib/tslib.es6.js';
2
2
  import { css, LitElement, html } from 'lit';
3
3
  import { property, customElement } from 'lit/decorators.js';
4
4
  import { sharedStyles } from '../styles/shared-styles.js';
@@ -1,4 +1,4 @@
1
- import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js';
1
+ import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.60.1_tslib@2.8.1_typescript@6.0.2/node_modules/tslib/tslib.es6.js';
2
2
  import { css, LitElement, html, nothing } from 'lit';
3
3
  import { property, customElement } from 'lit/decorators.js';
4
4
  import { createTranslator } from '@livepeer-frameworks/player-core';
@@ -1,4 +1,4 @@
1
- import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js';
1
+ import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.60.1_tslib@2.8.1_typescript@6.0.2/node_modules/tslib/tslib.es6.js';
2
2
  import { css, LitElement, nothing, html } from 'lit';
3
3
  import { property, state, customElement } from 'lit/decorators.js';
4
4
  import { styleMap } from 'lit/directives/style-map.js';
@@ -1,4 +1,4 @@
1
- import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js';
1
+ import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.60.1_tslib@2.8.1_typescript@6.0.2/node_modules/tslib/tslib.es6.js';
2
2
  import { css, LitElement, nothing, html } from 'lit';
3
3
  import { property, customElement } from 'lit/decorators.js';
4
4
  import { classMap } from 'lit/directives/class-map.js';
@@ -1,4 +1,4 @@
1
- import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js';
1
+ import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.60.1_tslib@2.8.1_typescript@6.0.2/node_modules/tslib/tslib.es6.js';
2
2
  import { css, LitElement, nothing, html } from 'lit';
3
3
  import { property, customElement } from 'lit/decorators.js';
4
4
  import { sharedStyles } from '../styles/shared-styles.js';
@@ -1,4 +1,4 @@
1
- import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js';
1
+ import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.60.1_tslib@2.8.1_typescript@6.0.2/node_modules/tslib/tslib.es6.js';
2
2
  import { css, LitElement, nothing, html } from 'lit';
3
3
  import { property, customElement } from 'lit/decorators.js';
4
4
  import { closeIcon } from '../icons/index.js';
@@ -1,4 +1,4 @@
1
- import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js';
1
+ import { __decorate } from '../node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.60.1_tslib@2.8.1_typescript@6.0.2/node_modules/tslib/tslib.es6.js';
2
2
  import { css, LitElement, html } from 'lit';
3
3
  import { property, state, customElement } from 'lit/decorators.js';
4
4
  import { classMap } from 'lit/directives/class-map.js';
@@ -34,6 +34,7 @@ const initialState = {
34
34
  textTracks: [],
35
35
  streamInfo: null,
36
36
  toast: null,
37
+ thumbnailCues: [],
37
38
  };
38
39
  class PlayerControllerHost {
39
40
  constructor(host) {
@@ -255,6 +256,9 @@ class PlayerControllerHost {
255
256
  message: data.message,
256
257
  });
257
258
  }));
259
+ u.push(controller.on("thumbnailCuesChange", ({ cues }) => {
260
+ this.update({ thumbnailCues: cues });
261
+ }));
258
262
  }
259
263
  // ---- Event Dispatching ----
260
264
  dispatchEvent(name, detail) {
@@ -1 +1 @@
1
- {"version":3,"file":"player-controller-host.js","sources":["../../../../src/controllers/player-controller-host.ts"],"sourcesContent":["/**\n * PlayerControllerHost — Lit ReactiveController wrapping the headless PlayerController.\n * Direct port of usePlayerController.ts from player-react.\n */\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport {\n PlayerController,\n createTranslator,\n type PlayerControllerConfig,\n type PlayerState,\n type StreamState,\n type StreamInfo,\n type PlaybackQuality,\n type ContentEndpoints,\n type ContentMetadata,\n type ClassifiedError,\n type TranslateFn,\n type I18nConfig,\n} from \"@livepeer-frameworks/player-core\";\n\nexport interface PlayerControllerHostState {\n state: PlayerState;\n streamState: StreamState | null;\n endpoints: ContentEndpoints | null;\n metadata: ContentMetadata | null;\n videoElement: HTMLVideoElement | null;\n currentTime: number;\n duration: number;\n isPlaying: boolean;\n isPaused: boolean;\n isBuffering: boolean;\n isMuted: boolean;\n volume: number;\n error: string | null;\n errorDetails: ClassifiedError[\"details\"] | null;\n isPassiveError: boolean;\n hasPlaybackStarted: boolean;\n isHoldingSpeed: boolean;\n holdSpeed: number;\n isHovering: boolean;\n shouldShowControls: boolean;\n isLoopEnabled: boolean;\n isFullscreen: boolean;\n isPiPActive: boolean;\n isEffectivelyLive: boolean;\n shouldShowIdleScreen: boolean;\n currentPlayerInfo: { name: string; shortname: string } | null;\n currentSourceInfo: { url: string; type: string } | null;\n playbackQuality: PlaybackQuality | null;\n subtitlesEnabled: boolean;\n qualities: Array<{\n id: string;\n label: string;\n bitrate?: number;\n width?: number;\n height?: number;\n isAuto?: boolean;\n active?: boolean;\n }>;\n textTracks: Array<{ id: string; label: string; lang?: string; active: boolean }>;\n streamInfo: StreamInfo | null;\n toast: { message: string; timestamp: number } | null;\n}\n\nconst initialState: PlayerControllerHostState = {\n state: \"booting\",\n streamState: null,\n endpoints: null,\n metadata: null,\n videoElement: null,\n currentTime: 0,\n duration: NaN,\n isPlaying: false,\n isPaused: true,\n isBuffering: false,\n isMuted: false,\n volume: 1,\n error: null,\n errorDetails: null,\n isPassiveError: false,\n hasPlaybackStarted: false,\n isHoldingSpeed: false,\n holdSpeed: 2,\n isHovering: false,\n shouldShowControls: false,\n isLoopEnabled: false,\n isFullscreen: false,\n isPiPActive: false,\n isEffectivelyLive: false,\n shouldShowIdleScreen: true,\n currentPlayerInfo: null,\n currentSourceInfo: null,\n playbackQuality: null,\n subtitlesEnabled: false,\n qualities: [],\n textTracks: [],\n streamInfo: null,\n toast: null,\n};\n\ntype HostElement = ReactiveControllerHost & HTMLElement;\n\nexport class PlayerControllerHost implements ReactiveController {\n host: HostElement;\n private controller: PlayerController | null = null;\n private unsubs: Array<() => void> = [];\n private currentConfig: PlayerControllerConfig | null = null;\n\n s: PlayerControllerHostState = { ...initialState };\n\n /** Translation function, updated when locale changes. */\n t: TranslateFn = createTranslator({ locale: \"en\" });\n\n constructor(host: HostElement) {\n this.host = host;\n host.addController(this);\n }\n\n /** Rebuild the translator when locale or custom translations change. */\n updateTranslator(config: I18nConfig) {\n this.t = createTranslator(config);\n this.host.requestUpdate();\n }\n\n // ---- Configuration & Lifecycle ----\n\n configure(config: PlayerControllerConfig) {\n this.currentConfig = config;\n }\n\n async attach(container: HTMLDivElement) {\n if (!this.currentConfig) return;\n this.teardown();\n\n const controller = new PlayerController({\n contentId: this.currentConfig.contentId,\n contentType: this.currentConfig.contentType,\n endpoints: this.currentConfig.endpoints,\n gatewayUrl: this.currentConfig.gatewayUrl,\n mistUrl: this.currentConfig.mistUrl,\n authToken: this.currentConfig.authToken,\n autoplay: this.currentConfig.autoplay,\n muted: this.currentConfig.muted,\n controls: this.currentConfig.controls,\n poster: this.currentConfig.poster,\n debug: this.currentConfig.debug,\n });\n\n this.controller = controller;\n this.subscribeToEvents(controller);\n\n this.update({ isLoopEnabled: controller.isLoopEnabled() });\n\n try {\n await controller.attach(container);\n } catch (err) {\n console.warn(\"[PlayerControllerHost] Attach failed:\", err);\n }\n }\n\n hostConnected() {\n // Controller attachment happens in firstUpdated of the host element\n }\n\n hostDisconnected() {\n this.teardown();\n this.s = { ...initialState };\n }\n\n private teardown() {\n this.unsubs.forEach((fn) => fn());\n this.unsubs = [];\n this.controller?.destroy();\n this.controller = null;\n }\n\n // ---- State Updates ----\n\n private update(partial: Partial<PlayerControllerHostState>) {\n Object.assign(this.s, partial);\n this.host.requestUpdate();\n }\n\n private syncState() {\n if (!this.controller) return;\n const c = this.controller;\n this.update({\n isPlaying: c.isPlaying(),\n isPaused: c.isPaused(),\n isBuffering: c.isBuffering(),\n isMuted: c.isMuted(),\n volume: c.getVolume(),\n hasPlaybackStarted: c.hasPlaybackStarted(),\n shouldShowControls: c.shouldShowControls(),\n shouldShowIdleScreen: c.shouldShowIdleScreen(),\n playbackQuality: c.getPlaybackQuality(),\n isLoopEnabled: c.isLoopEnabled(),\n subtitlesEnabled: c.isSubtitlesEnabled(),\n qualities: c.getQualities(),\n textTracks: c.getTextTracks(),\n streamInfo: c.getStreamInfo(),\n });\n }\n\n // ---- Event Subscriptions (mirrors usePlayerController exactly) ----\n\n private subscribeToEvents(controller: PlayerController) {\n const u = this.unsubs;\n\n u.push(\n controller.on(\"stateChange\", ({ state }) => {\n this.update({\n state,\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n });\n this.dispatchEvent(\"fw-state-change\", { state });\n })\n );\n\n u.push(\n controller.on(\"streamStateChange\", ({ state: streamState }) => {\n this.update({\n streamState,\n metadata: controller.getMetadata(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n });\n this.dispatchEvent(\"fw-stream-state\", { state: streamState });\n })\n );\n\n u.push(\n controller.on(\"timeUpdate\", ({ currentTime, duration }) => {\n const next: Partial<PlayerControllerHostState> = {\n currentTime,\n duration,\n shouldShowControls: controller.shouldShowControls(),\n };\n if (this.s.qualities.length === 0) {\n const qualities = controller.getQualities();\n if (qualities.length > 0) {\n next.qualities = qualities;\n }\n }\n this.update(next);\n this.dispatchEvent(\"fw-time-update\", { currentTime, duration });\n })\n );\n\n u.push(\n controller.on(\"error\", ({ error }) => {\n this.update({\n error,\n isPassiveError: controller.isPassiveError(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n });\n this.dispatchEvent(\"fw-error\", { error });\n })\n );\n\n u.push(\n controller.on(\"errorCleared\", () => {\n this.update({ error: null, isPassiveError: false });\n })\n );\n\n u.push(\n controller.on(\"ready\", ({ videoElement }) => {\n this.update({\n videoElement,\n endpoints: controller.getEndpoints(),\n metadata: controller.getMetadata(),\n streamInfo: controller.getStreamInfo(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: controller.getCurrentSourceInfo(),\n qualities: controller.getQualities(),\n textTracks: controller.getTextTracks(),\n });\n this.dispatchEvent(\"fw-ready\", { videoElement });\n this.syncState();\n\n const handleVideoEvent = () => {\n if (this.controller?.shouldSuppressVideoEvents?.()) return;\n this.syncState();\n };\n videoElement.addEventListener(\"play\", handleVideoEvent);\n videoElement.addEventListener(\"pause\", handleVideoEvent);\n videoElement.addEventListener(\"waiting\", handleVideoEvent);\n videoElement.addEventListener(\"playing\", handleVideoEvent);\n u.push(() => {\n videoElement.removeEventListener(\"play\", handleVideoEvent);\n videoElement.removeEventListener(\"pause\", handleVideoEvent);\n videoElement.removeEventListener(\"waiting\", handleVideoEvent);\n videoElement.removeEventListener(\"playing\", handleVideoEvent);\n });\n })\n );\n\n u.push(\n controller.on(\"playerSelected\", ({ player: _player, source }) => {\n this.update({\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: { url: source.url, type: source.type },\n qualities: controller.getQualities(),\n textTracks: controller.getTextTracks(),\n });\n this.syncState();\n })\n );\n\n u.push(\n controller.on(\"volumeChange\", ({ volume, muted }) => {\n this.update({ volume, isMuted: muted });\n this.dispatchEvent(\"fw-volume-change\", { volume, muted });\n })\n );\n\n u.push(\n controller.on(\"loopChange\", ({ isLoopEnabled }) => {\n this.update({ isLoopEnabled });\n })\n );\n\n u.push(\n controller.on(\"fullscreenChange\", ({ isFullscreen }) => {\n this.update({ isFullscreen });\n this.dispatchEvent(\"fw-fullscreen-change\", { isFullscreen });\n })\n );\n\n u.push(\n controller.on(\"pipChange\", ({ isPiP }) => {\n this.update({ isPiPActive: isPiP });\n this.dispatchEvent(\"fw-pip-change\", { isPiP });\n })\n );\n\n u.push(\n controller.on(\"holdSpeedStart\", ({ speed }) => {\n this.update({ isHoldingSpeed: true, holdSpeed: speed });\n })\n );\n\n u.push(\n controller.on(\"holdSpeedEnd\", () => {\n this.update({ isHoldingSpeed: false });\n })\n );\n\n u.push(\n controller.on(\"hoverStart\", () => {\n this.update({ isHovering: true, shouldShowControls: true });\n })\n );\n\n u.push(\n controller.on(\"hoverEnd\", () => {\n this.update({\n isHovering: false,\n shouldShowControls: controller.shouldShowControls(),\n });\n })\n );\n\n u.push(\n controller.on(\"captionsChange\", ({ enabled }) => {\n this.update({ subtitlesEnabled: enabled, textTracks: controller.getTextTracks() });\n })\n );\n\n u.push(\n controller.on(\"protocolSwapped\", (data) => {\n const message = `Switched to ${data.toProtocol}`;\n this.update({ toast: { message, timestamp: Date.now() } });\n this.dispatchEvent(\"fw-protocol-swapped\", data);\n })\n );\n\n u.push(\n controller.on(\"playbackFailed\", (data) => {\n this.update({\n error: data.message,\n errorDetails: data.details ?? null,\n isPassiveError: false,\n });\n this.dispatchEvent(\"fw-playback-failed\", {\n code: data.code,\n message: data.message,\n });\n })\n );\n }\n\n // ---- Event Dispatching ----\n\n private dispatchEvent(name: string, detail: unknown) {\n this.host.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n }\n\n // ---- Action Methods ----\n\n async play() {\n await this.controller?.play();\n }\n pause() {\n this.controller?.pause();\n }\n togglePlay() {\n this.controller?.togglePlay();\n }\n seek(time: number) {\n this.controller?.seek(time);\n }\n seekBy(delta: number) {\n this.controller?.seekBy(delta);\n }\n jumpToLive() {\n this.controller?.jumpToLive();\n }\n setVolume(volume: number) {\n this.controller?.setVolume(volume);\n }\n toggleMute() {\n this.controller?.toggleMute();\n }\n toggleLoop() {\n this.controller?.toggleLoop();\n }\n async toggleFullscreen() {\n await this.controller?.toggleFullscreen();\n }\n async togglePiP() {\n await this.controller?.togglePictureInPicture();\n }\n toggleSubtitles() {\n this.controller?.toggleSubtitles();\n }\n\n clearError() {\n this.controller?.clearError();\n this.update({ error: null, errorDetails: null, isPassiveError: false });\n }\n\n dismissToast() {\n this.update({ toast: null });\n }\n\n async retry() {\n await this.controller?.retry();\n }\n async tryNextSource() {\n await this.controller?.retryWithFallback();\n }\n canAttemptFallback(): boolean {\n return this.controller?.canAttemptFallback() ?? false;\n }\n async reload() {\n await this.controller?.reload();\n }\n\n getQualities() {\n return this.controller?.getQualities() ?? [];\n }\n selectQuality(id: string) {\n this.controller?.selectQuality(id);\n }\n getTextTracks() {\n return this.controller?.getTextTracks() ?? [];\n }\n selectTextTrack(id: string | null) {\n this.controller?.selectTextTrack(id);\n }\n setPlaybackRate(rate: number) {\n this.controller?.setPlaybackRate(rate);\n }\n getSeekableStart() {\n return this.controller?.getSeekableStart() ?? 0;\n }\n getLiveEdge() {\n return this.controller?.getLiveEdge() ?? 0;\n }\n canSeekStream() {\n return this.controller?.canSeekStream() ?? false;\n }\n getBufferedRanges() {\n return this.controller?.getBufferedRanges() ?? null;\n }\n async getStats() {\n return this.controller?.getStats();\n }\n\n handleMouseEnter() {\n this.controller?.handleMouseEnter();\n this.update({ isHovering: true, shouldShowControls: true });\n }\n handleMouseLeave() {\n this.controller?.handleMouseLeave();\n this.update({\n isHovering: false,\n shouldShowControls: this.controller?.shouldShowControls() ?? false,\n });\n }\n handleMouseMove() {\n this.controller?.handleMouseMove();\n if (this.controller) {\n this.update({ shouldShowControls: this.controller.shouldShowControls() });\n }\n }\n handleTouchStart() {\n this.controller?.handleTouchStart();\n this.update({ shouldShowControls: true });\n }\n\n async setDevModeOptions(options: {\n forcePlayer?: string;\n forceType?: string;\n forceSource?: number;\n playbackMode?: \"auto\" | \"low-latency\" | \"quality\" | \"vod\";\n }) {\n await this.controller?.setDevModeOptions(options);\n }\n\n getController(): PlayerController | null {\n return this.controller;\n }\n}\n"],"names":[],"mappings":";;AAgEA,MAAM,YAAY,GAA8B;AAC9C,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,WAAW,EAAE,CAAC;AACd,IAAA,QAAQ,EAAE,GAAG;AACb,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,kBAAkB,EAAE,KAAK;AACzB,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,kBAAkB,EAAE,KAAK;AACzB,IAAA,aAAa,EAAE,KAAK;AACpB,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,iBAAiB,EAAE,KAAK;AACxB,IAAA,oBAAoB,EAAE,IAAI;AAC1B,IAAA,iBAAiB,EAAE,IAAI;AACvB,IAAA,iBAAiB,EAAE,IAAI;AACvB,IAAA,eAAe,EAAE,IAAI;AACrB,IAAA,gBAAgB,EAAE,KAAK;AACvB,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,KAAK,EAAE,IAAI;CACZ;MAIY,oBAAoB,CAAA;AAW/B,IAAA,WAAA,CAAY,IAAiB,EAAA;QATrB,IAAA,CAAA,UAAU,GAA4B,IAAI;QAC1C,IAAA,CAAA,MAAM,GAAsB,EAAE;QAC9B,IAAA,CAAA,aAAa,GAAkC,IAAI;AAE3D,QAAA,IAAA,CAAA,CAAC,GAA8B,EAAE,GAAG,YAAY,EAAE;;QAGlD,IAAA,CAAA,CAAC,GAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAGjD,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IAC1B;;AAGA,IAAA,gBAAgB,CAAC,MAAkB,EAAA;AACjC,QAAA,IAAI,CAAC,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;IAC3B;;AAIA,IAAA,SAAS,CAAC,MAA8B,EAAA;AACtC,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM;IAC7B;IAEA,MAAM,MAAM,CAAC,SAAyB,EAAA;QACpC,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;QACzB,IAAI,CAAC,QAAQ,EAAE;AAEf,QAAA,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC;AACtC,YAAA,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS;AACvC,YAAA,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW;AAC3C,YAAA,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS;AACvC,YAAA,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU;AACzC,YAAA,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO;AACnC,YAAA,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS;AACvC,YAAA,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ;AACrC,YAAA,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK;AAC/B,YAAA,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ;AACrC,YAAA,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM;AACjC,YAAA,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK;AAChC,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,QAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;AAElC,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC;AAE1D,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC;QACpC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,GAAG,CAAC;QAC5D;IACF;IAEA,aAAa,GAAA;;IAEb;IAEA,gBAAgB,GAAA;QACd,IAAI,CAAC,QAAQ,EAAE;AACf,QAAA,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,YAAY,EAAE;IAC9B;IAEQ,QAAQ,GAAA;AACd,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE;AAChB,QAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE;AAC1B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;IACxB;;AAIQ,IAAA,MAAM,CAAC,OAA2C,EAAA;QACxD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;IAC3B;IAEQ,SAAS,GAAA;QACf,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AACtB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU;QACzB,IAAI,CAAC,MAAM,CAAC;AACV,YAAA,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE;AACxB,YAAA,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;AACtB,YAAA,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE;AAC5B,YAAA,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;AACpB,YAAA,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE;AACrB,YAAA,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,EAAE;AAC1C,YAAA,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,EAAE;AAC1C,YAAA,oBAAoB,EAAE,CAAC,CAAC,oBAAoB,EAAE;AAC9C,YAAA,eAAe,EAAE,CAAC,CAAC,kBAAkB,EAAE;AACvC,YAAA,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE;AAChC,YAAA,gBAAgB,EAAE,CAAC,CAAC,kBAAkB,EAAE;AACxC,YAAA,SAAS,EAAE,CAAC,CAAC,YAAY,EAAE;AAC3B,YAAA,UAAU,EAAE,CAAC,CAAC,aAAa,EAAE;AAC7B,YAAA,UAAU,EAAE,CAAC,CAAC,aAAa,EAAE;AAC9B,SAAA,CAAC;IACJ;;AAIQ,IAAA,iBAAiB,CAAC,UAA4B,EAAA;AACpD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM;AAErB,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,KAAI;YACzC,IAAI,CAAC,MAAM,CAAC;gBACV,KAAK;AACL,gBAAA,oBAAoB,EAAE,UAAU,CAAC,oBAAoB,EAAE;AACxD,aAAA,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC;QAClD,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAI;YAC5D,IAAI,CAAC,MAAM,CAAC;gBACV,WAAW;AACX,gBAAA,QAAQ,EAAE,UAAU,CAAC,WAAW,EAAE;AAClC,gBAAA,iBAAiB,EAAE,UAAU,CAAC,iBAAiB,EAAE;AACjD,gBAAA,oBAAoB,EAAE,UAAU,CAAC,oBAAoB,EAAE;AACxD,aAAA,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAC/D,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAI;AACxD,YAAA,MAAM,IAAI,GAAuC;gBAC/C,WAAW;gBACX,QAAQ;AACR,gBAAA,kBAAkB,EAAE,UAAU,CAAC,kBAAkB,EAAE;aACpD;YACD,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AACjC,gBAAA,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE;AAC3C,gBAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,oBAAA,IAAI,CAAC,SAAS,GAAG,SAAS;gBAC5B;YACF;AACA,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;QACjE,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAI;YACnC,IAAI,CAAC,MAAM,CAAC;gBACV,KAAK;AACL,gBAAA,cAAc,EAAE,UAAU,CAAC,cAAc,EAAE;AAC3C,gBAAA,oBAAoB,EAAE,UAAU,CAAC,oBAAoB,EAAE;AACxD,aAAA,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC;QAC3C,CAAC,CAAC,CACH;QAED,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,MAAK;AACjC,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QACrD,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,KAAI;YAC1C,IAAI,CAAC,MAAM,CAAC;gBACV,YAAY;AACZ,gBAAA,SAAS,EAAE,UAAU,CAAC,YAAY,EAAE;AACpC,gBAAA,QAAQ,EAAE,UAAU,CAAC,WAAW,EAAE;AAClC,gBAAA,UAAU,EAAE,UAAU,CAAC,aAAa,EAAE;AACtC,gBAAA,iBAAiB,EAAE,UAAU,CAAC,iBAAiB,EAAE;AACjD,gBAAA,oBAAoB,EAAE,UAAU,CAAC,oBAAoB,EAAE;AACvD,gBAAA,iBAAiB,EAAE,UAAU,CAAC,oBAAoB,EAAE;AACpD,gBAAA,iBAAiB,EAAE,UAAU,CAAC,oBAAoB,EAAE;AACpD,gBAAA,SAAS,EAAE,UAAU,CAAC,YAAY,EAAE;AACpC,gBAAA,UAAU,EAAE,UAAU,CAAC,aAAa,EAAE;AACvC,aAAA,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,CAAC;YAChD,IAAI,CAAC,SAAS,EAAE;YAEhB,MAAM,gBAAgB,GAAG,MAAK;AAC5B,gBAAA,IAAI,IAAI,CAAC,UAAU,EAAE,yBAAyB,IAAI;oBAAE;gBACpD,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,CAAC;AACD,YAAA,YAAY,CAAC,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,CAAC;AACvD,YAAA,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC;AACxD,YAAA,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,CAAC;AAC1D,YAAA,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,CAAC;AAC1D,YAAA,CAAC,CAAC,IAAI,CAAC,MAAK;AACV,gBAAA,YAAY,CAAC,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAC1D,gBAAA,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,CAAC;AAC3D,gBAAA,YAAY,CAAC,mBAAmB,CAAC,SAAS,EAAE,gBAAgB,CAAC;AAC7D,gBAAA,YAAY,CAAC,mBAAmB,CAAC,SAAS,EAAE,gBAAgB,CAAC;AAC/D,YAAA,CAAC,CAAC;QACJ,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAI;YAC9D,IAAI,CAAC,MAAM,CAAC;AACV,gBAAA,iBAAiB,EAAE,UAAU,CAAC,oBAAoB,EAAE;AACpD,gBAAA,iBAAiB,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;AACzD,gBAAA,SAAS,EAAE,UAAU,CAAC,YAAY,EAAE;AACpC,gBAAA,UAAU,EAAE,UAAU,CAAC,aAAa,EAAE;AACvC,aAAA,CAAC;YACF,IAAI,CAAC,SAAS,EAAE;QAClB,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAI;YAClD,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3D,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,KAAI;AAChD,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;QAChC,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,EAAE,YAAY,EAAE,KAAI;AACrD,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,sBAAsB,EAAE,EAAE,YAAY,EAAE,CAAC;QAC9D,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,KAAI;YACvC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC;QAChD,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,KAAK,EAAE,KAAI;AAC5C,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACzD,CAAC,CAAC,CACH;QAED,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,MAAK;YACjC,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QACxC,CAAC,CAAC,CACH;QAED,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAK;AAC/B,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;QAC7D,CAAC,CAAC,CACH;QAED,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAK;YAC7B,IAAI,CAAC,MAAM,CAAC;AACV,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,kBAAkB,EAAE,UAAU,CAAC,kBAAkB,EAAE;AACpD,aAAA,CAAC;QACJ,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,OAAO,EAAE,KAAI;AAC9C,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC;QACpF,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,IAAI,KAAI;AACxC,YAAA,MAAM,OAAO,GAAG,CAAA,YAAA,EAAe,IAAI,CAAC,UAAU,EAAE;AAChD,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;AAC1D,YAAA,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,IAAI,CAAC;QACjD,CAAC,CAAC,CACH;AAED,QAAA,CAAC,CAAC,IAAI,CACJ,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,IAAI,KAAI;YACvC,IAAI,CAAC,MAAM,CAAC;gBACV,KAAK,EAAE,IAAI,CAAC,OAAO;AACnB,gBAAA,YAAY,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;AAClC,gBAAA,cAAc,EAAE,KAAK;AACtB,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE;gBACvC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;AACtB,aAAA,CAAC;QACJ,CAAC,CAAC,CACH;IACH;;IAIQ,aAAa,CAAC,IAAY,EAAE,MAAe,EAAA;QACjD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3F;;AAIA,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE;IAC/B;IACA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;IAC1B;IACA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE;IAC/B;AACA,IAAA,IAAI,CAAC,IAAY,EAAA;AACf,QAAA,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC;IAC7B;AACA,IAAA,MAAM,CAAC,KAAa,EAAA;AAClB,QAAA,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC;IAChC;IACA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE;IAC/B;AACA,IAAA,SAAS,CAAC,MAAc,EAAA;AACtB,QAAA,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC;IACpC;IACA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE;IAC/B;IACA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE;IAC/B;AACA,IAAA,MAAM,gBAAgB,GAAA;AACpB,QAAA,MAAM,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE;IAC3C;AACA,IAAA,MAAM,SAAS,GAAA;AACb,QAAA,MAAM,IAAI,CAAC,UAAU,EAAE,sBAAsB,EAAE;IACjD;IACA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE;IACpC;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACzE;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B;AAEA,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;IAChC;AACA,IAAA,MAAM,aAAa,GAAA;AACjB,QAAA,MAAM,IAAI,CAAC,UAAU,EAAE,iBAAiB,EAAE;IAC5C;IACA,kBAAkB,GAAA;QAChB,OAAO,IAAI,CAAC,UAAU,EAAE,kBAAkB,EAAE,IAAI,KAAK;IACvD;AACA,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,MAAM,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE;IACjC;IAEA,YAAY,GAAA;QACV,OAAO,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE;IAC9C;AACA,IAAA,aAAa,CAAC,EAAU,EAAA;AACtB,QAAA,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,CAAC;IACpC;IACA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE;IAC/C;AACA,IAAA,eAAe,CAAC,EAAiB,EAAA;AAC/B,QAAA,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,CAAC;IACtC;AACA,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC;IACxC;IACA,gBAAgB,GAAA;QACd,OAAO,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,CAAC;IACjD;IACA,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,CAAC;IAC5C;IACA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,KAAK;IAClD;IACA,iBAAiB,GAAA;QACf,OAAO,IAAI,CAAC,UAAU,EAAE,iBAAiB,EAAE,IAAI,IAAI;IACrD;AACA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE;IACpC;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE;AACnC,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC7D;IACA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE;QACnC,IAAI,CAAC,MAAM,CAAC;AACV,YAAA,UAAU,EAAE,KAAK;YACjB,kBAAkB,EAAE,IAAI,CAAC,UAAU,EAAE,kBAAkB,EAAE,IAAI,KAAK;AACnE,SAAA,CAAC;IACJ;IACA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE;AAClC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC3E;IACF;IACA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE;QACnC,IAAI,CAAC,MAAM,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC3C;IAEA,MAAM,iBAAiB,CAAC,OAKvB,EAAA;QACC,MAAM,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC;IACnD;IAEA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,UAAU;IACxB;AACD;;;;"}
1
+ {"version":3,"file":"player-controller-host.js","sources":["../../../../src/controllers/player-controller-host.ts"],"sourcesContent":["/**\n * PlayerControllerHost — Lit ReactiveController wrapping the headless PlayerController.\n * Direct port of usePlayerController.ts from player-react.\n */\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport {\n PlayerController,\n createTranslator,\n type PlayerControllerConfig,\n type PlayerState,\n type StreamState,\n type StreamInfo,\n type PlaybackQuality,\n type ContentEndpoints,\n type ContentMetadata,\n type ClassifiedError,\n type TranslateFn,\n type I18nConfig,\n type ThumbnailCue,\n} from \"@livepeer-frameworks/player-core\";\n\nexport interface PlayerControllerHostState {\n state: PlayerState;\n streamState: StreamState | null;\n endpoints: ContentEndpoints | null;\n metadata: ContentMetadata | null;\n videoElement: HTMLVideoElement | null;\n currentTime: number;\n duration: number;\n isPlaying: boolean;\n isPaused: boolean;\n isBuffering: boolean;\n isMuted: boolean;\n volume: number;\n error: string | null;\n errorDetails: ClassifiedError[\"details\"] | null;\n isPassiveError: boolean;\n hasPlaybackStarted: boolean;\n isHoldingSpeed: boolean;\n holdSpeed: number;\n isHovering: boolean;\n shouldShowControls: boolean;\n isLoopEnabled: boolean;\n isFullscreen: boolean;\n isPiPActive: boolean;\n isEffectivelyLive: boolean;\n shouldShowIdleScreen: boolean;\n currentPlayerInfo: { name: string; shortname: string } | null;\n currentSourceInfo: { url: string; type: string } | null;\n playbackQuality: PlaybackQuality | null;\n subtitlesEnabled: boolean;\n qualities: Array<{\n id: string;\n label: string;\n bitrate?: number;\n width?: number;\n height?: number;\n isAuto?: boolean;\n active?: boolean;\n }>;\n textTracks: Array<{ id: string; label: string; lang?: string; active: boolean }>;\n streamInfo: StreamInfo | null;\n toast: { message: string; timestamp: number } | null;\n thumbnailCues: ThumbnailCue[];\n}\n\nconst initialState: PlayerControllerHostState = {\n state: \"booting\",\n streamState: null,\n endpoints: null,\n metadata: null,\n videoElement: null,\n currentTime: 0,\n duration: NaN,\n isPlaying: false,\n isPaused: true,\n isBuffering: false,\n isMuted: false,\n volume: 1,\n error: null,\n errorDetails: null,\n isPassiveError: false,\n hasPlaybackStarted: false,\n isHoldingSpeed: false,\n holdSpeed: 2,\n isHovering: false,\n shouldShowControls: false,\n isLoopEnabled: false,\n isFullscreen: false,\n isPiPActive: false,\n isEffectivelyLive: false,\n shouldShowIdleScreen: true,\n currentPlayerInfo: null,\n currentSourceInfo: null,\n playbackQuality: null,\n subtitlesEnabled: false,\n qualities: [],\n textTracks: [],\n streamInfo: null,\n toast: null,\n thumbnailCues: [],\n};\n\ntype HostElement = ReactiveControllerHost & HTMLElement;\n\nexport class PlayerControllerHost implements ReactiveController {\n host: HostElement;\n private controller: PlayerController | null = null;\n private unsubs: Array<() => void> = [];\n private currentConfig: PlayerControllerConfig | null = null;\n\n s: PlayerControllerHostState = { ...initialState };\n\n /** Translation function, updated when locale changes. */\n t: TranslateFn = createTranslator({ locale: \"en\" });\n\n constructor(host: HostElement) {\n this.host = host;\n host.addController(this);\n }\n\n /** Rebuild the translator when locale or custom translations change. */\n updateTranslator(config: I18nConfig) {\n this.t = createTranslator(config);\n this.host.requestUpdate();\n }\n\n // ---- Configuration & Lifecycle ----\n\n configure(config: PlayerControllerConfig) {\n this.currentConfig = config;\n }\n\n async attach(container: HTMLDivElement) {\n if (!this.currentConfig) return;\n this.teardown();\n\n const controller = new PlayerController({\n contentId: this.currentConfig.contentId,\n contentType: this.currentConfig.contentType,\n endpoints: this.currentConfig.endpoints,\n gatewayUrl: this.currentConfig.gatewayUrl,\n mistUrl: this.currentConfig.mistUrl,\n authToken: this.currentConfig.authToken,\n autoplay: this.currentConfig.autoplay,\n muted: this.currentConfig.muted,\n controls: this.currentConfig.controls,\n poster: this.currentConfig.poster,\n debug: this.currentConfig.debug,\n });\n\n this.controller = controller;\n this.subscribeToEvents(controller);\n\n this.update({ isLoopEnabled: controller.isLoopEnabled() });\n\n try {\n await controller.attach(container);\n } catch (err) {\n console.warn(\"[PlayerControllerHost] Attach failed:\", err);\n }\n }\n\n hostConnected() {\n // Controller attachment happens in firstUpdated of the host element\n }\n\n hostDisconnected() {\n this.teardown();\n this.s = { ...initialState };\n }\n\n private teardown() {\n this.unsubs.forEach((fn) => fn());\n this.unsubs = [];\n this.controller?.destroy();\n this.controller = null;\n }\n\n // ---- State Updates ----\n\n private update(partial: Partial<PlayerControllerHostState>) {\n Object.assign(this.s, partial);\n this.host.requestUpdate();\n }\n\n private syncState() {\n if (!this.controller) return;\n const c = this.controller;\n this.update({\n isPlaying: c.isPlaying(),\n isPaused: c.isPaused(),\n isBuffering: c.isBuffering(),\n isMuted: c.isMuted(),\n volume: c.getVolume(),\n hasPlaybackStarted: c.hasPlaybackStarted(),\n shouldShowControls: c.shouldShowControls(),\n shouldShowIdleScreen: c.shouldShowIdleScreen(),\n playbackQuality: c.getPlaybackQuality(),\n isLoopEnabled: c.isLoopEnabled(),\n subtitlesEnabled: c.isSubtitlesEnabled(),\n qualities: c.getQualities(),\n textTracks: c.getTextTracks(),\n streamInfo: c.getStreamInfo(),\n });\n }\n\n // ---- Event Subscriptions (mirrors usePlayerController exactly) ----\n\n private subscribeToEvents(controller: PlayerController) {\n const u = this.unsubs;\n\n u.push(\n controller.on(\"stateChange\", ({ state }) => {\n this.update({\n state,\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n });\n this.dispatchEvent(\"fw-state-change\", { state });\n })\n );\n\n u.push(\n controller.on(\"streamStateChange\", ({ state: streamState }) => {\n this.update({\n streamState,\n metadata: controller.getMetadata(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n });\n this.dispatchEvent(\"fw-stream-state\", { state: streamState });\n })\n );\n\n u.push(\n controller.on(\"timeUpdate\", ({ currentTime, duration }) => {\n const next: Partial<PlayerControllerHostState> = {\n currentTime,\n duration,\n shouldShowControls: controller.shouldShowControls(),\n };\n if (this.s.qualities.length === 0) {\n const qualities = controller.getQualities();\n if (qualities.length > 0) {\n next.qualities = qualities;\n }\n }\n this.update(next);\n this.dispatchEvent(\"fw-time-update\", { currentTime, duration });\n })\n );\n\n u.push(\n controller.on(\"error\", ({ error }) => {\n this.update({\n error,\n isPassiveError: controller.isPassiveError(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n });\n this.dispatchEvent(\"fw-error\", { error });\n })\n );\n\n u.push(\n controller.on(\"errorCleared\", () => {\n this.update({ error: null, isPassiveError: false });\n })\n );\n\n u.push(\n controller.on(\"ready\", ({ videoElement }) => {\n this.update({\n videoElement,\n endpoints: controller.getEndpoints(),\n metadata: controller.getMetadata(),\n streamInfo: controller.getStreamInfo(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: controller.getCurrentSourceInfo(),\n qualities: controller.getQualities(),\n textTracks: controller.getTextTracks(),\n });\n this.dispatchEvent(\"fw-ready\", { videoElement });\n this.syncState();\n\n const handleVideoEvent = () => {\n if (this.controller?.shouldSuppressVideoEvents?.()) return;\n this.syncState();\n };\n videoElement.addEventListener(\"play\", handleVideoEvent);\n videoElement.addEventListener(\"pause\", handleVideoEvent);\n videoElement.addEventListener(\"waiting\", handleVideoEvent);\n videoElement.addEventListener(\"playing\", handleVideoEvent);\n u.push(() => {\n videoElement.removeEventListener(\"play\", handleVideoEvent);\n videoElement.removeEventListener(\"pause\", handleVideoEvent);\n videoElement.removeEventListener(\"waiting\", handleVideoEvent);\n videoElement.removeEventListener(\"playing\", handleVideoEvent);\n });\n })\n );\n\n u.push(\n controller.on(\"playerSelected\", ({ player: _player, source }) => {\n this.update({\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: { url: source.url, type: source.type },\n qualities: controller.getQualities(),\n textTracks: controller.getTextTracks(),\n });\n this.syncState();\n })\n );\n\n u.push(\n controller.on(\"volumeChange\", ({ volume, muted }) => {\n this.update({ volume, isMuted: muted });\n this.dispatchEvent(\"fw-volume-change\", { volume, muted });\n })\n );\n\n u.push(\n controller.on(\"loopChange\", ({ isLoopEnabled }) => {\n this.update({ isLoopEnabled });\n })\n );\n\n u.push(\n controller.on(\"fullscreenChange\", ({ isFullscreen }) => {\n this.update({ isFullscreen });\n this.dispatchEvent(\"fw-fullscreen-change\", { isFullscreen });\n })\n );\n\n u.push(\n controller.on(\"pipChange\", ({ isPiP }) => {\n this.update({ isPiPActive: isPiP });\n this.dispatchEvent(\"fw-pip-change\", { isPiP });\n })\n );\n\n u.push(\n controller.on(\"holdSpeedStart\", ({ speed }) => {\n this.update({ isHoldingSpeed: true, holdSpeed: speed });\n })\n );\n\n u.push(\n controller.on(\"holdSpeedEnd\", () => {\n this.update({ isHoldingSpeed: false });\n })\n );\n\n u.push(\n controller.on(\"hoverStart\", () => {\n this.update({ isHovering: true, shouldShowControls: true });\n })\n );\n\n u.push(\n controller.on(\"hoverEnd\", () => {\n this.update({\n isHovering: false,\n shouldShowControls: controller.shouldShowControls(),\n });\n })\n );\n\n u.push(\n controller.on(\"captionsChange\", ({ enabled }) => {\n this.update({ subtitlesEnabled: enabled, textTracks: controller.getTextTracks() });\n })\n );\n\n u.push(\n controller.on(\"protocolSwapped\", (data) => {\n const message = `Switched to ${data.toProtocol}`;\n this.update({ toast: { message, timestamp: Date.now() } });\n this.dispatchEvent(\"fw-protocol-swapped\", data);\n })\n );\n\n u.push(\n controller.on(\"playbackFailed\", (data) => {\n this.update({\n error: data.message,\n errorDetails: data.details ?? null,\n isPassiveError: false,\n });\n this.dispatchEvent(\"fw-playback-failed\", {\n code: data.code,\n message: data.message,\n });\n })\n );\n\n u.push(\n controller.on(\"thumbnailCuesChange\", ({ cues }) => {\n this.update({ thumbnailCues: cues });\n })\n );\n }\n\n // ---- Event Dispatching ----\n\n private dispatchEvent(name: string, detail: unknown) {\n this.host.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n }\n\n // ---- Action Methods ----\n\n async play() {\n await this.controller?.play();\n }\n pause() {\n this.controller?.pause();\n }\n togglePlay() {\n this.controller?.togglePlay();\n }\n seek(time: number) {\n this.controller?.seek(time);\n }\n seekBy(delta: number) {\n this.controller?.seekBy(delta);\n }\n jumpToLive() {\n this.controller?.jumpToLive();\n }\n setVolume(volume: number) {\n this.controller?.setVolume(volume);\n }\n toggleMute() {\n this.controller?.toggleMute();\n }\n toggleLoop() {\n this.controller?.toggleLoop();\n }\n async toggleFullscreen() {\n await this.controller?.toggleFullscreen();\n }\n async togglePiP() {\n await this.controller?.togglePictureInPicture();\n }\n toggleSubtitles() {\n this.controller?.toggleSubtitles();\n }\n\n clearError() {\n this.controller?.clearError();\n this.update({ error: null, errorDetails: null, isPassiveError: false });\n }\n\n dismissToast() {\n this.update({ toast: null });\n }\n\n async retry() {\n await this.controller?.retry();\n }\n async tryNextSource() {\n await this.controller?.retryWithFallback();\n }\n canAttemptFallback(): boolean {\n return this.controller?.canAttemptFallback() ?? false;\n }\n async reload() {\n await this.controller?.reload();\n }\n\n getQualities() {\n return this.controller?.getQualities() ?? [];\n }\n selectQuality(id: string) {\n this.controller?.selectQuality(id);\n }\n getTextTracks() {\n return this.controller?.getTextTracks() ?? [];\n }\n selectTextTrack(id: string | null) {\n this.controller?.selectTextTrack(id);\n }\n setPlaybackRate(rate: number) {\n this.controller?.setPlaybackRate(rate);\n }\n getSeekableStart() {\n return this.controller?.getSeekableStart() ?? 0;\n }\n getLiveEdge() {\n return this.controller?.getLiveEdge() ?? 0;\n }\n canSeekStream() {\n return this.controller?.canSeekStream() ?? false;\n }\n getBufferedRanges() {\n return this.controller?.getBufferedRanges() ?? null;\n }\n async getStats() {\n return this.controller?.getStats();\n }\n\n handleMouseEnter() {\n this.controller?.handleMouseEnter();\n this.update({ isHovering: true, shouldShowControls: true });\n }\n handleMouseLeave() {\n this.controller?.handleMouseLeave();\n this.update({\n isHovering: false,\n shouldShowControls: this.controller?.shouldShowControls() ?? false,\n });\n }\n handleMouseMove() {\n this.controller?.handleMouseMove();\n if (this.controller) {\n this.update({ shouldShowControls: this.controller.shouldShowControls() });\n }\n }\n handleTouchStart() {\n this.controller?.handleTouchStart();\n this.update({ shouldShowControls: true });\n }\n\n async setDevModeOptions(options: {\n forcePlayer?: string;\n forceType?: string;\n forceSource?: number;\n playbackMode?: \"auto\" | \"low-latency\" | \"quality\" | \"vod\";\n }) {\n await this.controller?.setDevModeOptions(options);\n }\n\n getController(): PlayerController | null {\n return this.controller;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tslib.es6.js","sources":["../../../../../../../../../../node_modules/.pnpm/@rollup+plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAsCA;AACO,SAAS,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE;AAC1D,IAAI,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;AACjI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACnI,SAAS,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AACtJ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAClE,CAAC;AA4QD;AACuB,OAAO,eAAe,KAAK,UAAU,GAAG,eAAe,GAAG,UAAU,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE;AACvH,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC/B,IAAI,OAAO,CAAC,CAAC,IAAI,GAAG,iBAAiB,EAAE,CAAC,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,UAAU,GAAG,UAAU,EAAE,CAAC,CAAC;AACrF;;;;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"tslib.es6.js","sources":["../../../../../../../../../../node_modules/.pnpm/@rollup+plugin-typescript@12.3.0_rollup@4.60.1_tslib@2.8.1_typescript@6.0.2/node_modules/tslib/tslib.es6.js"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAsCA;AACO,SAAS,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE;AAC1D,IAAI,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;AACjI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACnI,SAAS,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AACtJ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAClE,CAAC;AA4QD;AACuB,OAAO,eAAe,KAAK,UAAU,GAAG,eAAe,GAAG,UAAU,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE;AACvH,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC/B,IAAI,OAAO,CAAC,CAAC,IAAI,GAAG,iBAAiB,EAAE,CAAC,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,UAAU,GAAG,UAAU,EAAE,CAAC,CAAC;AACrF;;;;","x_google_ignoreList":[0]}
@@ -827,10 +827,12 @@ const sharedStyles = css `
827
827
 
828
828
  .fw-seek-progress {
829
829
  position: absolute;
830
+ width: 100%;
830
831
  height: 100%;
831
832
  border-radius: 9999px;
832
833
  background: hsl(var(--fw-accent));
833
- will-change: width;
834
+ transform-origin: left center;
835
+ will-change: transform;
834
836
  }
835
837
 
836
838
  .fw-seek-hover-line {
@@ -898,6 +900,20 @@ const sharedStyles = css `
898
900
  transform: translateX(-50%);
899
901
  }
900
902
 
903
+ .fw-seek-thumbnail {
904
+ position: absolute;
905
+ bottom: 100%;
906
+ margin-bottom: 28px;
907
+ border-radius: 4px;
908
+ border: 2px solid hsl(var(--fw-surface-raised));
909
+ box-shadow: 0 4px 12px hsl(var(--fw-shadow-color) / 0.4);
910
+ background-color: hsl(var(--fw-surface-deep));
911
+ background-repeat: no-repeat;
912
+ pointer-events: none;
913
+ transform: translateX(-50%);
914
+ z-index: 10;
915
+ }
916
+
901
917
  /* --- Stats Panel --- */
902
918
  .fw-stats-panel {
903
919
  position: absolute;
@@ -1 +1 @@
1
- {"version":3,"file":"shared-styles.js","sources":["../../../../src/styles/shared-styles.ts"],"sourcesContent":["// AUTO-GENERATED — do not edit. Run `pnpm run build:css` to regenerate.\n// Source: packages/core/src/styles/player.css\nimport { css } from \"lit\";\n\nexport const sharedStyles = css`\n/*\n * FrameWorks Player CSS\n * Plain CSS - no build step required (just copy to dist).\n * CSS variables are OUTSIDE layer for guaranteed availability.\n * Component styles are in @layer fw-player for cascade isolation.\n */\n\n/* =====================================================\n CSS VARIABLES - OUTSIDE LAYER (always available)\n ===================================================== */\n\n/*\n * Player-scoped CSS variables - on .fw-player-surface to avoid :root pollution.\n * All player components must be wrapped in .fw-player-surface to inherit these.\n * These are OUTSIDE the layer so they're always available regardless of cascade.\n */\n.fw-player-surface {\n /*\n * INTERNAL: Tokyo Night palette (default theme).\n * Do NOT reference --tn-* in component styles — use --fw-* tokens below.\n */\n --tn-bg-dark: 235 21% 11%;\n --tn-bg: 233 23% 17%;\n --tn-bg-highlight: 233 23% 21%;\n --tn-bg-visual: 232 27% 25%;\n --tn-fg: 223 27% 76%;\n --tn-fg-bright: 220 13% 91%;\n --tn-fg-dark: 224 16% 53%;\n --tn-fg-gutter: 228 15% 45%;\n --tn-blue: 218 79% 73%;\n --tn-green: 95 53% 55%;\n --tn-red: 348 74% 64%;\n --tn-yellow: 35 79% 64%;\n --tn-purple: 267 82% 77%;\n --tn-cyan: 178 64% 63%;\n --tn-teal: 162 66% 62%;\n\n /*\n * PUBLIC: Semantic design tokens (default = Tokyo Night).\n * Override these to theme the player. Values are HSL triplets (e.g. \"210 100% 50%\").\n * Use with hsl(): background: hsl(var(--fw-accent) / 0.5);\n */\n\n /* Surfaces */\n --fw-surface-deep: var(--tn-bg-dark);\n --fw-surface: var(--tn-bg);\n --fw-surface-raised: var(--tn-bg-highlight);\n --fw-surface-active: var(--tn-bg-visual);\n\n /* Text */\n --fw-text: var(--tn-fg);\n --fw-text-bright: var(--tn-fg-bright);\n --fw-text-muted: var(--tn-fg-dark);\n --fw-text-faint: var(--tn-fg-gutter);\n\n /* Accents */\n --fw-accent: var(--tn-blue);\n --fw-accent-secondary: var(--tn-cyan);\n --fw-success: var(--tn-green);\n --fw-danger: var(--tn-red);\n --fw-warning: var(--tn-yellow);\n --fw-info: var(--tn-cyan);\n --fw-live: 348 80% 48%;\n\n /* Special */\n --fw-shadow-color: 0 0% 0%;\n --fw-on-accent: var(--tn-bg-dark);\n --fw-on-live: 0 0% 100%;\n --fw-radius: 0;\n\n /* Composite (derived from tokens — override for fine control) */\n --fw-controls-bg: hsl(var(--fw-surface-deep) / 0.85);\n --fw-controls-fg: hsl(var(--fw-text));\n --fw-seam: hsl(var(--fw-text-faint) / 0.3);\n color: var(--fw-controls-fg);\n}\n\n/* Declare layer upfront for lowest priority */\n@layer fw-player;\n\n/* Component styles in the fw-player layer */\n@layer fw-player {\n /* =====================================================\n ANIMATIONS\n ===================================================== */\n @keyframes float {\n 0%,\n 100% {\n transform: translateY(0px) scale(1);\n }\n 50% {\n transform: translateY(-12px) scale(0.95);\n }\n }\n\n @keyframes spin-slow {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n\n .animate-spin-slow {\n animation: spin-slow 18s linear infinite;\n }\n\n .animate-spin {\n animation: spin 1s linear infinite;\n }\n\n /* =====================================================\n SLAB SYSTEM - Player Controls & Overlays\n ===================================================== */\n\n .fw-player-surface button {\n font: inherit;\n }\n\n /* Slab base - solid structural block */\n .fw-slab {\n background: var(--fw-controls-bg);\n border: 1px solid var(--fw-seam);\n }\n\n /* Slab header - uppercase, padded */\n .fw-slab-header {\n padding: 0.5rem 1rem;\n border-bottom: 1px solid var(--fw-seam);\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: hsl(var(--fw-text-muted));\n }\n\n /* Slab body - padded content area */\n .fw-slab-body {\n padding: 1rem;\n }\n\n /* Slab actions - flush buttons, seams between */\n .fw-slab-actions {\n display: flex;\n border-top: 1px solid var(--fw-seam);\n }\n\n .fw-slab-actions > * {\n flex: 1;\n border-radius: 0 !important;\n }\n\n .fw-slab-actions > * + * {\n border-left: 1px solid var(--fw-seam);\n }\n\n /* Control bar - stacked layout (seekbar above controls row) */\n .fw-control-bar {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: var(--fw-controls-bg);\n border-top: 1px solid var(--fw-seam);\n backdrop-filter: blur(8px);\n pointer-events: auto;\n }\n\n /* Control group - seamed sections within bar */\n .fw-control-group {\n display: flex;\n align-items: center;\n padding: 0.5rem;\n }\n\n .fw-control-group + .fw-control-group {\n border-left: 1px solid var(--fw-seam);\n }\n\n /* Flush button - fills space, no radius */\n .fw-btn-flush {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 0.75rem;\n border-radius: 0;\n background: transparent;\n color: hsl(var(--fw-text));\n transition:\n background-color 0.15s,\n color 0.15s;\n cursor: pointer;\n border: none;\n }\n\n .fw-btn-flush:hover {\n background: hsl(var(--fw-surface-active) / 0.5);\n }\n\n .fw-btn-flush:active {\n background: hsl(var(--fw-surface-active));\n }\n\n .fw-btn-flush--active {\n color: hsl(var(--fw-accent));\n }\n\n /* Status indicators */\n .fw-status-online {\n color: hsl(var(--fw-success));\n }\n .fw-status-offline {\n color: hsl(var(--fw-danger));\n }\n .fw-status-warning {\n color: hsl(var(--fw-warning));\n }\n .fw-status-info {\n color: hsl(var(--fw-accent-secondary));\n }\n\n /* =====================================================\n PLAYER CONTAINER STYLES (Slab-based)\n ===================================================== */\n\n .fw-player-root {\n position: relative;\n height: 100%;\n width: 100%;\n overflow: hidden;\n container-type: size;\n border-radius: 0; /* Slabs don't have rounded corners */\n background-color: hsl(var(--fw-surface-deep));\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-player-container {\n height: 100%;\n width: 100%;\n overflow: hidden;\n border-radius: 0;\n background-color: hsl(var(--fw-surface-deep));\n }\n\n .fw-player-video {\n height: 100%;\n width: 100%;\n border-radius: 0;\n object-fit: contain;\n background-color: hsl(var(--fw-surface-deep));\n }\n\n .fw-player-embed {\n height: 100%;\n width: 100%;\n min-height: 300px;\n border-radius: 0;\n border-width: 0;\n background-color: hsl(var(--fw-surface-deep));\n }\n\n .fw-player-dvd {\n position: absolute;\n pointer-events: none;\n user-select: none;\n -webkit-user-select: none;\n }\n\n /* =====================================================\n VIDEO.JS CONTAINER CONSTRAINTS\n ===================================================== */\n\n /* VideoJS wrapper must respect container bounds */\n .fw-player-container .video-js {\n width: 100% !important;\n height: 100% !important;\n max-width: 100% !important;\n max-height: 100% !important;\n min-width: 0 !important;\n min-height: 0 !important;\n padding: 0 !important;\n background: hsl(var(--fw-surface-deep));\n }\n\n /* Ensure video tech fills the wrapper with letterboxing */\n .fw-player-container .video-js .vjs-tech {\n width: 100% !important;\n height: 100% !important;\n object-fit: contain !important;\n }\n\n /* =====================================================\n VIDEO.JS UI HIDING (when using custom controls)\n ===================================================== */\n\n /* Hide all VideoJS chrome when using our custom controls */\n .vjs-fw-custom-controls .vjs-control-bar,\n .vjs-fw-custom-controls .vjs-big-play-button,\n .vjs-fw-custom-controls .vjs-loading-spinner,\n .vjs-fw-custom-controls .vjs-text-track-display,\n .vjs-fw-custom-controls .vjs-error-display,\n .vjs-fw-custom-controls .vjs-modal-dialog,\n .vjs-fw-custom-controls .vjs-poster,\n .vjs-fw-custom-controls .vjs-live-control,\n .vjs-fw-custom-controls .vjs-title-bar {\n display: none !important;\n }\n\n /* Ensure video element fills container (absolute positioning) */\n .vjs-fw-custom-controls .vjs-tech {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n /* =====================================================\n SEMANTIC COMPONENT CLASSES (npm_studio pattern)\n All component styling - no Tailwind utilities needed\n ===================================================== */\n\n /* --- Settings Menu --- */\n .fw-settings-menu {\n position: absolute;\n bottom: 3rem;\n right: 0;\n width: 12rem;\n max-height: min(70vh, calc(100cqb - 4rem));\n overflow-y: auto;\n background: hsl(var(--fw-surface-deep));\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n box-shadow:\n 0 10px 15px -3px hsl(var(--fw-shadow-color) / 0.1),\n 0 4px 6px -4px hsl(var(--fw-shadow-color) / 0.1);\n border-radius: 0.25rem;\n z-index: 50;\n }\n\n .fw-settings-section {\n padding: 0.5rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-settings-section:last-child {\n border-bottom: none;\n }\n\n .fw-settings-label {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n text-transform: uppercase;\n font-weight: 600;\n margin-bottom: 0.25rem;\n padding-left: 0.25rem;\n }\n\n .fw-settings-options {\n display: flex;\n gap: 0.25rem;\n }\n\n .fw-settings-options--wrap {\n flex-wrap: wrap;\n }\n\n .fw-settings-btn {\n flex: 1;\n padding: 0.375rem 0.25rem;\n font-size: 10px;\n border-radius: 0.25rem;\n background: hsl(var(--fw-surface));\n color: hsl(var(--fw-text));\n border: none;\n cursor: pointer;\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-settings-btn:hover {\n background: hsl(var(--fw-surface-raised));\n }\n\n .fw-settings-btn--active {\n background: hsl(var(--fw-accent));\n color: hsl(var(--fw-surface-deep));\n }\n\n .fw-settings-btn--active:hover {\n background: hsl(var(--fw-accent));\n }\n\n .fw-settings-list {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n max-height: 8rem;\n overflow-y: auto;\n }\n\n .fw-settings-list-item {\n padding: 0.25rem 0.5rem;\n font-size: 0.75rem;\n text-align: left;\n border-radius: 0.25rem;\n background: transparent;\n color: hsl(var(--fw-text));\n border: none;\n cursor: pointer;\n transition: background-color 0.15s;\n }\n\n .fw-settings-list-item:hover {\n background: hsl(var(--fw-surface-raised));\n }\n\n .fw-settings-list-item--active {\n background: hsl(var(--fw-accent) / 0.2);\n color: hsl(var(--fw-accent));\n }\n\n /* --- Context Menu (bits-ui wrapper) --- */\n .fw-context-menu {\n z-index: 50;\n min-width: 8rem;\n overflow: hidden;\n border-radius: 0.25rem;\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n background: hsl(var(--fw-surface-deep));\n padding: 0;\n color: hsl(var(--fw-text));\n box-shadow:\n 0 10px 15px -3px hsl(var(--fw-shadow-color) / 0.1),\n 0 4px 6px -4px hsl(var(--fw-shadow-color) / 0.1);\n }\n\n .fw-context-menu-item {\n position: relative;\n display: flex;\n width: 100%;\n justify-content: flex-start;\n gap: 0.5rem;\n cursor: pointer;\n user-select: none;\n align-items: center;\n padding: 0.5rem 0.75rem;\n font-size: 0.875rem;\n text-align: left;\n font: inherit;\n border: none;\n background: transparent;\n appearance: none;\n -webkit-appearance: none;\n outline: none;\n color: hsl(var(--fw-text));\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-context-menu-item:hover,\n .fw-context-menu-item:focus {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-context-menu-item[data-disabled] {\n pointer-events: none;\n opacity: 0.5;\n }\n\n .fw-context-menu-item--inset {\n padding-left: 2rem;\n }\n\n .fw-context-menu-separator {\n margin: 0.25rem -0.25rem;\n height: 1px;\n background: hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-context-menu-label {\n padding: 0.375rem 0.5rem;\n font-size: 0.75rem;\n font-weight: 600;\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-context-menu-checkbox {\n position: relative;\n display: flex;\n width: 100%;\n justify-content: flex-start;\n gap: 0.5rem;\n cursor: pointer;\n user-select: none;\n align-items: center;\n padding: 0.5rem 0.5rem 0.5rem 2rem;\n font-size: 0.875rem;\n text-align: left;\n font: inherit;\n border: none;\n background: transparent;\n appearance: none;\n -webkit-appearance: none;\n outline: none;\n color: hsl(var(--fw-text));\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-context-menu-checkbox:hover,\n .fw-context-menu-checkbox:focus {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-context-menu-indicator {\n position: absolute;\n left: 0.5rem;\n display: flex;\n height: 0.875rem;\n width: 0.875rem;\n align-items: center;\n justify-content: center;\n }\n\n /* --- Live Badge --- */\n .fw-live-badge {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.125rem 0.5rem;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n transition:\n background-color 0.15s,\n color 0.15s;\n border: none;\n cursor: pointer;\n }\n\n .fw-live-badge--active {\n background: hsl(var(--fw-live));\n color: hsl(var(--fw-on-live));\n cursor: default;\n }\n\n .fw-live-badge--behind {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text));\n }\n\n .fw-live-badge--behind:hover {\n background: hsl(var(--fw-live));\n color: hsl(var(--fw-on-live));\n }\n\n /* --- Volume Control --- */\n .fw-volume-group {\n display: flex;\n align-items: center;\n border-radius: 0;\n transition:\n background-color 0.2s,\n width 0.2s;\n cursor: pointer;\n }\n\n .fw-volume-group--expanded {\n background: hsl(var(--fw-surface-active) / 0.5);\n }\n\n .fw-volume-group:hover {\n background: hsl(var(--fw-surface-active) / 0.5);\n }\n\n .fw-volume-group--expanded:hover {\n background: hsl(var(--fw-surface-active) / 0.5);\n }\n\n .fw-volume-group--disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .fw-volume-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n color: hsl(var(--fw-text) / 0.8);\n background: transparent;\n border: none;\n cursor: pointer;\n transition: color 0.15s;\n }\n\n .fw-volume-btn:hover {\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-volume-slider-wrapper {\n display: flex;\n align-items: center;\n overflow: hidden;\n transition:\n width 0.2s ease-out,\n opacity 0.2s ease-out;\n }\n\n .fw-volume-slider-wrapper--collapsed {\n width: 0;\n opacity: 0;\n }\n\n .fw-volume-slider-wrapper--expanded {\n width: 7rem;\n padding-right: 0.5rem;\n opacity: 1;\n }\n\n /* --- Slider Component (shared by React/Svelte) --- */\n .fw-slider {\n position: relative;\n display: flex;\n width: 100%;\n height: 1.25rem;\n touch-action: none;\n user-select: none;\n align-items: center;\n cursor: pointer;\n }\n\n .fw-slider--vertical {\n flex-direction: column;\n width: 1.25rem;\n height: 100%;\n }\n\n .fw-slider-track {\n position: absolute;\n left: 0;\n right: 0;\n height: 4px;\n border-radius: 9999px;\n background: hsl(var(--fw-text-faint) / 0.4);\n overflow: hidden;\n transition: height 0.15s ease;\n }\n\n .fw-slider:hover .fw-slider-track {\n height: 6px;\n }\n\n .fw-slider--vertical .fw-slider-track {\n top: 0;\n bottom: 0;\n left: 50%;\n right: auto;\n width: 4px;\n height: auto;\n transform: translateX(-50%);\n }\n\n .fw-slider--vertical:hover .fw-slider-track {\n width: 6px;\n height: auto;\n }\n\n .fw-slider-range {\n position: absolute;\n height: 100%;\n border-radius: 9999px;\n background: hsl(var(--fw-text));\n }\n\n .fw-slider-range--accent {\n background: hsl(var(--fw-accent-secondary));\n }\n\n .fw-slider--vertical .fw-slider-range {\n width: 100%;\n height: auto;\n bottom: 0;\n }\n\n .fw-slider-thumb {\n display: block;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: hsl(var(--fw-text));\n border: none;\n box-shadow: 0 2px 4px hsl(var(--fw-shadow-color) / 0.3);\n cursor: pointer;\n transition:\n width 0.15s ease,\n height 0.15s ease,\n box-shadow 0.15s ease;\n }\n\n .fw-slider:hover .fw-slider-thumb {\n width: 14px;\n height: 14px;\n }\n\n .fw-slider-thumb:focus {\n outline: none;\n }\n\n .fw-slider-thumb:focus-visible {\n box-shadow: 0 0 0 2px hsl(var(--fw-text) / 0.5);\n }\n\n .fw-slider-thumb--accent {\n background: hsl(var(--fw-accent-secondary));\n }\n\n .fw-slider-thumb[data-disabled] {\n pointer-events: none;\n opacity: 0.5;\n }\n\n /* --- Time Display --- */\n .fw-time-display {\n font-family: ui-monospace, monospace;\n font-size: 11px;\n line-height: 1;\n color: hsl(var(--fw-text-muted));\n white-space: nowrap;\n padding: 0 0.5rem;\n }\n\n /* --- Controls Wrapper --- */\n .fw-controls-wrapper {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n transition: opacity 0.2s;\n pointer-events: none;\n }\n\n .fw-controls-wrapper--visible {\n opacity: 1;\n }\n\n .fw-controls-wrapper--hidden {\n opacity: 0;\n }\n\n .fw-controls-row {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .fw-controls-left {\n display: flex;\n align-items: center;\n min-width: 0;\n flex-shrink: 1;\n }\n\n .fw-controls-right {\n display: flex;\n align-items: center;\n }\n\n .fw-seek-wrapper {\n width: 100%;\n padding: 0 0.5rem;\n margin-bottom: -0.25rem;\n }\n\n /* --- SeekBar Component --- */\n .fw-seek-track {\n position: absolute;\n left: 0;\n right: 0;\n height: 3px;\n border-radius: 9999px;\n background: hsl(var(--fw-text-faint) / 0.4);\n transition: height 0.15s ease;\n }\n\n .fw-seek-wrapper:hover .fw-seek-track,\n .fw-seek-root:hover .fw-seek-track,\n .fw-seek-track--active {\n height: 8px;\n }\n\n .fw-seek-buffered {\n position: absolute;\n height: 100%;\n border-radius: 9999px;\n background: hsl(var(--fw-text) / 0.3);\n transition:\n left 0.2s ease,\n width 0.2s ease;\n }\n\n .fw-seek-progress {\n position: absolute;\n height: 100%;\n border-radius: 9999px;\n background: hsl(var(--fw-accent));\n will-change: width;\n }\n\n .fw-seek-hover-line {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 2px;\n background: hsl(var(--fw-text) / 0.5);\n transform: translateX(-50%);\n pointer-events: none;\n border-radius: 1px;\n }\n\n .fw-seek-live-edge {\n position: absolute;\n top: -2px;\n bottom: -2px;\n right: 0;\n width: 3px;\n background: hsl(var(--fw-accent));\n border-radius: 1px;\n opacity: 0.7;\n }\n\n .fw-seek-thumb {\n position: absolute;\n top: 50%;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: hsl(var(--fw-accent));\n box-shadow: 0 2px 4px hsl(var(--fw-shadow-color) / 0.3);\n transform: translate(-50%, -50%);\n transition:\n opacity 0.15s ease,\n transform 0.15s ease;\n opacity: 0;\n pointer-events: none;\n }\n\n .fw-seek-wrapper:hover .fw-seek-thumb,\n .fw-seek-root:hover .fw-seek-thumb,\n .fw-seek-thumb--active {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n .fw-seek-thumb--hidden {\n opacity: 0;\n transform: translate(-50%, -50%) scale(0.75);\n }\n\n .fw-seek-tooltip {\n position: absolute;\n bottom: 100%;\n margin-bottom: 8px;\n padding: 4px 8px;\n font-family: ui-monospace, monospace;\n font-size: 12px;\n background: hsl(var(--fw-surface-deep) / 0.95);\n color: hsl(var(--fw-text));\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: none;\n transform: translateX(-50%);\n }\n\n /* --- Stats Panel --- */\n .fw-stats-panel {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n width: 18rem;\n max-height: 80%;\n overflow-y: auto;\n background: hsl(var(--fw-surface-deep) / 0.85);\n backdrop-filter: blur(4px);\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n font-family: ui-monospace, monospace;\n font-size: 0.75rem;\n z-index: 30;\n }\n\n .fw-stats-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-stats-section {\n padding: 0.5rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-stats-section:last-child {\n border-bottom: none;\n }\n\n .fw-stats-row {\n display: flex;\n justify-content: space-between;\n padding: 0.125rem 0;\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-stats-value {\n color: hsl(var(--fw-text));\n }\n\n /* --- Buffering Overlay --- */\n .fw-buffering-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: hsl(var(--fw-shadow-color) / 0.4);\n backdrop-filter: blur(4px);\n z-index: 20;\n }\n\n .fw-buffering-pill {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n font-size: 0.875rem;\n color: hsl(var(--fw-text-bright));\n background: hsl(var(--fw-surface-deep) / 0.85);\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n box-shadow: 0 4px 12px hsl(var(--fw-shadow-color) / 0.2);\n }\n\n .fw-buffering-spinner {\n width: 1rem;\n height: 1rem;\n border: 2px solid hsl(var(--fw-text-faint) / 0.3);\n border-top-color: hsl(var(--fw-accent));\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n /* --- Loading Screen --- */\n .fw-loading-screen {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: hsl(var(--fw-surface-deep));\n z-index: 20;\n }\n\n .fw-loading-spinner {\n width: 2rem;\n height: 2rem;\n border: 3px solid hsl(var(--fw-text-faint) / 0.3);\n border-top-color: hsl(var(--fw-accent));\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n .fw-loading-text {\n margin-top: 1rem;\n font-size: 0.875rem;\n color: hsl(var(--fw-text-muted));\n }\n\n /* --- Idle Screen --- */\n .fw-idle-screen {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: hsl(var(--fw-surface-deep));\n z-index: 20;\n }\n\n .fw-idle-message {\n font-size: 0.875rem;\n color: hsl(var(--fw-text-muted));\n }\n\n /* --- Stream State Overlay --- */\n .fw-stream-state-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: hsl(var(--fw-surface-deep) / 0.9);\n gap: 1rem;\n z-index: 20;\n }\n\n .fw-stream-state-icon {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-stream-state-text {\n font-size: 0.875rem;\n color: hsl(var(--fw-text-muted));\n }\n\n /* --- Title Overlay --- */\n .fw-title-overlay {\n padding: 1rem;\n background: linear-gradient(to bottom, hsl(var(--fw-surface-deep) / 0.8), transparent);\n }\n\n /* --- Thumbnail Overlay --- */\n .fw-player-thumbnail {\n position: relative;\n display: flex;\n height: 100%;\n min-height: 280px;\n width: 100%;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n background: hsl(var(--fw-surface-deep));\n }\n\n /* --- Speed Indicator --- */\n .fw-speed-indicator {\n pointer-events: none;\n background: none;\n backdrop-filter: none;\n }\n\n /* --- Skip Indicator --- */\n .fw-skip-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* --- Error Display --- */\n .fw-player-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n padding: 1.5rem;\n min-height: 280px;\n background: hsl(var(--fw-surface-deep));\n color: hsl(var(--fw-text));\n text-align: center;\n }\n\n /* --- Error Popup Overlay --- */\n .fw-error-overlay {\n position: absolute;\n z-index: 20;\n }\n\n .fw-error-overlay--fullscreen {\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: hsl(var(--fw-shadow-color) / 0.6);\n backdrop-filter: blur(4px);\n }\n\n .fw-error-overlay--passive {\n top: 0.75rem;\n left: 0.75rem;\n right: 0.75rem;\n }\n\n .fw-error-popup {\n background: hsl(var(--fw-surface-deep));\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n box-shadow: 0 10px 25px -5px hsl(var(--fw-shadow-color) / 0.3);\n overflow: hidden;\n }\n\n .fw-error-popup--fullscreen {\n min-width: 280px;\n max-width: 320px;\n }\n\n .fw-error-popup--passive {\n max-width: 28rem;\n }\n\n .fw-error-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-error-header--error {\n background: hsl(var(--fw-danger) / 0.1);\n }\n\n .fw-error-header--warning {\n background: hsl(var(--fw-warning) / 0.1);\n }\n\n .fw-error-title {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .fw-error-title--error {\n color: hsl(var(--fw-danger));\n }\n\n .fw-error-title--warning {\n color: hsl(var(--fw-warning));\n }\n\n .fw-error-close {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n background: transparent;\n border: none;\n color: hsl(var(--fw-text-muted));\n cursor: pointer;\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n .fw-error-close:hover {\n background: hsl(var(--fw-text) / 0.1);\n color: hsl(var(--fw-text));\n }\n\n .fw-error-body {\n padding: 0.75rem;\n }\n\n .fw-error-message {\n font-size: 14px;\n color: hsl(var(--fw-text));\n }\n\n .fw-error-actions {\n display: flex;\n border-top: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-error-btn {\n flex: 1;\n padding: 0.5rem 1rem;\n font-size: 12px;\n font-weight: 500;\n color: hsl(var(--fw-text));\n background: transparent;\n border: none;\n cursor: pointer;\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n .fw-error-btn:hover {\n background: hsl(var(--fw-text) / 0.05);\n color: hsl(var(--fw-text-bright));\n }\n\n /* --- Context Menu Animations (for bits-ui) --- */\n @keyframes fw-context-menu-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes fw-context-menu-out {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(0.95);\n }\n }\n\n .fw-context-menu[data-state=\"open\"] {\n animation: fw-context-menu-in 150ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .fw-context-menu[data-state=\"closed\"] {\n animation: fw-context-menu-out 150ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n /* Slide animations for different sides */\n .fw-context-menu[data-side=\"top\"] {\n transform-origin: bottom center;\n }\n\n .fw-context-menu[data-side=\"bottom\"] {\n transform-origin: top center;\n }\n\n .fw-context-menu[data-side=\"left\"] {\n transform-origin: right center;\n }\n\n .fw-context-menu[data-side=\"right\"] {\n transform-origin: left center;\n }\n\n /* =====================================================\n DEV MODE PANEL (Advanced settings sidebar)\n ===================================================== */\n\n /* Main panel - side panel container */\n .fw-dev-panel {\n z-index: 40;\n pointer-events: auto;\n background: hsl(var(--fw-surface-deep));\n border-left: 1px solid hsl(var(--fw-text-faint) / 0.5);\n color: hsl(var(--fw-text));\n font-family: ui-monospace, monospace;\n font-size: 0.75rem;\n width: 280px;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n flex-shrink: 0;\n }\n\n /* Header with tabs */\n .fw-dev-header {\n display: flex;\n align-items: center;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n background: hsl(var(--fw-surface) / 0.5);\n }\n\n /* Tab buttons */\n .fw-dev-tab {\n padding: 0.5rem 0.75rem;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n background: transparent;\n border: none;\n border-right: 1px solid hsl(var(--fw-text-faint) / 0.3);\n color: hsl(var(--fw-text-muted));\n cursor: pointer;\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-dev-tab:hover {\n background: hsl(var(--fw-surface-deep) / 0.5);\n color: hsl(var(--fw-text));\n }\n\n .fw-dev-tab--active {\n background: hsl(var(--fw-surface-deep));\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-dev-close {\n padding: 0.5rem;\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: hsl(var(--fw-text-muted));\n cursor: pointer;\n transition: color 0.15s;\n margin-left: auto;\n }\n\n .fw-dev-close:hover {\n color: hsl(var(--fw-text));\n }\n\n /* Spacer - pushes close button to right */\n .fw-dev-spacer {\n flex: 1;\n }\n\n /* Content area (body) */\n .fw-dev-content,\n .fw-dev-body {\n flex: 1;\n overflow-y: auto;\n }\n\n /* Section with label */\n .fw-dev-section {\n padding: 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-dev-section-label,\n .fw-dev-label {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n color: hsl(var(--fw-text-muted));\n margin-bottom: 0.25rem;\n }\n\n .fw-dev-section-value,\n .fw-dev-value {\n font-size: 0.875rem;\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-dev-value-arrow {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-value-muted {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n margin-top: 0.25rem;\n }\n\n .fw-dev-section-sub {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n margin-top: 0.25rem;\n }\n\n /* Mode selector buttons */\n .fw-dev-mode-options,\n .fw-dev-mode-group {\n display: flex;\n gap: 0.25rem;\n margin-top: 0.5rem;\n }\n\n .fw-dev-mode-desc {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n margin-top: 0.5rem;\n font-style: italic;\n }\n\n .fw-dev-mode-btn {\n flex: 1;\n padding: 0.375rem 0.5rem;\n font-size: 10px;\n font-weight: 500;\n border-radius: 0.25rem;\n background: hsl(var(--fw-surface-raised));\n border: none;\n color: hsl(var(--fw-text-muted));\n cursor: pointer;\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-dev-mode-btn:hover {\n color: hsl(var(--fw-text));\n background: hsl(var(--fw-surface-active));\n }\n\n .fw-dev-mode-btn--active {\n background: hsl(var(--fw-accent));\n color: hsl(var(--fw-surface-deep));\n }\n\n /* Action buttons row */\n .fw-dev-actions {\n display: flex;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-dev-action-btn {\n flex: 1;\n padding: 0.5rem 0.75rem;\n background: hsl(var(--fw-surface-raised));\n border: none;\n border-right: 1px solid hsl(var(--fw-text-faint) / 0.3);\n color: hsl(var(--fw-text));\n font-size: 0.75rem;\n cursor: pointer;\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-dev-action-btn:last-child {\n border-right: none;\n }\n\n .fw-dev-action-btn:hover {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text-bright));\n }\n\n /* Combo list header */\n .fw-dev-list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n background: hsl(var(--fw-surface) / 0.5);\n }\n\n .fw-dev-list-title {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-list-toggle {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n background: transparent;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem;\n transition: color 0.15s;\n }\n\n .fw-dev-list-toggle:hover {\n color: hsl(var(--fw-text));\n }\n\n /* Combo list items */\n .fw-dev-combo-list {\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-dev-combo-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n text-align: left;\n background: transparent;\n border: none;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);\n color: hsl(var(--fw-text));\n cursor: pointer;\n transition: background-color 0.15s;\n }\n\n .fw-dev-combo-item:last-child {\n border-bottom: none;\n }\n\n .fw-dev-combo-item:hover {\n background: hsl(var(--fw-surface) / 0.5);\n }\n\n .fw-dev-combo-item--active {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text-bright));\n box-shadow: inset 0 0 0 1px hsl(var(--fw-accent));\n }\n\n .fw-dev-combo-item--disabled {\n opacity: 0.4;\n }\n\n .fw-dev-combo-item--warning {\n background: hsl(var(--fw-warning) / 0.05);\n }\n\n .fw-dev-combo-item--warning:hover {\n background: hsl(var(--fw-warning) / 0.1);\n }\n\n .fw-dev-combo-rank {\n width: 1.25rem;\n height: 1.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n font-weight: 700;\n border-radius: 0.125rem;\n background: hsl(var(--fw-text-faint) / 0.5);\n color: hsl(var(--fw-text-muted));\n flex-shrink: 0;\n }\n\n .fw-dev-combo-rank--active {\n background: hsl(var(--fw-accent));\n color: hsl(var(--fw-surface-deep));\n }\n\n .fw-dev-combo-rank--warning {\n background: hsl(var(--fw-warning) / 0.3);\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-combo-name {\n flex: 1;\n font-size: 0.75rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .fw-dev-combo-arrow {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-combo-type {\n color: hsl(var(--fw-accent-secondary));\n }\n\n .fw-dev-combo-type--warning {\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-combo-score {\n font-size: 10px;\n font-family: ui-monospace, monospace;\n font-variant-numeric: tabular-nums;\n padding: 0.125rem 0.375rem;\n border-radius: 0.125rem;\n flex-shrink: 0;\n }\n\n .fw-dev-combo-score--high {\n background: hsl(var(--fw-success) / 0.2);\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-combo-score--medium {\n background: hsl(var(--fw-accent) / 0.2);\n color: hsl(var(--fw-accent));\n }\n\n .fw-dev-combo-score--low {\n background: hsl(var(--fw-warning) / 0.2);\n color: hsl(var(--fw-warning));\n }\n\n /* Tooltip for combo details — position: fixed escapes overflow containers */\n .fw-dev-tooltip {\n position: fixed;\n z-index: 9999;\n background: hsl(var(--fw-surface-deep));\n border: 1px solid hsl(var(--fw-text-faint));\n box-shadow:\n 0 4px 6px -1px hsl(var(--fw-shadow-color) / 0.1),\n 0 2px 4px -2px hsl(var(--fw-shadow-color) / 0.1);\n padding: 0.5rem;\n font-size: 10px;\n white-space: nowrap;\n pointer-events: none;\n min-width: 220px;\n max-width: 320px;\n }\n\n .fw-dev-tooltip-header {\n margin-bottom: 0.5rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.5);\n }\n\n .fw-dev-tooltip-title {\n font-weight: 700;\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-dev-tooltip-subtitle {\n color: hsl(var(--fw-accent-secondary));\n }\n\n .fw-dev-tooltip-info {\n color: hsl(var(--fw-text-muted));\n margin-top: 0.25rem;\n }\n\n .fw-dev-tooltip-score {\n font-weight: 700;\n color: hsl(var(--fw-text-bright));\n margin-bottom: 0.25rem;\n }\n\n .fw-dev-tooltip-breakdown {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-tooltip-breakdown-value {\n color: hsl(var(--fw-text));\n }\n\n .fw-dev-tooltip-breakdown-weight {\n color: hsl(var(--fw-text-faint));\n }\n\n .fw-dev-tooltip-error {\n color: hsl(var(--fw-danger));\n }\n\n /* Stats panel content */\n .fw-dev-stats-hero {\n padding: 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-dev-stats-rate {\n font-size: 1.5rem;\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n }\n\n .fw-dev-stats-rate--good {\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-stats-rate--catching {\n color: hsl(var(--fw-accent));\n }\n\n .fw-dev-stats-rate--slow {\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-stats-rate--stalling {\n color: hsl(var(--fw-danger));\n }\n\n .fw-dev-stats-label {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-stats-metrics {\n display: flex;\n gap: 1rem;\n margin-top: 0.5rem;\n font-size: 10px;\n }\n\n .fw-dev-stats-metric--good {\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-stats-metric--warning {\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-stats-metric--bad {\n color: hsl(var(--fw-danger));\n }\n\n /* Stats rows */\n .fw-dev-stats-rows {\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-dev-stats-row {\n display: flex;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);\n }\n\n .fw-dev-stats-row:last-child {\n border-bottom: none;\n }\n\n .fw-dev-stats-key {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-stats-value {\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-dev-stats-value--cyan {\n color: hsl(var(--fw-accent-secondary));\n }\n\n .fw-dev-stats-value--warning {\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-stats-value--bad {\n color: hsl(var(--fw-danger));\n }\n\n .fw-dev-stats-value--good {\n color: hsl(var(--fw-success));\n }\n\n /* Track badges */\n .fw-dev-track-badge {\n font-size: 10px;\n font-family: ui-monospace, monospace;\n text-transform: uppercase;\n padding: 0.125rem 0.375rem;\n }\n\n .fw-dev-track-badge--video {\n background: hsl(var(--fw-accent) / 0.2);\n color: hsl(var(--fw-accent));\n }\n\n .fw-dev-track-badge--audio {\n background: hsl(var(--fw-success) / 0.2);\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-track-badge--other {\n background: hsl(var(--fw-warning) / 0.2);\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-track-info {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n }\n\n /* Empty state */\n .fw-dev-empty,\n .fw-dev-list-empty {\n padding: 1rem 0.75rem;\n text-align: center;\n color: hsl(var(--fw-text-muted));\n }\n\n /* Chevron icon (expand/collapse toggle) */\n .fw-dev-chevron {\n transition: transform 0.15s;\n }\n\n .fw-dev-chevron--open {\n transform: rotate(180deg);\n }\n\n /* Combo wrapper (relative for tooltip positioning) */\n .fw-dev-combo {\n position: relative;\n }\n\n /* Combo button (alias for fw-dev-combo-item) */\n .fw-dev-combo-btn {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n text-align: left;\n background: transparent;\n border: none;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);\n color: hsl(var(--fw-text));\n cursor: pointer;\n transition: background-color 0.15s;\n }\n\n .fw-dev-combo-btn:last-child {\n border-bottom: none;\n }\n\n .fw-dev-combo-btn:hover {\n background: hsl(var(--fw-surface) / 0.5);\n }\n\n .fw-dev-combo-btn--active {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text-bright));\n box-shadow: inset 0 0 0 1px hsl(var(--fw-accent));\n }\n\n .fw-dev-combo-btn--disabled {\n opacity: 0.4;\n }\n\n .fw-dev-combo-btn--codec-warn {\n background: hsl(var(--fw-warning) / 0.05);\n }\n\n .fw-dev-combo-btn--codec-warn:hover {\n background: hsl(var(--fw-warning) / 0.1);\n }\n\n /* Combo rank modifiers */\n .fw-dev-combo-rank--disabled {\n background: hsl(var(--fw-text-faint) / 0.3);\n color: hsl(var(--fw-text-faint));\n }\n\n .fw-dev-combo-rank--warn {\n background: hsl(var(--fw-warning) / 0.3);\n color: hsl(var(--fw-warning));\n }\n\n /* Combo type modifiers */\n .fw-dev-combo-type--disabled {\n color: hsl(var(--fw-text-faint));\n }\n\n .fw-dev-combo-type--warn {\n color: hsl(var(--fw-warning));\n }\n\n /* Combo score modifiers (additional) */\n .fw-dev-combo-score--disabled {\n background: hsl(var(--fw-text-faint) / 0.2);\n color: hsl(var(--fw-text-faint));\n }\n\n .fw-dev-combo-score--mid {\n background: hsl(var(--fw-accent) / 0.2);\n color: hsl(var(--fw-accent));\n }\n\n /* Tooltip additional classes */\n .fw-dev-tooltip-tracks {\n color: hsl(var(--fw-text-muted));\n margin-top: 0.25rem;\n }\n\n .fw-dev-tooltip-note {\n color: hsl(var(--fw-text-muted));\n font-style: italic;\n font-size: 0.75rem;\n margin: 0.25rem 0;\n line-height: 1.3;\n white-space: normal;\n overflow-wrap: break-word;\n }\n\n .fw-dev-tooltip-value {\n color: hsl(var(--fw-text));\n }\n\n .fw-dev-tooltip-row {\n color: hsl(var(--fw-text-muted));\n margin-bottom: 0.125rem;\n }\n\n .fw-dev-tooltip-bonus {\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-tooltip-penalty {\n color: hsl(var(--fw-danger));\n }\n\n .fw-dev-tooltip-weight {\n color: hsl(var(--fw-text-faint));\n font-size: 9px;\n }\n\n /* =====================================================\n DEV MODE STATS TAB\n ===================================================== */\n\n /* Section header modifier */\n .fw-dev-section-header {\n margin-top: 0.5rem;\n }\n\n /* Playback rate hero section */\n .fw-dev-rate {\n display: flex;\n align-items: baseline;\n gap: 0.5rem;\n margin-bottom: 0.5rem;\n }\n\n .fw-dev-rate-value {\n font-size: 1.5rem;\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n }\n\n .fw-dev-rate-status {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n text-transform: uppercase;\n }\n\n .fw-dev-rate-stats {\n display: flex;\n gap: 1rem;\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n }\n\n /* Stat value modifiers */\n .fw-dev-stat-value--good {\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-stat-value--accent {\n color: hsl(var(--fw-accent));\n }\n\n .fw-dev-stat-value--warn {\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-stat-value--bad {\n color: hsl(var(--fw-danger));\n }\n\n /* Stats row (key-value pair) */\n .fw-dev-stat {\n display: flex;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);\n }\n\n .fw-dev-stat:last-child {\n border-bottom: none;\n }\n\n .fw-dev-stat-label {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-stat-value {\n color: hsl(var(--fw-text-bright));\n }\n\n /* Track display */\n .fw-dev-track {\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);\n }\n\n .fw-dev-track:last-child {\n border-bottom: none;\n }\n\n .fw-dev-track-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n }\n\n .fw-dev-track-codec {\n font-size: 10px;\n color: hsl(var(--fw-text));\n font-weight: 500;\n }\n\n .fw-dev-track-id {\n font-size: 10px;\n color: hsl(var(--fw-text-faint));\n margin-left: auto;\n }\n\n .fw-dev-track-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n }\n\n /* No tracks state */\n .fw-dev-no-tracks {\n padding: 0.75rem;\n text-align: center;\n }\n\n .fw-dev-no-tracks-text {\n color: hsl(var(--fw-text-muted));\n font-size: 10px;\n }\n\n .fw-dev-no-tracks-type {\n color: hsl(var(--fw-text-faint));\n margin-left: 0.25rem;\n }\n}\n\n/*\n * FrameWorks Player — Light Theme\n * Import alongside player.css, or set data-theme=\"light\" on the player root.\n */\n.fw-player-surface[data-theme=\"light\"] {\n --fw-surface-deep: 0 0% 97%;\n --fw-surface: 220 10% 94%;\n --fw-surface-raised: 220 10% 90%;\n --fw-surface-active: 220 10% 85%;\n\n --fw-text: 220 20% 15%;\n --fw-text-bright: 220 20% 5%;\n --fw-text-muted: 220 10% 45%;\n --fw-text-faint: 220 10% 70%;\n\n --fw-accent: 218 80% 50%;\n --fw-accent-secondary: 195 80% 42%;\n --fw-success: 140 60% 35%;\n --fw-danger: 0 70% 50%;\n --fw-warning: 35 80% 45%;\n --fw-live: 0 80% 48%;\n\n --fw-shadow-color: 220 10% 50%;\n --fw-on-accent: 0 0% 100%;\n --fw-on-live: 0 0% 100%;\n\n --fw-controls-bg: hsl(var(--fw-surface-deep) / 0.92);\n --fw-controls-fg: hsl(var(--fw-text));\n --fw-seam: hsl(var(--fw-text-faint) / 0.25);\n}\n\n/*\n * FrameWorks Player — Neutral Dark Theme\n * A brand-neutral dark theme without Tokyo Night's purple-blue tint.\n */\n.fw-player-surface[data-theme=\"neutral-dark\"] {\n --fw-surface-deep: 0 0% 8%;\n --fw-surface: 0 0% 12%;\n --fw-surface-raised: 0 0% 16%;\n --fw-surface-active: 0 0% 22%;\n\n --fw-text: 0 0% 82%;\n --fw-text-bright: 0 0% 95%;\n --fw-text-muted: 0 0% 55%;\n --fw-text-faint: 0 0% 38%;\n\n --fw-accent: 210 100% 55%;\n --fw-accent-secondary: 195 80% 55%;\n --fw-success: 140 60% 50%;\n --fw-danger: 0 70% 55%;\n --fw-warning: 35 80% 55%;\n --fw-live: 0 80% 48%;\n\n --fw-shadow-color: 0 0% 0%;\n --fw-on-accent: 0 0% 100%;\n --fw-on-live: 0 0% 100%;\n\n --fw-controls-bg: hsl(var(--fw-surface-deep) / 0.85);\n --fw-controls-fg: hsl(var(--fw-text));\n --fw-seam: hsl(var(--fw-text-faint) / 0.3);\n}\n\n`;\n"],"names":[],"mappings":";;AAAA;AACA;AAGO,MAAM,YAAY,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"shared-styles.js","sources":["../../../../src/styles/shared-styles.ts"],"sourcesContent":["// AUTO-GENERATED — do not edit. Run `pnpm run build:css` to regenerate.\n// Source: packages/core/src/styles/player.css\nimport { css } from \"lit\";\n\nexport const sharedStyles = css`\n/*\n * FrameWorks Player CSS\n * Plain CSS - no build step required (just copy to dist).\n * CSS variables are OUTSIDE layer for guaranteed availability.\n * Component styles are in @layer fw-player for cascade isolation.\n */\n\n/* =====================================================\n CSS VARIABLES - OUTSIDE LAYER (always available)\n ===================================================== */\n\n/*\n * Player-scoped CSS variables - on .fw-player-surface to avoid :root pollution.\n * All player components must be wrapped in .fw-player-surface to inherit these.\n * These are OUTSIDE the layer so they're always available regardless of cascade.\n */\n.fw-player-surface {\n /*\n * INTERNAL: Tokyo Night palette (default theme).\n * Do NOT reference --tn-* in component styles — use --fw-* tokens below.\n */\n --tn-bg-dark: 235 21% 11%;\n --tn-bg: 233 23% 17%;\n --tn-bg-highlight: 233 23% 21%;\n --tn-bg-visual: 232 27% 25%;\n --tn-fg: 223 27% 76%;\n --tn-fg-bright: 220 13% 91%;\n --tn-fg-dark: 224 16% 53%;\n --tn-fg-gutter: 228 15% 45%;\n --tn-blue: 218 79% 73%;\n --tn-green: 95 53% 55%;\n --tn-red: 348 74% 64%;\n --tn-yellow: 35 79% 64%;\n --tn-purple: 267 82% 77%;\n --tn-cyan: 178 64% 63%;\n --tn-teal: 162 66% 62%;\n\n /*\n * PUBLIC: Semantic design tokens (default = Tokyo Night).\n * Override these to theme the player. Values are HSL triplets (e.g. \"210 100% 50%\").\n * Use with hsl(): background: hsl(var(--fw-accent) / 0.5);\n */\n\n /* Surfaces */\n --fw-surface-deep: var(--tn-bg-dark);\n --fw-surface: var(--tn-bg);\n --fw-surface-raised: var(--tn-bg-highlight);\n --fw-surface-active: var(--tn-bg-visual);\n\n /* Text */\n --fw-text: var(--tn-fg);\n --fw-text-bright: var(--tn-fg-bright);\n --fw-text-muted: var(--tn-fg-dark);\n --fw-text-faint: var(--tn-fg-gutter);\n\n /* Accents */\n --fw-accent: var(--tn-blue);\n --fw-accent-secondary: var(--tn-cyan);\n --fw-success: var(--tn-green);\n --fw-danger: var(--tn-red);\n --fw-warning: var(--tn-yellow);\n --fw-info: var(--tn-cyan);\n --fw-live: 348 80% 48%;\n\n /* Special */\n --fw-shadow-color: 0 0% 0%;\n --fw-on-accent: var(--tn-bg-dark);\n --fw-on-live: 0 0% 100%;\n --fw-radius: 0;\n\n /* Composite (derived from tokens — override for fine control) */\n --fw-controls-bg: hsl(var(--fw-surface-deep) / 0.85);\n --fw-controls-fg: hsl(var(--fw-text));\n --fw-seam: hsl(var(--fw-text-faint) / 0.3);\n color: var(--fw-controls-fg);\n}\n\n/* Declare layer upfront for lowest priority */\n@layer fw-player;\n\n/* Component styles in the fw-player layer */\n@layer fw-player {\n /* =====================================================\n ANIMATIONS\n ===================================================== */\n @keyframes float {\n 0%,\n 100% {\n transform: translateY(0px) scale(1);\n }\n 50% {\n transform: translateY(-12px) scale(0.95);\n }\n }\n\n @keyframes spin-slow {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n\n .animate-spin-slow {\n animation: spin-slow 18s linear infinite;\n }\n\n .animate-spin {\n animation: spin 1s linear infinite;\n }\n\n /* =====================================================\n SLAB SYSTEM - Player Controls & Overlays\n ===================================================== */\n\n .fw-player-surface button {\n font: inherit;\n }\n\n /* Slab base - solid structural block */\n .fw-slab {\n background: var(--fw-controls-bg);\n border: 1px solid var(--fw-seam);\n }\n\n /* Slab header - uppercase, padded */\n .fw-slab-header {\n padding: 0.5rem 1rem;\n border-bottom: 1px solid var(--fw-seam);\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: hsl(var(--fw-text-muted));\n }\n\n /* Slab body - padded content area */\n .fw-slab-body {\n padding: 1rem;\n }\n\n /* Slab actions - flush buttons, seams between */\n .fw-slab-actions {\n display: flex;\n border-top: 1px solid var(--fw-seam);\n }\n\n .fw-slab-actions > * {\n flex: 1;\n border-radius: 0 !important;\n }\n\n .fw-slab-actions > * + * {\n border-left: 1px solid var(--fw-seam);\n }\n\n /* Control bar - stacked layout (seekbar above controls row) */\n .fw-control-bar {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: var(--fw-controls-bg);\n border-top: 1px solid var(--fw-seam);\n backdrop-filter: blur(8px);\n pointer-events: auto;\n }\n\n /* Control group - seamed sections within bar */\n .fw-control-group {\n display: flex;\n align-items: center;\n padding: 0.5rem;\n }\n\n .fw-control-group + .fw-control-group {\n border-left: 1px solid var(--fw-seam);\n }\n\n /* Flush button - fills space, no radius */\n .fw-btn-flush {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 0.75rem;\n border-radius: 0;\n background: transparent;\n color: hsl(var(--fw-text));\n transition:\n background-color 0.15s,\n color 0.15s;\n cursor: pointer;\n border: none;\n }\n\n .fw-btn-flush:hover {\n background: hsl(var(--fw-surface-active) / 0.5);\n }\n\n .fw-btn-flush:active {\n background: hsl(var(--fw-surface-active));\n }\n\n .fw-btn-flush--active {\n color: hsl(var(--fw-accent));\n }\n\n /* Status indicators */\n .fw-status-online {\n color: hsl(var(--fw-success));\n }\n .fw-status-offline {\n color: hsl(var(--fw-danger));\n }\n .fw-status-warning {\n color: hsl(var(--fw-warning));\n }\n .fw-status-info {\n color: hsl(var(--fw-accent-secondary));\n }\n\n /* =====================================================\n PLAYER CONTAINER STYLES (Slab-based)\n ===================================================== */\n\n .fw-player-root {\n position: relative;\n height: 100%;\n width: 100%;\n overflow: hidden;\n container-type: size;\n border-radius: 0; /* Slabs don't have rounded corners */\n background-color: hsl(var(--fw-surface-deep));\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-player-container {\n height: 100%;\n width: 100%;\n overflow: hidden;\n border-radius: 0;\n background-color: hsl(var(--fw-surface-deep));\n }\n\n .fw-player-video {\n height: 100%;\n width: 100%;\n border-radius: 0;\n object-fit: contain;\n background-color: hsl(var(--fw-surface-deep));\n }\n\n .fw-player-embed {\n height: 100%;\n width: 100%;\n min-height: 300px;\n border-radius: 0;\n border-width: 0;\n background-color: hsl(var(--fw-surface-deep));\n }\n\n .fw-player-dvd {\n position: absolute;\n pointer-events: none;\n user-select: none;\n -webkit-user-select: none;\n }\n\n /* =====================================================\n VIDEO.JS CONTAINER CONSTRAINTS\n ===================================================== */\n\n /* VideoJS wrapper must respect container bounds */\n .fw-player-container .video-js {\n width: 100% !important;\n height: 100% !important;\n max-width: 100% !important;\n max-height: 100% !important;\n min-width: 0 !important;\n min-height: 0 !important;\n padding: 0 !important;\n background: hsl(var(--fw-surface-deep));\n }\n\n /* Ensure video tech fills the wrapper with letterboxing */\n .fw-player-container .video-js .vjs-tech {\n width: 100% !important;\n height: 100% !important;\n object-fit: contain !important;\n }\n\n /* =====================================================\n VIDEO.JS UI HIDING (when using custom controls)\n ===================================================== */\n\n /* Hide all VideoJS chrome when using our custom controls */\n .vjs-fw-custom-controls .vjs-control-bar,\n .vjs-fw-custom-controls .vjs-big-play-button,\n .vjs-fw-custom-controls .vjs-loading-spinner,\n .vjs-fw-custom-controls .vjs-text-track-display,\n .vjs-fw-custom-controls .vjs-error-display,\n .vjs-fw-custom-controls .vjs-modal-dialog,\n .vjs-fw-custom-controls .vjs-poster,\n .vjs-fw-custom-controls .vjs-live-control,\n .vjs-fw-custom-controls .vjs-title-bar {\n display: none !important;\n }\n\n /* Ensure video element fills container (absolute positioning) */\n .vjs-fw-custom-controls .vjs-tech {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n /* =====================================================\n SEMANTIC COMPONENT CLASSES (npm_studio pattern)\n All component styling - no Tailwind utilities needed\n ===================================================== */\n\n /* --- Settings Menu --- */\n .fw-settings-menu {\n position: absolute;\n bottom: 3rem;\n right: 0;\n width: 12rem;\n max-height: min(70vh, calc(100cqb - 4rem));\n overflow-y: auto;\n background: hsl(var(--fw-surface-deep));\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n box-shadow:\n 0 10px 15px -3px hsl(var(--fw-shadow-color) / 0.1),\n 0 4px 6px -4px hsl(var(--fw-shadow-color) / 0.1);\n border-radius: 0.25rem;\n z-index: 50;\n }\n\n .fw-settings-section {\n padding: 0.5rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-settings-section:last-child {\n border-bottom: none;\n }\n\n .fw-settings-label {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n text-transform: uppercase;\n font-weight: 600;\n margin-bottom: 0.25rem;\n padding-left: 0.25rem;\n }\n\n .fw-settings-options {\n display: flex;\n gap: 0.25rem;\n }\n\n .fw-settings-options--wrap {\n flex-wrap: wrap;\n }\n\n .fw-settings-btn {\n flex: 1;\n padding: 0.375rem 0.25rem;\n font-size: 10px;\n border-radius: 0.25rem;\n background: hsl(var(--fw-surface));\n color: hsl(var(--fw-text));\n border: none;\n cursor: pointer;\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-settings-btn:hover {\n background: hsl(var(--fw-surface-raised));\n }\n\n .fw-settings-btn--active {\n background: hsl(var(--fw-accent));\n color: hsl(var(--fw-surface-deep));\n }\n\n .fw-settings-btn--active:hover {\n background: hsl(var(--fw-accent));\n }\n\n .fw-settings-list {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n max-height: 8rem;\n overflow-y: auto;\n }\n\n .fw-settings-list-item {\n padding: 0.25rem 0.5rem;\n font-size: 0.75rem;\n text-align: left;\n border-radius: 0.25rem;\n background: transparent;\n color: hsl(var(--fw-text));\n border: none;\n cursor: pointer;\n transition: background-color 0.15s;\n }\n\n .fw-settings-list-item:hover {\n background: hsl(var(--fw-surface-raised));\n }\n\n .fw-settings-list-item--active {\n background: hsl(var(--fw-accent) / 0.2);\n color: hsl(var(--fw-accent));\n }\n\n /* --- Context Menu (bits-ui wrapper) --- */\n .fw-context-menu {\n z-index: 50;\n min-width: 8rem;\n overflow: hidden;\n border-radius: 0.25rem;\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n background: hsl(var(--fw-surface-deep));\n padding: 0;\n color: hsl(var(--fw-text));\n box-shadow:\n 0 10px 15px -3px hsl(var(--fw-shadow-color) / 0.1),\n 0 4px 6px -4px hsl(var(--fw-shadow-color) / 0.1);\n }\n\n .fw-context-menu-item {\n position: relative;\n display: flex;\n width: 100%;\n justify-content: flex-start;\n gap: 0.5rem;\n cursor: pointer;\n user-select: none;\n align-items: center;\n padding: 0.5rem 0.75rem;\n font-size: 0.875rem;\n text-align: left;\n font: inherit;\n border: none;\n background: transparent;\n appearance: none;\n -webkit-appearance: none;\n outline: none;\n color: hsl(var(--fw-text));\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-context-menu-item:hover,\n .fw-context-menu-item:focus {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-context-menu-item[data-disabled] {\n pointer-events: none;\n opacity: 0.5;\n }\n\n .fw-context-menu-item--inset {\n padding-left: 2rem;\n }\n\n .fw-context-menu-separator {\n margin: 0.25rem -0.25rem;\n height: 1px;\n background: hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-context-menu-label {\n padding: 0.375rem 0.5rem;\n font-size: 0.75rem;\n font-weight: 600;\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-context-menu-checkbox {\n position: relative;\n display: flex;\n width: 100%;\n justify-content: flex-start;\n gap: 0.5rem;\n cursor: pointer;\n user-select: none;\n align-items: center;\n padding: 0.5rem 0.5rem 0.5rem 2rem;\n font-size: 0.875rem;\n text-align: left;\n font: inherit;\n border: none;\n background: transparent;\n appearance: none;\n -webkit-appearance: none;\n outline: none;\n color: hsl(var(--fw-text));\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-context-menu-checkbox:hover,\n .fw-context-menu-checkbox:focus {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-context-menu-indicator {\n position: absolute;\n left: 0.5rem;\n display: flex;\n height: 0.875rem;\n width: 0.875rem;\n align-items: center;\n justify-content: center;\n }\n\n /* --- Live Badge --- */\n .fw-live-badge {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.125rem 0.5rem;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n transition:\n background-color 0.15s,\n color 0.15s;\n border: none;\n cursor: pointer;\n }\n\n .fw-live-badge--active {\n background: hsl(var(--fw-live));\n color: hsl(var(--fw-on-live));\n cursor: default;\n }\n\n .fw-live-badge--behind {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text));\n }\n\n .fw-live-badge--behind:hover {\n background: hsl(var(--fw-live));\n color: hsl(var(--fw-on-live));\n }\n\n /* --- Volume Control --- */\n .fw-volume-group {\n display: flex;\n align-items: center;\n border-radius: 0;\n transition:\n background-color 0.2s,\n width 0.2s;\n cursor: pointer;\n }\n\n .fw-volume-group--expanded {\n background: hsl(var(--fw-surface-active) / 0.5);\n }\n\n .fw-volume-group:hover {\n background: hsl(var(--fw-surface-active) / 0.5);\n }\n\n .fw-volume-group--expanded:hover {\n background: hsl(var(--fw-surface-active) / 0.5);\n }\n\n .fw-volume-group--disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .fw-volume-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n color: hsl(var(--fw-text) / 0.8);\n background: transparent;\n border: none;\n cursor: pointer;\n transition: color 0.15s;\n }\n\n .fw-volume-btn:hover {\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-volume-slider-wrapper {\n display: flex;\n align-items: center;\n overflow: hidden;\n transition:\n width 0.2s ease-out,\n opacity 0.2s ease-out;\n }\n\n .fw-volume-slider-wrapper--collapsed {\n width: 0;\n opacity: 0;\n }\n\n .fw-volume-slider-wrapper--expanded {\n width: 7rem;\n padding-right: 0.5rem;\n opacity: 1;\n }\n\n /* --- Slider Component (shared by React/Svelte) --- */\n .fw-slider {\n position: relative;\n display: flex;\n width: 100%;\n height: 1.25rem;\n touch-action: none;\n user-select: none;\n align-items: center;\n cursor: pointer;\n }\n\n .fw-slider--vertical {\n flex-direction: column;\n width: 1.25rem;\n height: 100%;\n }\n\n .fw-slider-track {\n position: absolute;\n left: 0;\n right: 0;\n height: 4px;\n border-radius: 9999px;\n background: hsl(var(--fw-text-faint) / 0.4);\n overflow: hidden;\n transition: height 0.15s ease;\n }\n\n .fw-slider:hover .fw-slider-track {\n height: 6px;\n }\n\n .fw-slider--vertical .fw-slider-track {\n top: 0;\n bottom: 0;\n left: 50%;\n right: auto;\n width: 4px;\n height: auto;\n transform: translateX(-50%);\n }\n\n .fw-slider--vertical:hover .fw-slider-track {\n width: 6px;\n height: auto;\n }\n\n .fw-slider-range {\n position: absolute;\n height: 100%;\n border-radius: 9999px;\n background: hsl(var(--fw-text));\n }\n\n .fw-slider-range--accent {\n background: hsl(var(--fw-accent-secondary));\n }\n\n .fw-slider--vertical .fw-slider-range {\n width: 100%;\n height: auto;\n bottom: 0;\n }\n\n .fw-slider-thumb {\n display: block;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: hsl(var(--fw-text));\n border: none;\n box-shadow: 0 2px 4px hsl(var(--fw-shadow-color) / 0.3);\n cursor: pointer;\n transition:\n width 0.15s ease,\n height 0.15s ease,\n box-shadow 0.15s ease;\n }\n\n .fw-slider:hover .fw-slider-thumb {\n width: 14px;\n height: 14px;\n }\n\n .fw-slider-thumb:focus {\n outline: none;\n }\n\n .fw-slider-thumb:focus-visible {\n box-shadow: 0 0 0 2px hsl(var(--fw-text) / 0.5);\n }\n\n .fw-slider-thumb--accent {\n background: hsl(var(--fw-accent-secondary));\n }\n\n .fw-slider-thumb[data-disabled] {\n pointer-events: none;\n opacity: 0.5;\n }\n\n /* --- Time Display --- */\n .fw-time-display {\n font-family: ui-monospace, monospace;\n font-size: 11px;\n line-height: 1;\n color: hsl(var(--fw-text-muted));\n white-space: nowrap;\n padding: 0 0.5rem;\n }\n\n /* --- Controls Wrapper --- */\n .fw-controls-wrapper {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n transition: opacity 0.2s;\n pointer-events: none;\n }\n\n .fw-controls-wrapper--visible {\n opacity: 1;\n }\n\n .fw-controls-wrapper--hidden {\n opacity: 0;\n }\n\n .fw-controls-row {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .fw-controls-left {\n display: flex;\n align-items: center;\n min-width: 0;\n flex-shrink: 1;\n }\n\n .fw-controls-right {\n display: flex;\n align-items: center;\n }\n\n .fw-seek-wrapper {\n width: 100%;\n padding: 0 0.5rem;\n margin-bottom: -0.25rem;\n }\n\n /* --- SeekBar Component --- */\n .fw-seek-track {\n position: absolute;\n left: 0;\n right: 0;\n height: 3px;\n border-radius: 9999px;\n background: hsl(var(--fw-text-faint) / 0.4);\n transition: height 0.15s ease;\n }\n\n .fw-seek-wrapper:hover .fw-seek-track,\n .fw-seek-root:hover .fw-seek-track,\n .fw-seek-track--active {\n height: 8px;\n }\n\n .fw-seek-buffered {\n position: absolute;\n height: 100%;\n border-radius: 9999px;\n background: hsl(var(--fw-text) / 0.3);\n transition:\n left 0.2s ease,\n width 0.2s ease;\n }\n\n .fw-seek-progress {\n position: absolute;\n width: 100%;\n height: 100%;\n border-radius: 9999px;\n background: hsl(var(--fw-accent));\n transform-origin: left center;\n will-change: transform;\n }\n\n .fw-seek-hover-line {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 2px;\n background: hsl(var(--fw-text) / 0.5);\n transform: translateX(-50%);\n pointer-events: none;\n border-radius: 1px;\n }\n\n .fw-seek-live-edge {\n position: absolute;\n top: -2px;\n bottom: -2px;\n right: 0;\n width: 3px;\n background: hsl(var(--fw-accent));\n border-radius: 1px;\n opacity: 0.7;\n }\n\n .fw-seek-thumb {\n position: absolute;\n top: 50%;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: hsl(var(--fw-accent));\n box-shadow: 0 2px 4px hsl(var(--fw-shadow-color) / 0.3);\n transform: translate(-50%, -50%);\n transition:\n opacity 0.15s ease,\n transform 0.15s ease;\n opacity: 0;\n pointer-events: none;\n }\n\n .fw-seek-wrapper:hover .fw-seek-thumb,\n .fw-seek-root:hover .fw-seek-thumb,\n .fw-seek-thumb--active {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n .fw-seek-thumb--hidden {\n opacity: 0;\n transform: translate(-50%, -50%) scale(0.75);\n }\n\n .fw-seek-tooltip {\n position: absolute;\n bottom: 100%;\n margin-bottom: 8px;\n padding: 4px 8px;\n font-family: ui-monospace, monospace;\n font-size: 12px;\n background: hsl(var(--fw-surface-deep) / 0.95);\n color: hsl(var(--fw-text));\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: none;\n transform: translateX(-50%);\n }\n\n .fw-seek-thumbnail {\n position: absolute;\n bottom: 100%;\n margin-bottom: 28px;\n border-radius: 4px;\n border: 2px solid hsl(var(--fw-surface-raised));\n box-shadow: 0 4px 12px hsl(var(--fw-shadow-color) / 0.4);\n background-color: hsl(var(--fw-surface-deep));\n background-repeat: no-repeat;\n pointer-events: none;\n transform: translateX(-50%);\n z-index: 10;\n }\n\n /* --- Stats Panel --- */\n .fw-stats-panel {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n width: 18rem;\n max-height: 80%;\n overflow-y: auto;\n background: hsl(var(--fw-surface-deep) / 0.85);\n backdrop-filter: blur(4px);\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n font-family: ui-monospace, monospace;\n font-size: 0.75rem;\n z-index: 30;\n }\n\n .fw-stats-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-stats-section {\n padding: 0.5rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-stats-section:last-child {\n border-bottom: none;\n }\n\n .fw-stats-row {\n display: flex;\n justify-content: space-between;\n padding: 0.125rem 0;\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-stats-value {\n color: hsl(var(--fw-text));\n }\n\n /* --- Buffering Overlay --- */\n .fw-buffering-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: hsl(var(--fw-shadow-color) / 0.4);\n backdrop-filter: blur(4px);\n z-index: 20;\n }\n\n .fw-buffering-pill {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n font-size: 0.875rem;\n color: hsl(var(--fw-text-bright));\n background: hsl(var(--fw-surface-deep) / 0.85);\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n box-shadow: 0 4px 12px hsl(var(--fw-shadow-color) / 0.2);\n }\n\n .fw-buffering-spinner {\n width: 1rem;\n height: 1rem;\n border: 2px solid hsl(var(--fw-text-faint) / 0.3);\n border-top-color: hsl(var(--fw-accent));\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n /* --- Loading Screen --- */\n .fw-loading-screen {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: hsl(var(--fw-surface-deep));\n z-index: 20;\n }\n\n .fw-loading-spinner {\n width: 2rem;\n height: 2rem;\n border: 3px solid hsl(var(--fw-text-faint) / 0.3);\n border-top-color: hsl(var(--fw-accent));\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n .fw-loading-text {\n margin-top: 1rem;\n font-size: 0.875rem;\n color: hsl(var(--fw-text-muted));\n }\n\n /* --- Idle Screen --- */\n .fw-idle-screen {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: hsl(var(--fw-surface-deep));\n z-index: 20;\n }\n\n .fw-idle-message {\n font-size: 0.875rem;\n color: hsl(var(--fw-text-muted));\n }\n\n /* --- Stream State Overlay --- */\n .fw-stream-state-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: hsl(var(--fw-surface-deep) / 0.9);\n gap: 1rem;\n z-index: 20;\n }\n\n .fw-stream-state-icon {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-stream-state-text {\n font-size: 0.875rem;\n color: hsl(var(--fw-text-muted));\n }\n\n /* --- Title Overlay --- */\n .fw-title-overlay {\n padding: 1rem;\n background: linear-gradient(to bottom, hsl(var(--fw-surface-deep) / 0.8), transparent);\n }\n\n /* --- Thumbnail Overlay --- */\n .fw-player-thumbnail {\n position: relative;\n display: flex;\n height: 100%;\n min-height: 280px;\n width: 100%;\n cursor: pointer;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n background: hsl(var(--fw-surface-deep));\n }\n\n /* --- Speed Indicator --- */\n .fw-speed-indicator {\n pointer-events: none;\n background: none;\n backdrop-filter: none;\n }\n\n /* --- Skip Indicator --- */\n .fw-skip-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* --- Error Display --- */\n .fw-player-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n padding: 1.5rem;\n min-height: 280px;\n background: hsl(var(--fw-surface-deep));\n color: hsl(var(--fw-text));\n text-align: center;\n }\n\n /* --- Error Popup Overlay --- */\n .fw-error-overlay {\n position: absolute;\n z-index: 20;\n }\n\n .fw-error-overlay--fullscreen {\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: hsl(var(--fw-shadow-color) / 0.6);\n backdrop-filter: blur(4px);\n }\n\n .fw-error-overlay--passive {\n top: 0.75rem;\n left: 0.75rem;\n right: 0.75rem;\n }\n\n .fw-error-popup {\n background: hsl(var(--fw-surface-deep));\n border: 1px solid hsl(var(--fw-text-faint) / 0.3);\n box-shadow: 0 10px 25px -5px hsl(var(--fw-shadow-color) / 0.3);\n overflow: hidden;\n }\n\n .fw-error-popup--fullscreen {\n min-width: 280px;\n max-width: 320px;\n }\n\n .fw-error-popup--passive {\n max-width: 28rem;\n }\n\n .fw-error-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-error-header--error {\n background: hsl(var(--fw-danger) / 0.1);\n }\n\n .fw-error-header--warning {\n background: hsl(var(--fw-warning) / 0.1);\n }\n\n .fw-error-title {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .fw-error-title--error {\n color: hsl(var(--fw-danger));\n }\n\n .fw-error-title--warning {\n color: hsl(var(--fw-warning));\n }\n\n .fw-error-close {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n background: transparent;\n border: none;\n color: hsl(var(--fw-text-muted));\n cursor: pointer;\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n .fw-error-close:hover {\n background: hsl(var(--fw-text) / 0.1);\n color: hsl(var(--fw-text));\n }\n\n .fw-error-body {\n padding: 0.75rem;\n }\n\n .fw-error-message {\n font-size: 14px;\n color: hsl(var(--fw-text));\n }\n\n .fw-error-actions {\n display: flex;\n border-top: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-error-btn {\n flex: 1;\n padding: 0.5rem 1rem;\n font-size: 12px;\n font-weight: 500;\n color: hsl(var(--fw-text));\n background: transparent;\n border: none;\n cursor: pointer;\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n .fw-error-btn:hover {\n background: hsl(var(--fw-text) / 0.05);\n color: hsl(var(--fw-text-bright));\n }\n\n /* --- Context Menu Animations (for bits-ui) --- */\n @keyframes fw-context-menu-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes fw-context-menu-out {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(0.95);\n }\n }\n\n .fw-context-menu[data-state=\"open\"] {\n animation: fw-context-menu-in 150ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .fw-context-menu[data-state=\"closed\"] {\n animation: fw-context-menu-out 150ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n /* Slide animations for different sides */\n .fw-context-menu[data-side=\"top\"] {\n transform-origin: bottom center;\n }\n\n .fw-context-menu[data-side=\"bottom\"] {\n transform-origin: top center;\n }\n\n .fw-context-menu[data-side=\"left\"] {\n transform-origin: right center;\n }\n\n .fw-context-menu[data-side=\"right\"] {\n transform-origin: left center;\n }\n\n /* =====================================================\n DEV MODE PANEL (Advanced settings sidebar)\n ===================================================== */\n\n /* Main panel - side panel container */\n .fw-dev-panel {\n z-index: 40;\n pointer-events: auto;\n background: hsl(var(--fw-surface-deep));\n border-left: 1px solid hsl(var(--fw-text-faint) / 0.5);\n color: hsl(var(--fw-text));\n font-family: ui-monospace, monospace;\n font-size: 0.75rem;\n width: 280px;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n flex-shrink: 0;\n }\n\n /* Header with tabs */\n .fw-dev-header {\n display: flex;\n align-items: center;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n background: hsl(var(--fw-surface) / 0.5);\n }\n\n /* Tab buttons */\n .fw-dev-tab {\n padding: 0.5rem 0.75rem;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n background: transparent;\n border: none;\n border-right: 1px solid hsl(var(--fw-text-faint) / 0.3);\n color: hsl(var(--fw-text-muted));\n cursor: pointer;\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-dev-tab:hover {\n background: hsl(var(--fw-surface-deep) / 0.5);\n color: hsl(var(--fw-text));\n }\n\n .fw-dev-tab--active {\n background: hsl(var(--fw-surface-deep));\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-dev-close {\n padding: 0.5rem;\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: hsl(var(--fw-text-muted));\n cursor: pointer;\n transition: color 0.15s;\n margin-left: auto;\n }\n\n .fw-dev-close:hover {\n color: hsl(var(--fw-text));\n }\n\n /* Spacer - pushes close button to right */\n .fw-dev-spacer {\n flex: 1;\n }\n\n /* Content area (body) */\n .fw-dev-content,\n .fw-dev-body {\n flex: 1;\n overflow-y: auto;\n }\n\n /* Section with label */\n .fw-dev-section {\n padding: 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-dev-section-label,\n .fw-dev-label {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n color: hsl(var(--fw-text-muted));\n margin-bottom: 0.25rem;\n }\n\n .fw-dev-section-value,\n .fw-dev-value {\n font-size: 0.875rem;\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-dev-value-arrow {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-value-muted {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n margin-top: 0.25rem;\n }\n\n .fw-dev-section-sub {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n margin-top: 0.25rem;\n }\n\n /* Mode selector buttons */\n .fw-dev-mode-options,\n .fw-dev-mode-group {\n display: flex;\n gap: 0.25rem;\n margin-top: 0.5rem;\n }\n\n .fw-dev-mode-desc {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n margin-top: 0.5rem;\n font-style: italic;\n }\n\n .fw-dev-mode-btn {\n flex: 1;\n padding: 0.375rem 0.5rem;\n font-size: 10px;\n font-weight: 500;\n border-radius: 0.25rem;\n background: hsl(var(--fw-surface-raised));\n border: none;\n color: hsl(var(--fw-text-muted));\n cursor: pointer;\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-dev-mode-btn:hover {\n color: hsl(var(--fw-text));\n background: hsl(var(--fw-surface-active));\n }\n\n .fw-dev-mode-btn--active {\n background: hsl(var(--fw-accent));\n color: hsl(var(--fw-surface-deep));\n }\n\n /* Action buttons row */\n .fw-dev-actions {\n display: flex;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-dev-action-btn {\n flex: 1;\n padding: 0.5rem 0.75rem;\n background: hsl(var(--fw-surface-raised));\n border: none;\n border-right: 1px solid hsl(var(--fw-text-faint) / 0.3);\n color: hsl(var(--fw-text));\n font-size: 0.75rem;\n cursor: pointer;\n transition:\n background-color 0.15s,\n color 0.15s;\n }\n\n .fw-dev-action-btn:last-child {\n border-right: none;\n }\n\n .fw-dev-action-btn:hover {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text-bright));\n }\n\n /* Combo list header */\n .fw-dev-list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n background: hsl(var(--fw-surface) / 0.5);\n }\n\n .fw-dev-list-title {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-list-toggle {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n background: transparent;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem;\n transition: color 0.15s;\n }\n\n .fw-dev-list-toggle:hover {\n color: hsl(var(--fw-text));\n }\n\n /* Combo list items */\n .fw-dev-combo-list {\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-dev-combo-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n text-align: left;\n background: transparent;\n border: none;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);\n color: hsl(var(--fw-text));\n cursor: pointer;\n transition: background-color 0.15s;\n }\n\n .fw-dev-combo-item:last-child {\n border-bottom: none;\n }\n\n .fw-dev-combo-item:hover {\n background: hsl(var(--fw-surface) / 0.5);\n }\n\n .fw-dev-combo-item--active {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text-bright));\n box-shadow: inset 0 0 0 1px hsl(var(--fw-accent));\n }\n\n .fw-dev-combo-item--disabled {\n opacity: 0.4;\n }\n\n .fw-dev-combo-item--warning {\n background: hsl(var(--fw-warning) / 0.05);\n }\n\n .fw-dev-combo-item--warning:hover {\n background: hsl(var(--fw-warning) / 0.1);\n }\n\n .fw-dev-combo-rank {\n width: 1.25rem;\n height: 1.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n font-weight: 700;\n border-radius: 0.125rem;\n background: hsl(var(--fw-text-faint) / 0.5);\n color: hsl(var(--fw-text-muted));\n flex-shrink: 0;\n }\n\n .fw-dev-combo-rank--active {\n background: hsl(var(--fw-accent));\n color: hsl(var(--fw-surface-deep));\n }\n\n .fw-dev-combo-rank--warning {\n background: hsl(var(--fw-warning) / 0.3);\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-combo-name {\n flex: 1;\n font-size: 0.75rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .fw-dev-combo-arrow {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-combo-type {\n color: hsl(var(--fw-accent-secondary));\n }\n\n .fw-dev-combo-type--warning {\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-combo-score {\n font-size: 10px;\n font-family: ui-monospace, monospace;\n font-variant-numeric: tabular-nums;\n padding: 0.125rem 0.375rem;\n border-radius: 0.125rem;\n flex-shrink: 0;\n }\n\n .fw-dev-combo-score--high {\n background: hsl(var(--fw-success) / 0.2);\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-combo-score--medium {\n background: hsl(var(--fw-accent) / 0.2);\n color: hsl(var(--fw-accent));\n }\n\n .fw-dev-combo-score--low {\n background: hsl(var(--fw-warning) / 0.2);\n color: hsl(var(--fw-warning));\n }\n\n /* Tooltip for combo details — position: fixed escapes overflow containers */\n .fw-dev-tooltip {\n position: fixed;\n z-index: 9999;\n background: hsl(var(--fw-surface-deep));\n border: 1px solid hsl(var(--fw-text-faint));\n box-shadow:\n 0 4px 6px -1px hsl(var(--fw-shadow-color) / 0.1),\n 0 2px 4px -2px hsl(var(--fw-shadow-color) / 0.1);\n padding: 0.5rem;\n font-size: 10px;\n white-space: nowrap;\n pointer-events: none;\n min-width: 220px;\n max-width: 320px;\n }\n\n .fw-dev-tooltip-header {\n margin-bottom: 0.5rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.5);\n }\n\n .fw-dev-tooltip-title {\n font-weight: 700;\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-dev-tooltip-subtitle {\n color: hsl(var(--fw-accent-secondary));\n }\n\n .fw-dev-tooltip-info {\n color: hsl(var(--fw-text-muted));\n margin-top: 0.25rem;\n }\n\n .fw-dev-tooltip-score {\n font-weight: 700;\n color: hsl(var(--fw-text-bright));\n margin-bottom: 0.25rem;\n }\n\n .fw-dev-tooltip-breakdown {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-tooltip-breakdown-value {\n color: hsl(var(--fw-text));\n }\n\n .fw-dev-tooltip-breakdown-weight {\n color: hsl(var(--fw-text-faint));\n }\n\n .fw-dev-tooltip-error {\n color: hsl(var(--fw-danger));\n }\n\n /* Stats panel content */\n .fw-dev-stats-hero {\n padding: 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-dev-stats-rate {\n font-size: 1.5rem;\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n }\n\n .fw-dev-stats-rate--good {\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-stats-rate--catching {\n color: hsl(var(--fw-accent));\n }\n\n .fw-dev-stats-rate--slow {\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-stats-rate--stalling {\n color: hsl(var(--fw-danger));\n }\n\n .fw-dev-stats-label {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-stats-metrics {\n display: flex;\n gap: 1rem;\n margin-top: 0.5rem;\n font-size: 10px;\n }\n\n .fw-dev-stats-metric--good {\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-stats-metric--warning {\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-stats-metric--bad {\n color: hsl(var(--fw-danger));\n }\n\n /* Stats rows */\n .fw-dev-stats-rows {\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);\n }\n\n .fw-dev-stats-row {\n display: flex;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);\n }\n\n .fw-dev-stats-row:last-child {\n border-bottom: none;\n }\n\n .fw-dev-stats-key {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-stats-value {\n color: hsl(var(--fw-text-bright));\n }\n\n .fw-dev-stats-value--cyan {\n color: hsl(var(--fw-accent-secondary));\n }\n\n .fw-dev-stats-value--warning {\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-stats-value--bad {\n color: hsl(var(--fw-danger));\n }\n\n .fw-dev-stats-value--good {\n color: hsl(var(--fw-success));\n }\n\n /* Track badges */\n .fw-dev-track-badge {\n font-size: 10px;\n font-family: ui-monospace, monospace;\n text-transform: uppercase;\n padding: 0.125rem 0.375rem;\n }\n\n .fw-dev-track-badge--video {\n background: hsl(var(--fw-accent) / 0.2);\n color: hsl(var(--fw-accent));\n }\n\n .fw-dev-track-badge--audio {\n background: hsl(var(--fw-success) / 0.2);\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-track-badge--other {\n background: hsl(var(--fw-warning) / 0.2);\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-track-info {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n }\n\n /* Empty state */\n .fw-dev-empty,\n .fw-dev-list-empty {\n padding: 1rem 0.75rem;\n text-align: center;\n color: hsl(var(--fw-text-muted));\n }\n\n /* Chevron icon (expand/collapse toggle) */\n .fw-dev-chevron {\n transition: transform 0.15s;\n }\n\n .fw-dev-chevron--open {\n transform: rotate(180deg);\n }\n\n /* Combo wrapper (relative for tooltip positioning) */\n .fw-dev-combo {\n position: relative;\n }\n\n /* Combo button (alias for fw-dev-combo-item) */\n .fw-dev-combo-btn {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n text-align: left;\n background: transparent;\n border: none;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);\n color: hsl(var(--fw-text));\n cursor: pointer;\n transition: background-color 0.15s;\n }\n\n .fw-dev-combo-btn:last-child {\n border-bottom: none;\n }\n\n .fw-dev-combo-btn:hover {\n background: hsl(var(--fw-surface) / 0.5);\n }\n\n .fw-dev-combo-btn--active {\n background: hsl(var(--fw-surface-active));\n color: hsl(var(--fw-text-bright));\n box-shadow: inset 0 0 0 1px hsl(var(--fw-accent));\n }\n\n .fw-dev-combo-btn--disabled {\n opacity: 0.4;\n }\n\n .fw-dev-combo-btn--codec-warn {\n background: hsl(var(--fw-warning) / 0.05);\n }\n\n .fw-dev-combo-btn--codec-warn:hover {\n background: hsl(var(--fw-warning) / 0.1);\n }\n\n /* Combo rank modifiers */\n .fw-dev-combo-rank--disabled {\n background: hsl(var(--fw-text-faint) / 0.3);\n color: hsl(var(--fw-text-faint));\n }\n\n .fw-dev-combo-rank--warn {\n background: hsl(var(--fw-warning) / 0.3);\n color: hsl(var(--fw-warning));\n }\n\n /* Combo type modifiers */\n .fw-dev-combo-type--disabled {\n color: hsl(var(--fw-text-faint));\n }\n\n .fw-dev-combo-type--warn {\n color: hsl(var(--fw-warning));\n }\n\n /* Combo score modifiers (additional) */\n .fw-dev-combo-score--disabled {\n background: hsl(var(--fw-text-faint) / 0.2);\n color: hsl(var(--fw-text-faint));\n }\n\n .fw-dev-combo-score--mid {\n background: hsl(var(--fw-accent) / 0.2);\n color: hsl(var(--fw-accent));\n }\n\n /* Tooltip additional classes */\n .fw-dev-tooltip-tracks {\n color: hsl(var(--fw-text-muted));\n margin-top: 0.25rem;\n }\n\n .fw-dev-tooltip-note {\n color: hsl(var(--fw-text-muted));\n font-style: italic;\n font-size: 0.75rem;\n margin: 0.25rem 0;\n line-height: 1.3;\n white-space: normal;\n overflow-wrap: break-word;\n }\n\n .fw-dev-tooltip-value {\n color: hsl(var(--fw-text));\n }\n\n .fw-dev-tooltip-row {\n color: hsl(var(--fw-text-muted));\n margin-bottom: 0.125rem;\n }\n\n .fw-dev-tooltip-bonus {\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-tooltip-penalty {\n color: hsl(var(--fw-danger));\n }\n\n .fw-dev-tooltip-weight {\n color: hsl(var(--fw-text-faint));\n font-size: 9px;\n }\n\n /* =====================================================\n DEV MODE STATS TAB\n ===================================================== */\n\n /* Section header modifier */\n .fw-dev-section-header {\n margin-top: 0.5rem;\n }\n\n /* Playback rate hero section */\n .fw-dev-rate {\n display: flex;\n align-items: baseline;\n gap: 0.5rem;\n margin-bottom: 0.5rem;\n }\n\n .fw-dev-rate-value {\n font-size: 1.5rem;\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n }\n\n .fw-dev-rate-status {\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n text-transform: uppercase;\n }\n\n .fw-dev-rate-stats {\n display: flex;\n gap: 1rem;\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n }\n\n /* Stat value modifiers */\n .fw-dev-stat-value--good {\n color: hsl(var(--fw-success));\n }\n\n .fw-dev-stat-value--accent {\n color: hsl(var(--fw-accent));\n }\n\n .fw-dev-stat-value--warn {\n color: hsl(var(--fw-warning));\n }\n\n .fw-dev-stat-value--bad {\n color: hsl(var(--fw-danger));\n }\n\n /* Stats row (key-value pair) */\n .fw-dev-stat {\n display: flex;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);\n }\n\n .fw-dev-stat:last-child {\n border-bottom: none;\n }\n\n .fw-dev-stat-label {\n color: hsl(var(--fw-text-muted));\n }\n\n .fw-dev-stat-value {\n color: hsl(var(--fw-text-bright));\n }\n\n /* Track display */\n .fw-dev-track {\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);\n }\n\n .fw-dev-track:last-child {\n border-bottom: none;\n }\n\n .fw-dev-track-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n }\n\n .fw-dev-track-codec {\n font-size: 10px;\n color: hsl(var(--fw-text));\n font-weight: 500;\n }\n\n .fw-dev-track-id {\n font-size: 10px;\n color: hsl(var(--fw-text-faint));\n margin-left: auto;\n }\n\n .fw-dev-track-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n font-size: 10px;\n color: hsl(var(--fw-text-muted));\n }\n\n /* No tracks state */\n .fw-dev-no-tracks {\n padding: 0.75rem;\n text-align: center;\n }\n\n .fw-dev-no-tracks-text {\n color: hsl(var(--fw-text-muted));\n font-size: 10px;\n }\n\n .fw-dev-no-tracks-type {\n color: hsl(var(--fw-text-faint));\n margin-left: 0.25rem;\n }\n}\n\n/*\n * FrameWorks Player — Light Theme\n * Import alongside player.css, or set data-theme=\"light\" on the player root.\n */\n.fw-player-surface[data-theme=\"light\"] {\n --fw-surface-deep: 0 0% 97%;\n --fw-surface: 220 10% 94%;\n --fw-surface-raised: 220 10% 90%;\n --fw-surface-active: 220 10% 85%;\n\n --fw-text: 220 20% 15%;\n --fw-text-bright: 220 20% 5%;\n --fw-text-muted: 220 10% 45%;\n --fw-text-faint: 220 10% 70%;\n\n --fw-accent: 218 80% 50%;\n --fw-accent-secondary: 195 80% 42%;\n --fw-success: 140 60% 35%;\n --fw-danger: 0 70% 50%;\n --fw-warning: 35 80% 45%;\n --fw-live: 0 80% 48%;\n\n --fw-shadow-color: 220 10% 50%;\n --fw-on-accent: 0 0% 100%;\n --fw-on-live: 0 0% 100%;\n\n --fw-controls-bg: hsl(var(--fw-surface-deep) / 0.92);\n --fw-controls-fg: hsl(var(--fw-text));\n --fw-seam: hsl(var(--fw-text-faint) / 0.25);\n}\n\n/*\n * FrameWorks Player — Neutral Dark Theme\n * A brand-neutral dark theme without Tokyo Night's purple-blue tint.\n */\n.fw-player-surface[data-theme=\"neutral-dark\"] {\n --fw-surface-deep: 0 0% 8%;\n --fw-surface: 0 0% 12%;\n --fw-surface-raised: 0 0% 16%;\n --fw-surface-active: 0 0% 22%;\n\n --fw-text: 0 0% 82%;\n --fw-text-bright: 0 0% 95%;\n --fw-text-muted: 0 0% 55%;\n --fw-text-faint: 0 0% 38%;\n\n --fw-accent: 210 100% 55%;\n --fw-accent-secondary: 195 80% 55%;\n --fw-success: 140 60% 50%;\n --fw-danger: 0 70% 55%;\n --fw-warning: 35 80% 55%;\n --fw-live: 0 80% 48%;\n\n --fw-shadow-color: 0 0% 0%;\n --fw-on-accent: 0 0% 100%;\n --fw-on-live: 0 0% 100%;\n\n --fw-controls-bg: hsl(var(--fw-surface-deep) / 0.85);\n --fw-controls-fg: hsl(var(--fw-text));\n --fw-seam: hsl(var(--fw-text-faint) / 0.3);\n}\n\n`;\n"],"names":[],"mappings":";;AAAA;AACA;AAGO,MAAM,YAAY,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}