@djangocfg/ui-tools 2.1.312 → 2.1.313
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -22
- package/dist/{DocsLayout-W5JLRNSZ.mjs → DocsLayout-ESVQZO3V.mjs} +3 -3
- package/dist/{DocsLayout-W5JLRNSZ.mjs.map → DocsLayout-ESVQZO3V.mjs.map} +1 -1
- package/dist/{DocsLayout-ZXD2CUOH.cjs → DocsLayout-KUPDWJ3G.cjs} +48 -48
- package/dist/{DocsLayout-ZXD2CUOH.cjs.map → DocsLayout-KUPDWJ3G.cjs.map} +1 -1
- package/dist/Player-M3GC3VPE.mjs +4 -0
- package/dist/Player-M3GC3VPE.mjs.map +1 -0
- package/dist/Player-ZGQKKOWI.css +65 -0
- package/dist/Player-ZGQKKOWI.css.map +1 -0
- package/dist/Player-ZL2X5LGG.cjs +13 -0
- package/dist/Player-ZL2X5LGG.cjs.map +1 -0
- package/dist/{chunk-CXVGN6ZW.cjs → chunk-DFTVB66S.cjs} +7 -6
- package/dist/chunk-DFTVB66S.cjs.map +1 -0
- package/dist/{chunk-2QY3LJR6.mjs → chunk-EUADAUBQ.mjs} +5 -4
- package/dist/chunk-EUADAUBQ.mjs.map +1 -0
- package/dist/chunk-FX2QFYWF.mjs +2059 -0
- package/dist/chunk-FX2QFYWF.mjs.map +1 -0
- package/dist/{chunk-6HNAPVZ2.mjs → chunk-GBLQTHWT.mjs} +11 -13
- package/dist/chunk-GBLQTHWT.mjs.map +1 -0
- package/dist/{chunk-FYLR232K.cjs → chunk-S44PW6NK.cjs} +11 -13
- package/dist/chunk-S44PW6NK.cjs.map +1 -0
- package/dist/chunk-ZLQHUZDU.cjs +2061 -0
- package/dist/chunk-ZLQHUZDU.cjs.map +1 -0
- package/dist/components-WYEZL5TE.cjs +26 -0
- package/dist/{components-3RTH76CV.cjs.map → components-WYEZL5TE.cjs.map} +1 -1
- package/dist/components-ZAGG2PBO.mjs +5 -0
- package/dist/{components-5GVVL2Q6.mjs.map → components-ZAGG2PBO.mjs.map} +1 -1
- package/dist/index.cjs +36 -220
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +65 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +44 -500
- package/dist/index.d.ts +44 -500
- package/dist/index.mjs +16 -62
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
- package/src/components/markdown/MarkdownMessage/ActionRow.tsx +48 -0
- package/src/components/markdown/MarkdownMessage/ChatMessageRow.tsx +97 -0
- package/src/components/markdown/MarkdownMessage/CodeBlock.tsx +9 -13
- package/src/components/markdown/MarkdownMessage/MarkdownMessage.story.tsx +77 -2
- package/src/components/markdown/MarkdownMessage/MarkdownMessage.tsx +2 -3
- package/src/components/markdown/MarkdownMessage/README.md +72 -0
- package/src/components/markdown/MarkdownMessage/components.tsx +3 -3
- package/src/components/markdown/MarkdownMessage/index.ts +6 -0
- package/src/index.ts +2 -11
- package/src/tools/AudioPlayer/AudioPlayer.story.tsx +454 -107
- package/src/tools/AudioPlayer/Player.tsx +80 -0
- package/src/tools/AudioPlayer/PlayerShell.tsx +122 -0
- package/src/tools/AudioPlayer/README.md +139 -204
- package/src/tools/AudioPlayer/audio/audioContext.ts +39 -0
- package/src/tools/AudioPlayer/audio/decodePeaks.ts +36 -0
- package/src/tools/AudioPlayer/audio/index.ts +4 -0
- package/src/tools/AudioPlayer/audio/mediaElementSourceCache.ts +20 -0
- package/src/tools/AudioPlayer/audio/peaksCache.ts +37 -0
- package/src/tools/AudioPlayer/context/AudioRefContext.tsx +9 -0
- package/src/tools/AudioPlayer/context/ControlsContext.tsx +7 -0
- package/src/tools/AudioPlayer/context/LevelsContext.tsx +7 -0
- package/src/tools/AudioPlayer/context/MetaContext.tsx +16 -0
- package/src/tools/AudioPlayer/context/PlayerProvider.tsx +314 -0
- package/src/tools/AudioPlayer/context/StateContext.tsx +7 -0
- package/src/tools/AudioPlayer/context/index.ts +16 -15
- package/src/tools/AudioPlayer/context/selectors.ts +36 -0
- package/src/tools/AudioPlayer/hooks/index.ts +12 -39
- package/src/tools/AudioPlayer/hooks/useActivePlayer.ts +31 -0
- package/src/tools/AudioPlayer/hooks/useAnalyser.ts +62 -0
- package/src/tools/AudioPlayer/hooks/useAudioElementEvents.ts +102 -0
- package/src/tools/AudioPlayer/hooks/useKeyboardShortcuts.ts +91 -0
- package/src/tools/AudioPlayer/hooks/useMediaSession.ts +74 -0
- package/src/tools/AudioPlayer/hooks/usePeaks.ts +83 -0
- package/src/tools/AudioPlayer/hooks/usePlayerPreferences.ts +21 -0
- package/src/tools/AudioPlayer/hooks/usePlayheadLoop.ts +77 -0
- package/src/tools/AudioPlayer/hooks/useResizeObserver.ts +20 -0
- package/src/tools/AudioPlayer/hooks/useThemeWatcher.ts +22 -0
- package/src/tools/AudioPlayer/index.ts +63 -134
- package/src/tools/AudioPlayer/lazy.tsx +8 -97
- package/src/tools/AudioPlayer/parts/Controls/ControlsRow.tsx +30 -0
- package/src/tools/AudioPlayer/parts/Controls/IconButton.tsx +62 -0
- package/src/tools/AudioPlayer/parts/Controls/LoopButton.tsx +33 -0
- package/src/tools/AudioPlayer/parts/Controls/PlayButton.tsx +86 -0
- package/src/tools/AudioPlayer/parts/Controls/SkipButton.tsx +17 -0
- package/src/tools/AudioPlayer/parts/Controls/VolumeControl.tsx +171 -0
- package/src/tools/AudioPlayer/parts/Controls/index.ts +6 -0
- package/src/tools/AudioPlayer/parts/Cover/Cover.tsx +24 -0
- package/src/tools/AudioPlayer/parts/Cover/CoverPlaceholder.tsx +27 -0
- package/src/tools/AudioPlayer/parts/Cover/ReactivePulse.tsx +66 -0
- package/src/tools/AudioPlayer/parts/Cover/index.ts +3 -0
- package/src/tools/AudioPlayer/parts/ErrorState/ErrorState.tsx +35 -0
- package/src/tools/AudioPlayer/parts/ErrorState/index.ts +1 -0
- package/src/tools/AudioPlayer/parts/Layout/CompactLayout.tsx +25 -0
- package/src/tools/AudioPlayer/parts/Layout/DefaultLayout.tsx +48 -0
- package/src/tools/AudioPlayer/parts/Layout/index.ts +2 -0
- package/src/tools/AudioPlayer/parts/Meta/Artist.tsx +14 -0
- package/src/tools/AudioPlayer/parts/Meta/TimeDisplay.tsx +49 -0
- package/src/tools/AudioPlayer/parts/Meta/Title.tsx +13 -0
- package/src/tools/AudioPlayer/parts/Meta/index.ts +3 -0
- package/src/tools/AudioPlayer/parts/Skeleton/CoverSkeleton.tsx +13 -0
- package/src/tools/AudioPlayer/parts/Skeleton/MetaSkeleton.tsx +10 -0
- package/src/tools/AudioPlayer/parts/Skeleton/index.ts +2 -0
- package/src/tools/AudioPlayer/parts/Waveform/BarsWaveform.tsx +48 -0
- package/src/tools/AudioPlayer/parts/Waveform/LiveWaveform.tsx +95 -0
- package/src/tools/AudioPlayer/parts/Waveform/PeaksWaveform.tsx +100 -0
- package/src/tools/AudioPlayer/parts/Waveform/ProgressBar.tsx +76 -0
- package/src/tools/AudioPlayer/parts/Waveform/Waveform.tsx +74 -0
- package/src/tools/AudioPlayer/parts/Waveform/WaveformSkeleton.tsx +16 -0
- package/src/tools/AudioPlayer/parts/Waveform/index.ts +8 -0
- package/src/tools/AudioPlayer/parts/Waveform/waveformInteraction.ts +106 -0
- package/src/tools/AudioPlayer/parts/Waveform/waveformRenderer.ts +91 -0
- package/src/tools/AudioPlayer/parts/index.ts +1 -0
- package/src/tools/AudioPlayer/store/activePlayerBus.ts +63 -0
- package/src/tools/AudioPlayer/store/createLevelsStore.ts +37 -0
- package/src/tools/AudioPlayer/store/index.ts +16 -0
- package/src/tools/AudioPlayer/store/preferencesStore.ts +104 -0
- package/src/tools/AudioPlayer/styles/webview-safe.css +77 -0
- package/src/tools/AudioPlayer/types.ts +95 -0
- package/src/tools/AudioPlayer/utils/bucketize.ts +27 -0
- package/src/tools/AudioPlayer/utils/clamp.ts +5 -0
- package/src/tools/AudioPlayer/utils/dpr.ts +19 -0
- package/src/tools/AudioPlayer/utils/formatTime.ts +12 -8
- package/src/tools/AudioPlayer/utils/index.ts +4 -5
- package/src/tools/AudioPlayer/utils/readCssVar.ts +7 -0
- package/src/tools/AudioPlayer/utils/resolveCanvasColor.ts +28 -0
- package/src/tools/index.ts +5 -75
- package/dist/chunk-2QY3LJR6.mjs.map +0 -1
- package/dist/chunk-6HNAPVZ2.mjs.map +0 -1
- package/dist/chunk-CXVGN6ZW.cjs.map +0 -1
- package/dist/chunk-F2N7P5XU.cjs +0 -30
- package/dist/chunk-F2N7P5XU.cjs.map +0 -1
- package/dist/chunk-FYLR232K.cjs.map +0 -1
- package/dist/chunk-HMHIVEMS.mjs +0 -1619
- package/dist/chunk-HMHIVEMS.mjs.map +0 -1
- package/dist/chunk-JWB2EWQO.mjs +0 -5
- package/dist/chunk-JWB2EWQO.mjs.map +0 -1
- package/dist/chunk-YZX6FH3H.cjs +0 -1656
- package/dist/chunk-YZX6FH3H.cjs.map +0 -1
- package/dist/components-3RTH76CV.cjs +0 -27
- package/dist/components-5GVVL2Q6.mjs +0 -5
- package/dist/components-CPHOUQ5F.cjs +0 -46
- package/dist/components-CPHOUQ5F.cjs.map +0 -1
- package/dist/components-OTK43IMD.mjs +0 -6
- package/dist/components-OTK43IMD.mjs.map +0 -1
- package/src/tools/AudioPlayer/components/HybridAudioPlayer.tsx +0 -225
- package/src/tools/AudioPlayer/components/HybridCompactPlayer.tsx +0 -163
- package/src/tools/AudioPlayer/components/HybridSimplePlayer.tsx +0 -284
- package/src/tools/AudioPlayer/components/HybridWaveform.tsx +0 -286
- package/src/tools/AudioPlayer/components/ReactiveCover/AudioReactiveCover.tsx +0 -151
- package/src/tools/AudioPlayer/components/ReactiveCover/effects/GlowEffect.tsx +0 -110
- package/src/tools/AudioPlayer/components/ReactiveCover/effects/MeshEffect.tsx +0 -58
- package/src/tools/AudioPlayer/components/ReactiveCover/effects/OrbsEffect.tsx +0 -45
- package/src/tools/AudioPlayer/components/ReactiveCover/effects/SpotlightEffect.tsx +0 -82
- package/src/tools/AudioPlayer/components/ReactiveCover/effects/index.ts +0 -8
- package/src/tools/AudioPlayer/components/ReactiveCover/index.ts +0 -6
- package/src/tools/AudioPlayer/components/index.ts +0 -23
- package/src/tools/AudioPlayer/context/HybridAudioProvider.tsx +0 -158
- package/src/tools/AudioPlayer/effects/index.ts +0 -412
- package/src/tools/AudioPlayer/hooks/useAudioBus.ts +0 -76
- package/src/tools/AudioPlayer/hooks/useHybridAudio.ts +0 -403
- package/src/tools/AudioPlayer/hooks/useHybridAudioAnalysis.ts +0 -96
- package/src/tools/AudioPlayer/hooks/useVisualization.tsx +0 -207
- package/src/tools/AudioPlayer/types/effects.ts +0 -73
- package/src/tools/AudioPlayer/types/index.ts +0 -27
- package/src/tools/AudioPlayer/utils/debug.ts +0 -14
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/AudioPlayer/audio/audioContext.ts","../src/tools/AudioPlayer/utils/bucketize.ts","../src/tools/AudioPlayer/audio/decodePeaks.ts","../src/tools/AudioPlayer/audio/peaksCache.ts","../src/tools/AudioPlayer/store/activePlayerBus.ts","../src/tools/AudioPlayer/store/createLevelsStore.ts","../src/tools/AudioPlayer/store/preferencesStore.ts","../src/tools/AudioPlayer/utils/clamp.ts","../src/tools/AudioPlayer/context/AudioRefContext.tsx","../src/tools/AudioPlayer/context/ControlsContext.tsx","../src/tools/AudioPlayer/context/LevelsContext.tsx","../src/tools/AudioPlayer/context/MetaContext.tsx","../src/tools/AudioPlayer/context/StateContext.tsx","../src/tools/AudioPlayer/hooks/useAudioElementEvents.ts","../src/tools/AudioPlayer/context/PlayerProvider.tsx","../src/tools/AudioPlayer/context/selectors.ts","../src/tools/AudioPlayer/hooks/useResizeObserver.ts","../src/tools/AudioPlayer/hooks/useKeyboardShortcuts.ts","../src/tools/AudioPlayer/hooks/useMediaSession.ts","../src/tools/AudioPlayer/parts/Controls/PlayButton.tsx","../src/tools/AudioPlayer/parts/Controls/IconButton.tsx","../src/tools/AudioPlayer/parts/Controls/SkipButton.tsx","../src/tools/AudioPlayer/parts/Controls/LoopButton.tsx","../src/tools/AudioPlayer/parts/Controls/VolumeControl.tsx","../src/tools/AudioPlayer/utils/formatTime.ts","../src/tools/AudioPlayer/parts/Meta/TimeDisplay.tsx","../src/tools/AudioPlayer/parts/Controls/ControlsRow.tsx","../src/tools/AudioPlayer/parts/Cover/CoverPlaceholder.tsx","../src/tools/AudioPlayer/parts/Cover/Cover.tsx","../src/tools/AudioPlayer/parts/Cover/ReactivePulse.tsx","../src/tools/AudioPlayer/parts/ErrorState/ErrorState.tsx","../src/tools/AudioPlayer/parts/Meta/Title.tsx","../src/tools/AudioPlayer/parts/Meta/Artist.tsx","../src/tools/AudioPlayer/hooks/usePeaks.ts","../src/tools/AudioPlayer/parts/Waveform/BarsWaveform.tsx","../src/tools/AudioPlayer/audio/mediaElementSourceCache.ts","../src/tools/AudioPlayer/hooks/useAnalyser.ts","../src/tools/AudioPlayer/parts/Waveform/waveformInteraction.ts","../src/tools/AudioPlayer/utils/dpr.ts","../src/tools/AudioPlayer/parts/Waveform/waveformRenderer.ts","../src/tools/AudioPlayer/parts/Waveform/LiveWaveform.tsx","../src/tools/AudioPlayer/hooks/usePlayheadLoop.ts","../src/tools/AudioPlayer/hooks/useThemeWatcher.ts","../src/tools/AudioPlayer/parts/Waveform/PeaksWaveform.tsx","../src/tools/AudioPlayer/parts/Waveform/ProgressBar.tsx","../src/tools/AudioPlayer/parts/Waveform/WaveformSkeleton.tsx","../src/tools/AudioPlayer/parts/Waveform/Waveform.tsx","../src/tools/AudioPlayer/parts/Layout/DefaultLayout.tsx","../src/tools/AudioPlayer/parts/Layout/CompactLayout.tsx","../src/tools/AudioPlayer/PlayerShell.tsx","../src/tools/AudioPlayer/Player.tsx"],"names":["__name","channel","listeners","createContext","cached","useSyncExternalStore","useId","useState","useEffect","useRef","useMemo","jsx","useContext","useHotkey","useCallback","Play","LoaderCircle","Pause","RotateCcw","Tooltip","TooltipTrigger","TooltipContent","jsxs","SkipBack","SkipForward","Repeat","useMediaQuery","VolumeX","Volume2","Music","AlertTriangle","cache","READ_INTERVAL_MS","useThemeColor","alpha","VAR","useIsPhone","useImperativeHandle","TooltipProvider","forwardRef","Player"],"mappings":"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","file":"chunk-ZLQHUZDU.cjs","sourcesContent":["// Singleton AudioContext for the whole tab.\n// See ADR-004. Never closed during normal operation.\n\nlet _ctx: AudioContext | null = null;\n\ntype WebkitWindow = typeof window & {\n webkitAudioContext?: typeof AudioContext;\n};\n\nexport function getAudioContext(): AudioContext {\n if (_ctx) return _ctx;\n const w = window as WebkitWindow;\n const Ctor = w.AudioContext ?? w.webkitAudioContext;\n if (!Ctor) {\n throw new Error('Web Audio API is not supported in this environment');\n }\n _ctx = new Ctor({ latencyHint: 'interactive' });\n return _ctx;\n}\n\nexport async function unlockAudioContext(): Promise<void> {\n const ctx = getAudioContext();\n if (ctx.state === 'suspended') {\n try {\n await ctx.resume();\n } catch {\n // Resume requires a user gesture; caller should retry from one.\n }\n }\n}\n\nexport function isAudioContextRunning(): boolean {\n return _ctx?.state === 'running';\n}\n\n// Test-only: drop the singleton between test cases.\nexport function _resetAudioContextForTesting(): void {\n _ctx = null;\n}\n","// Reduce an audio channel down to `buckets` peak amplitude samples in [0, 1].\n// Used by decodePeaks; pure.\n\nexport function bucketize(channel: Float32Array, buckets: number): Float32Array {\n const out = new Float32Array(buckets);\n if (buckets <= 0 || channel.length === 0) return out;\n const samplesPerBucket = Math.max(1, Math.floor(channel.length / buckets));\n let peakMax = 0;\n for (let b = 0; b < buckets; b++) {\n const start = b * samplesPerBucket;\n const end = Math.min(start + samplesPerBucket, channel.length);\n let max = 0;\n for (let i = start; i < end; i++) {\n const v = channel[i];\n const abs = v < 0 ? -v : v;\n if (abs > max) max = abs;\n }\n out[b] = max;\n if (max > peakMax) peakMax = max;\n }\n // Normalize so the loudest bucket reaches 1.0 — keeps quiet tracks visible.\n if (peakMax > 0 && peakMax < 1) {\n const scale = 1 / peakMax;\n for (let i = 0; i < out.length; i++) out[i] *= scale;\n }\n return out;\n}\n","// fetch + OfflineAudioContext + bucketize. See ADR-002 / research 02.\n// Uses a low-sample-rate mono context to keep memory bounded.\n\nimport { bucketize } from '../utils/bucketize';\n\nconst SAMPLE_RATE = 22_050;\nconst DEFAULT_BUCKETS = 1800;\n\ntype WebkitWindow = typeof window & {\n webkitOfflineAudioContext?: typeof OfflineAudioContext;\n};\n\nfunction getOfflineCtor(): typeof OfflineAudioContext {\n const w = window as WebkitWindow;\n const Ctor = w.OfflineAudioContext ?? w.webkitOfflineAudioContext;\n if (!Ctor) throw new Error('OfflineAudioContext is not supported');\n return Ctor;\n}\n\nexport async function decodePeaks(\n src: string,\n buckets: number = DEFAULT_BUCKETS,\n signal?: AbortSignal,\n): Promise<Float32Array> {\n const response = await fetch(src, { signal, credentials: 'same-origin' });\n if (!response.ok) {\n throw new Error(`Failed to fetch audio for peaks (${response.status})`);\n }\n const arr = await response.arrayBuffer();\n const Ctor = getOfflineCtor();\n // Length must be ≥ 1; the actual length doesn't matter for decodeAudioData.\n const ctx = new Ctor(1, 1, SAMPLE_RATE);\n const audio = await ctx.decodeAudioData(arr);\n const channel = audio.getChannelData(0);\n return bucketize(channel, buckets);\n}\n","// Module-level peaks cache. Dedupes in-flight decodes; caches resolved buffers.\n// See ADR-002.\n\nimport { decodePeaks } from './decodePeaks';\n\nconst cache = new Map<string, Float32Array>();\nconst inflight = new Map<string, Promise<Float32Array>>();\n\nexport async function getPeaks(src: string, buckets?: number): Promise<Float32Array> {\n const hit = cache.get(src);\n if (hit) return hit;\n const flying = inflight.get(src);\n if (flying) return flying;\n const promise = decodePeaks(src, buckets).then((peaks) => {\n cache.set(src, peaks);\n return peaks;\n });\n inflight.set(src, promise);\n try {\n return await promise;\n } finally {\n inflight.delete(src);\n }\n}\n\nexport function setPeaks(src: string, peaks: Float32Array): void {\n cache.set(src, peaks);\n}\n\nexport function getPeaksFromCache(src: string): Float32Array | undefined {\n return cache.get(src);\n}\n\nexport function clearPeaksCache(src?: string): void {\n if (src) cache.delete(src);\n else cache.clear();\n}\n","// Single-active-player coordination, with optional cross-tab sync.\n// Each Player instance registers an id and a `pause()` callback. When another\n// player becomes active, all others get paused. Cross-tab via BroadcastChannel.\n\nconst CHANNEL = 'djangocfg-audioplayer:active';\n\ntype Listener = (activeId: string | null) => void;\n\nlet activeId: string | null = null;\nlet lastActiveId: string | null = null;\nconst listeners = new Set<Listener>();\nconst pausers = new Map<string, () => void>();\n\nlet channel: BroadcastChannel | null = null;\nfunction getChannel(): BroadcastChannel | null {\n if (typeof BroadcastChannel === 'undefined') return null;\n if (channel) return channel;\n channel = new BroadcastChannel(CHANNEL);\n channel.addEventListener('message', (e) => {\n const next = typeof e.data === 'string' ? e.data : null;\n if (next === activeId) return;\n activeId = next;\n if (next) lastActiveId = next;\n for (const [id, pause] of pausers) {\n if (id !== next) pause();\n }\n for (const l of listeners) l(next);\n });\n return channel;\n}\n\nexport function registerPlayer(id: string, pause: () => void): () => void {\n pausers.set(id, pause);\n return () => {\n pausers.delete(id);\n if (activeId === id) activeId = null;\n };\n}\n\nexport function setActivePlayer(id: string | null): void {\n if (activeId === id) return;\n activeId = id;\n if (id) lastActiveId = id;\n for (const [pid, pause] of pausers) {\n if (pid !== id) pause();\n }\n for (const l of listeners) l(id);\n getChannel()?.postMessage(id);\n}\n\nexport function getActivePlayer(): string | null {\n return activeId;\n}\n\nexport function getLastActivePlayer(): string | null {\n return lastActiveId;\n}\n\nexport function subscribeActivePlayer(cb: Listener): () => void {\n listeners.add(cb);\n getChannel(); // ensure channel hot\n return () => listeners.delete(cb);\n}\n","// Imperative store for high-frequency audio levels.\n// React never re-renders on `set()`; consumers read via getCurrent() in their\n// own rAF (typically the live waveform canvas). See ADR-001 §LevelsCtx.\n\nexport type LevelsStore = {\n subscribe: (cb: () => void) => () => void;\n getCurrent: () => Float32Array;\n set: (next: Float32Array) => void;\n setActive: (active: boolean) => void;\n isActive: () => boolean;\n};\n\nexport function createLevelsStore(initial?: Float32Array): LevelsStore {\n let current = initial ?? new Float32Array(0);\n let active = false;\n const listeners = new Set<() => void>();\n\n return {\n subscribe(cb) {\n listeners.add(cb);\n return () => listeners.delete(cb);\n },\n getCurrent() {\n return current;\n },\n set(next) {\n current = next;\n for (const cb of listeners) cb();\n },\n setActive(value) {\n active = value;\n },\n isActive() {\n return active;\n },\n };\n}\n","// Persistent user preferences (volume, muted). Single localStorage entry,\n// cross-tab sync via the native `storage` event. SSR-safe.\n//\n// Why not Zustand: two fields. Adding a dep + persist middleware is overkill\n// for ~50 LOC of plain code that already matches the activePlayerBus pattern.\n\nconst STORAGE_KEY = 'djangocfg-audioplayer:prefs';\nconst DEFAULT_VOLUME = 1;\nconst DEFAULT_MUTED = false;\n\nexport type PlayerPreferences = {\n volume: number;\n muted: boolean;\n};\n\ntype Listener = (prefs: PlayerPreferences) => void;\n\nlet cached: PlayerPreferences | null = null;\nconst listeners = new Set<Listener>();\nlet storageBound = false;\n\nfunction clamp01(v: number): number {\n if (!Number.isFinite(v)) return DEFAULT_VOLUME;\n return v < 0 ? 0 : v > 1 ? 1 : v;\n}\n\nfunction readFromStorage(): PlayerPreferences {\n if (typeof window === 'undefined') {\n return { volume: DEFAULT_VOLUME, muted: DEFAULT_MUTED };\n }\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (!raw) return { volume: DEFAULT_VOLUME, muted: DEFAULT_MUTED };\n const parsed = JSON.parse(raw) as Partial<PlayerPreferences> | null;\n return {\n volume: typeof parsed?.volume === 'number' ? clamp01(parsed.volume) : DEFAULT_VOLUME,\n muted: typeof parsed?.muted === 'boolean' ? parsed.muted : DEFAULT_MUTED,\n };\n } catch {\n return { volume: DEFAULT_VOLUME, muted: DEFAULT_MUTED };\n }\n}\n\nfunction writeToStorage(prefs: PlayerPreferences): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(prefs));\n } catch {\n // quota exceeded / disabled — silently ignore.\n }\n}\n\nfunction bindStorage(): void {\n if (storageBound || typeof window === 'undefined') return;\n storageBound = true;\n window.addEventListener('storage', (e) => {\n if (e.key !== STORAGE_KEY) return;\n cached = readFromStorage();\n for (const cb of listeners) cb(cached);\n });\n}\n\nexport function getPreferences(): PlayerPreferences {\n if (!cached) cached = readFromStorage();\n bindStorage();\n return cached;\n}\n\nfunction update(next: PlayerPreferences, persist = true): void {\n cached = next;\n if (persist) writeToStorage(next);\n for (const cb of listeners) cb(next);\n}\n\nexport function setStoredVolume(volume: number): void {\n const current = getPreferences();\n const v = clamp01(volume);\n if (v === current.volume) return;\n update({ ...current, volume: v });\n}\n\nexport function setStoredMuted(muted: boolean): void {\n const current = getPreferences();\n if (muted === current.muted) return;\n update({ ...current, muted });\n}\n\nexport function subscribePreferences(cb: Listener): () => void {\n listeners.add(cb);\n bindStorage();\n return () => listeners.delete(cb);\n}\n\n// Test-only.\nexport function _resetPreferencesForTesting(): void {\n cached = null;\n if (typeof window !== 'undefined') {\n try {\n window.localStorage.removeItem(STORAGE_KEY);\n } catch {\n // ignore\n }\n }\n}\n","export function clamp(value: number, min: number, max: number): number {\n if (value < min) return min;\n if (value > max) return max;\n return value;\n}\n","'use client';\n\nimport { createContext } from 'react';\n\n// The persistent <audio> element. Components that need imperative access\n// (TimeDisplay, Waveform playhead, click-to-seek) read this — not the React\n// state — to avoid coupling per-frame work to renders.\nexport const AudioRefCtx = createContext<HTMLAudioElement | null>(null);\nAudioRefCtx.displayName = 'AudioPlayerAudioRefCtx';\n","'use client';\n\nimport { createContext } from 'react';\nimport type { PlayerControls } from '../types';\n\nexport const ControlsCtx = createContext<PlayerControls | null>(null);\nControlsCtx.displayName = 'AudioPlayerControlsCtx';\n","'use client';\n\nimport { createContext } from 'react';\nimport type { LevelsStore } from '../store';\n\nexport const LevelsCtx = createContext<LevelsStore | null>(null);\nLevelsCtx.displayName = 'AudioPlayerLevelsCtx';\n","'use client';\n\nimport { createContext } from 'react';\n\nexport type PlayerMeta = {\n src: string;\n title?: string;\n artist?: string;\n album?: string;\n cover?: string;\n hasPrev: boolean;\n hasNext: boolean;\n};\n\nexport const MetaCtx = createContext<PlayerMeta | null>(null);\nMetaCtx.displayName = 'AudioPlayerMetaCtx';\n","'use client';\n\nimport { createContext } from 'react';\nimport type { PlayerState } from '../types';\n\nexport const StateCtx = createContext<PlayerState | null>(null);\nStateCtx.displayName = 'AudioPlayerStateCtx';\n","// useSyncExternalStore over a low-frequency set of HTMLAudioElement events.\n// Snapshot is cached; consumers only re-render when one of the tracked fields\n// actually changes (Object.is on the snapshot). See ADR-001 / research 03 §2.\n\nimport { useSyncExternalStore } from 'react';\nimport type { PlayerErrorReason, PlayerState, PlayerStateKind } from '../types';\n\nconst TRACKED = [\n 'play',\n 'pause',\n 'ended',\n 'loadedmetadata',\n 'durationchange',\n 'emptied',\n 'waiting',\n 'canplay',\n 'error',\n] as const;\n\ntype Snapshot = {\n paused: boolean;\n ended: boolean;\n duration: number;\n ready: boolean;\n errorCode: number | null;\n};\n\nfunction readSnapshot(audio: HTMLAudioElement): Snapshot {\n return {\n paused: audio.paused,\n ended: audio.ended,\n duration: Number.isFinite(audio.duration) ? audio.duration : 0,\n ready: audio.readyState >= 2,\n errorCode: audio.error?.code ?? null,\n };\n}\n\nfunction snapshotsEqual(a: Snapshot, b: Snapshot): boolean {\n return (\n a.paused === b.paused &&\n a.ended === b.ended &&\n a.duration === b.duration &&\n a.ready === b.ready &&\n a.errorCode === b.errorCode\n );\n}\n\nexport function createAudioSnapshotSource(audio: HTMLAudioElement) {\n let cached: Snapshot = readSnapshot(audio);\n return {\n subscribe(cb: () => void): () => void {\n const refresh = () => {\n const next = readSnapshot(audio);\n if (!snapshotsEqual(cached, next)) {\n cached = next;\n cb();\n }\n };\n for (const e of TRACKED) audio.addEventListener(e, refresh);\n return () => {\n for (const e of TRACKED) audio.removeEventListener(e, refresh);\n };\n },\n getSnapshot(): Snapshot {\n return cached;\n },\n getServerSnapshot(): Snapshot {\n return cached;\n },\n };\n}\n\nfunction errorCodeToReason(code: number | null): PlayerErrorReason {\n // MediaError codes: 1 ABORT, 2 NETWORK, 3 DECODE, 4 SRC_NOT_SUPPORTED.\n if (code === 2) return 'network';\n if (code === 3) return 'decode';\n if (code === 4) return 'unsupported';\n return 'unknown';\n}\n\nfunction snapshotToState(snap: Snapshot, hasSrc: boolean, peaks?: Float32Array): PlayerState {\n if (snap.errorCode !== null) {\n return { kind: 'error', reason: errorCodeToReason(snap.errorCode), duration: snap.duration };\n }\n if (!hasSrc) return { kind: 'idle' };\n if (!snap.ready) return { kind: 'loading' };\n const kind: PlayerStateKind = snap.ended\n ? 'ended'\n : snap.paused\n ? 'paused'\n : 'playing';\n return { kind, duration: snap.duration, peaks };\n}\n\nexport function useAudioElementState(\n source: ReturnType<typeof createAudioSnapshotSource>,\n hasSrc: boolean,\n peaks?: Float32Array,\n): PlayerState {\n const snap = useSyncExternalStore(source.subscribe, source.getSnapshot, source.getServerSnapshot);\n return snapshotToState(snap, hasSrc, peaks);\n}\n","'use client';\n\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { unlockAudioContext } from '../audio/audioContext';\nimport { getPeaksFromCache, setPeaks } from '../audio/peaksCache';\nimport { registerPlayer, setActivePlayer } from '../store/activePlayerBus';\nimport { createLevelsStore } from '../store/createLevelsStore';\nimport type { LevelsStore } from '../store/createLevelsStore';\nimport {\n getPreferences,\n setStoredMuted,\n setStoredVolume,\n subscribePreferences,\n} from '../store/preferencesStore';\nimport { clamp } from '../utils/clamp';\nimport type { PlayerControls, PlayerErrorReason } from '../types';\nimport { AudioRefCtx } from './AudioRefContext';\nimport { ControlsCtx } from './ControlsContext';\nimport { LevelsCtx } from './LevelsContext';\nimport { MetaCtx, type PlayerMeta } from './MetaContext';\nimport { StateCtx } from './StateContext';\nimport { createAudioSnapshotSource, useAudioElementState } from '../hooks/useAudioElementEvents';\n\nexport type PlayerProviderProps = {\n src: string;\n peaks?: Float32Array;\n title?: string;\n artist?: string;\n album?: string;\n cover?: string;\n autoplay?: boolean;\n loop?: boolean;\n initialVolume?: number;\n muted?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n exclusive?: boolean;\n onPrev?: () => void;\n onNext?: () => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onError?: (reason: PlayerErrorReason, e: unknown) => void;\n children: ReactNode;\n};\n\nfunction createAudioElement(): HTMLAudioElement {\n const a = new Audio();\n a.crossOrigin = 'anonymous';\n a.preload = 'metadata';\n return a;\n}\n\nexport function PlayerProvider(props: PlayerProviderProps) {\n const {\n src,\n peaks: peaksProp,\n title,\n artist,\n album,\n cover,\n autoplay = false,\n loop = false,\n initialVolume,\n muted: mutedProp,\n preload = 'metadata',\n exclusive = true,\n onPrev,\n onNext,\n onPlay,\n onPause,\n onEnded,\n onError,\n children,\n } = props;\n\n // Explicit props win and opt the player out of the persisted preference sync.\n // Otherwise we read defaults from the shared store and stay subscribed so a\n // change in one player is reflected in every other player on the page.\n const volumeIsControlled = initialVolume !== undefined;\n const mutedIsControlled = mutedProp !== undefined;\n\n const playerId = useId();\n\n // <audio>, snapshot source, levels store — created exactly once per\n // component instance via useState lazy initializer (StrictMode-safe: the\n // initializer runs once even though render runs twice).\n const [audio] = useState<HTMLAudioElement>(createAudioElement);\n const [source] = useState(() => createAudioSnapshotSource(audio));\n const [levelsStore] = useState<LevelsStore>(() => createLevelsStore());\n\n // Seed peaks-from-prop into the module cache so other consumers benefit too.\n if (peaksProp && getPeaksFromCache(src) === undefined) {\n setPeaks(src, peaksProp);\n }\n const initialPeaks = peaksProp ?? getPeaksFromCache(src);\n const [activePeaks, setActivePeaks] = useState<Float32Array | undefined>(initialPeaks);\n\n // Apply src / preload / loop / volume / muted imperatively.\n useEffect(() => {\n if (audio.src !== src) {\n audio.src = src;\n audio.load();\n }\n }, [audio, src]);\n\n useEffect(() => {\n audio.preload = preload;\n }, [audio, preload]);\n\n useEffect(() => {\n audio.loop = loop;\n }, [audio, loop]);\n\n // Initial volume / muted: prop > stored > defaults.\n useEffect(() => {\n const stored = getPreferences();\n audio.volume = clamp(volumeIsControlled ? (initialVolume as number) : stored.volume, 0, 1);\n audio.muted = mutedIsControlled ? Boolean(mutedProp) : stored.muted;\n // Run once at mount; later updates flow through the subscription below\n // (or, for controlled players, through the prop effects).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [audio]);\n\n // Re-apply when controlled props change explicitly.\n useEffect(() => {\n if (!volumeIsControlled || initialVolume === undefined) return;\n audio.volume = clamp(initialVolume, 0, 1);\n }, [audio, volumeIsControlled, initialVolume]);\n\n useEffect(() => {\n if (!mutedIsControlled || mutedProp === undefined) return;\n audio.muted = mutedProp;\n }, [audio, mutedIsControlled, mutedProp]);\n\n // Subscribe uncontrolled players to the shared preferences store so they\n // stay in sync with each other and across tabs.\n useEffect(() => {\n if (volumeIsControlled && mutedIsControlled) return;\n return subscribePreferences((prefs) => {\n if (!volumeIsControlled && audio.volume !== prefs.volume) {\n audio.volume = prefs.volume;\n }\n if (!mutedIsControlled && audio.muted !== prefs.muted) {\n audio.muted = prefs.muted;\n }\n });\n }, [audio, volumeIsControlled, mutedIsControlled]);\n\n // When src changes, swap in cached peaks if available; clear otherwise.\n useEffect(() => {\n setActivePeaks(getPeaksFromCache(src));\n }, [src]);\n\n // Lifecycle event hooks.\n useEffect(() => {\n const handlePlay = () => onPlay?.();\n const handlePause = () => onPause?.();\n const handleEnded = () => onEnded?.();\n const handleError = (e: Event) => {\n const code = audio.error?.code ?? null;\n const reason: PlayerErrorReason =\n code === 2 ? 'network' : code === 3 ? 'decode' : code === 4 ? 'unsupported' : 'unknown';\n onError?.(reason, e);\n };\n audio.addEventListener('play', handlePlay);\n audio.addEventListener('pause', handlePause);\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('error', handleError);\n return () => {\n audio.removeEventListener('play', handlePlay);\n audio.removeEventListener('pause', handlePause);\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('error', handleError);\n };\n }, [audio, onEnded, onError, onPause, onPlay]);\n\n // Refs let controls.play() claim the active slot immediately, without\n // re-memoizing on every prop change.\n const exclusiveRef = useRef(exclusive);\n exclusiveRef.current = exclusive;\n const playerIdRef = useRef(playerId);\n playerIdRef.current = playerId;\n\n // Single-active-player coordination.\n useEffect(() => {\n if (!exclusive) return;\n const unregister = registerPlayer(playerId, () => {\n audio.pause();\n });\n // Backstop: claim the slot whenever the element starts playing, even if\n // playback was triggered outside our controls (MediaSession, native UI).\n const onPlayHandler = () => setActivePlayer(playerId);\n audio.addEventListener('play', onPlayHandler);\n return () => {\n audio.removeEventListener('play', onPlayHandler);\n unregister();\n };\n }, [audio, exclusive, playerId]);\n\n // Hard cleanup on unmount: stop playback, release the network buffer.\n // The element + cached MediaElementSourceNode are GC'd together via the\n // WeakMap. In StrictMode (dev) the first mount-then-unmount pair fires this\n // immediately, so the discarded audio never keeps playing in the background.\n useEffect(() => {\n return () => {\n try {\n audio.pause();\n audio.removeAttribute('src');\n audio.load();\n } catch {\n // ignore\n }\n };\n }, [audio]);\n\n // Controls — memoized once. Functions close over `audio` (stable ref).\n const controls = useMemo<PlayerControls>(() => {\n const playFn = async () => {\n // Claim the active slot synchronously so siblings get paused before our\n // audio.play() resolves. Backstop listener on `play` event covers\n // playback started outside this function.\n if (exclusiveRef.current) setActivePlayer(playerIdRef.current);\n try {\n await unlockAudioContext();\n } catch {\n // ignored — playback may still work without AudioContext.\n }\n try {\n await audio.play();\n } catch (e) {\n // Caller decides; surface via onError when it's a real failure.\n const isAbort = e instanceof DOMException && e.name === 'AbortError';\n if (!isAbort) onError?.('unknown', e);\n }\n };\n const pauseFn = () => {\n audio.pause();\n };\n return {\n play: playFn,\n pause: pauseFn,\n toggle: async () => {\n if (audio.paused || audio.ended) await playFn();\n else pauseFn();\n },\n seek: (seconds: number) => {\n if (!Number.isFinite(seconds)) return;\n const dur = Number.isFinite(audio.duration) ? audio.duration : 0;\n audio.currentTime = clamp(seconds, 0, dur || seconds);\n },\n seekTo: (ratio: number) => {\n const r = clamp(ratio, 0, 1);\n const dur = Number.isFinite(audio.duration) ? audio.duration : 0;\n if (dur > 0) audio.currentTime = r * dur;\n },\n setVolume: (v: number) => {\n const next = clamp(v, 0, 1);\n audio.volume = next;\n if (next > 0 && audio.muted) audio.muted = false;\n if (!volumeIsControlled) setStoredVolume(next);\n if (!mutedIsControlled && next > 0) setStoredMuted(false);\n },\n toggleMute: () => {\n const next = !audio.muted;\n audio.muted = next;\n if (!mutedIsControlled) setStoredMuted(next);\n },\n toggleLoop: () => {\n audio.loop = !audio.loop;\n },\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [audio, volumeIsControlled, mutedIsControlled]);\n\n // Autoplay attempt (best-effort; suspended context will reject silently).\n useEffect(() => {\n if (!autoplay) return;\n void controls.play();\n }, [autoplay, controls]);\n\n const state = useAudioElementState(source, Boolean(audio.src), activePeaks);\n\n const meta = useMemo<PlayerMeta>(\n () => ({\n src,\n title,\n artist,\n album,\n cover,\n hasPrev: Boolean(onPrev),\n hasNext: Boolean(onNext),\n }),\n [src, title, artist, album, cover, onPrev, onNext],\n );\n\n return (\n <AudioRefCtx.Provider value={audio}>\n <MetaCtx.Provider value={meta}>\n <StateCtx.Provider value={state}>\n <ControlsCtx.Provider value={controls}>\n <LevelsCtx.Provider value={levelsStore}>{children}</LevelsCtx.Provider>\n </ControlsCtx.Provider>\n </StateCtx.Provider>\n </MetaCtx.Provider>\n </AudioRefCtx.Provider>\n );\n}\n\n// Internal helper for parts that want to expose peaks-update from the lazy hook.\nexport function usePeaksSetter() {\n // The provider seeds peaks via setPeaks() in the module cache; consumers\n // re-read on src change. usePeaks hook re-uses the cache directly.\n}\n","'use client';\n\nimport { useContext } from 'react';\nimport type { Context } from 'react';\nimport type { LevelsStore } from '../store';\nimport type { PlayerControls, PlayerState } from '../types';\nimport { AudioRefCtx } from './AudioRefContext';\nimport { ControlsCtx } from './ControlsContext';\nimport { LevelsCtx } from './LevelsContext';\nimport { MetaCtx, type PlayerMeta } from './MetaContext';\nimport { StateCtx } from './StateContext';\n\nfunction useCtxOrThrow<T>(ctx: Context<T | null>, name: string): T {\n const value = useContext(ctx);\n if (value === null) {\n throw new Error(`${name} must be used inside <PlayerProvider>`);\n }\n return value;\n}\n\nexport const usePlayerState = (): PlayerState => useCtxOrThrow(StateCtx, 'usePlayerState');\nexport const usePlayerControls = (): PlayerControls => useCtxOrThrow(ControlsCtx, 'usePlayerControls');\nexport const usePlayerLevels = (): LevelsStore => useCtxOrThrow(LevelsCtx, 'usePlayerLevels');\nexport const usePlayerMeta = (): PlayerMeta => useCtxOrThrow(MetaCtx, 'usePlayerMeta');\nexport const usePlayerAudio = (): HTMLAudioElement => useCtxOrThrow(AudioRefCtx, 'usePlayerAudio');\n\n// Narrow slices.\nexport const usePlayerPaused = (): boolean => {\n const s = usePlayerState();\n return s.kind !== 'playing';\n};\n\nexport const usePlayerDuration = (): number => {\n const s = usePlayerState();\n return 'duration' in s ? s.duration : 0;\n};\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nexport function useElementWidth(el: HTMLElement | null): number {\n const [w, setW] = useState(0);\n useEffect(() => {\n if (!el || typeof ResizeObserver === 'undefined') return;\n setW(el.clientWidth);\n const obs = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const next = entry.contentRect.width;\n setW((prev) => (Math.abs(prev - next) < 0.5 ? prev : next));\n }\n });\n obs.observe(el);\n return () => obs.disconnect();\n }, [el]);\n return w;\n}\n","'use client';\n\n// Player keyboard shortcuts via ui-core's useHotkey (react-hotkeys-hook).\n//\n// Idiomatic pattern: each useHotkey call returns a callback ref that scopes\n// the binding to the element it's attached to. We compose all of them into\n// one ref and hand it to the player container. Library handles focus gating;\n// no manual `document.activeElement` polling, no `data-scope` juggling.\n\nimport { useCallback } from 'react';\nimport { useHotkey } from '@djangocfg/ui-core/hooks';\nimport { clamp } from '../utils/clamp';\nimport type { PlayerControls } from '../types';\n\nexport type HotkeyBinding = {\n /** Human label for help dialogs and tooltips. */\n label: string;\n /** Pretty hint shown to users (e.g. \"Space\", \"←\", \"M\"). */\n hint: string;\n};\n\nexport type UseKeyboardShortcutsOptions = {\n audio: HTMLAudioElement;\n controls: PlayerControls;\n enabled?: boolean;\n};\n\nexport type UseKeyboardShortcutsReturn = {\n /** Attach to the player container — react-hotkeys-hook only fires when\n * focus is within this element. Composes with other refs via callback. */\n ref: (instance: HTMLElement | null) => void;\n /** All registered bindings — useful for rendering a help dialog. */\n bindings: ReadonlyArray<HotkeyBinding>;\n};\n\nconst OPTS = { preventDefault: true } as const;\n\nconst BINDINGS: ReadonlyArray<HotkeyBinding> = [\n { label: 'Play / pause', hint: 'Space' },\n { label: 'Seek +5s', hint: '→' },\n { label: 'Seek −5s', hint: '←' },\n { label: 'Volume up', hint: '↑' },\n { label: 'Volume down', hint: '↓' },\n { label: 'Toggle mute', hint: 'M' },\n { label: 'Toggle loop', hint: 'L' },\n];\n\nexport function useKeyboardShortcuts({\n audio,\n controls,\n enabled = true,\n}: UseKeyboardShortcutsOptions): UseKeyboardShortcutsReturn {\n // Each useHotkey returns a callback ref that scopes the binding to its\n // element. We must call them at the top level (rules of hooks).\n const refToggle = useHotkey(['space', 'k'], () => void controls.toggle(), {\n ...OPTS, enabled, description: 'Play / pause',\n });\n const refForward = useHotkey('right', () => controls.seek(audio.currentTime + 5), {\n ...OPTS, enabled, description: 'Seek +5s',\n });\n const refBackward = useHotkey('left', () => controls.seek(audio.currentTime - 5), {\n ...OPTS, enabled, description: 'Seek −5s',\n });\n const refVolUp = useHotkey('up', () => controls.setVolume(clamp(audio.volume + 0.05, 0, 1)), {\n ...OPTS, enabled, description: 'Volume up',\n });\n const refVolDown = useHotkey('down', () => controls.setVolume(clamp(audio.volume - 0.05, 0, 1)), {\n ...OPTS, enabled, description: 'Volume down',\n });\n const refMute = useHotkey('m', () => controls.toggleMute(), {\n ...OPTS, enabled, description: 'Toggle mute',\n });\n const refLoop = useHotkey('l', () => controls.toggleLoop(), {\n ...OPTS, enabled, description: 'Toggle loop',\n });\n\n const ref = useCallback(\n (instance: HTMLElement | null) => {\n refToggle(instance);\n refForward(instance);\n refBackward(instance);\n refVolUp(instance);\n refVolDown(instance);\n refMute(instance);\n refLoop(instance);\n },\n [refToggle, refForward, refBackward, refVolUp, refVolDown, refMute, refLoop],\n );\n\n return { ref, bindings: BINDINGS };\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport type { PlayerControls } from '../types';\nimport type { PlayerMeta } from '../context/MetaContext';\n\nconst ACTIONS: MediaSessionAction[] = [\n 'play',\n 'pause',\n 'previoustrack',\n 'nexttrack',\n 'seekbackward',\n 'seekforward',\n];\n\nexport function useMediaSession(\n audio: HTMLAudioElement,\n meta: PlayerMeta,\n controls: PlayerControls,\n onPrev?: () => void,\n onNext?: () => void,\n): void {\n useEffect(() => {\n if (typeof navigator === 'undefined' || !('mediaSession' in navigator)) return;\n const ms = navigator.mediaSession;\n try {\n ms.metadata = new MediaMetadata({\n title: meta.title ?? '',\n artist: meta.artist ?? '',\n album: meta.album ?? '',\n artwork: meta.cover\n ? [{ src: meta.cover, sizes: '512x512', type: 'image/jpeg' }]\n : [],\n });\n } catch {\n // ignore\n }\n\n const handlers: Partial<Record<MediaSessionAction, MediaSessionActionHandler | null>> = {\n play: () => {\n void controls.play();\n },\n pause: () => controls.pause(),\n previoustrack: onPrev ?? null,\n nexttrack: onNext ?? null,\n seekbackward: (details) => {\n const offset = details.seekOffset ?? 10;\n controls.seek(audio.currentTime - offset);\n },\n seekforward: (details) => {\n const offset = details.seekOffset ?? 10;\n controls.seek(audio.currentTime + offset);\n },\n };\n\n for (const a of ACTIONS) {\n try {\n ms.setActionHandler(a, handlers[a] ?? null);\n } catch {\n // ignore unsupported actions\n }\n }\n\n return () => {\n for (const a of ACTIONS) {\n try {\n ms.setActionHandler(a, null);\n } catch {\n // ignore\n }\n }\n };\n }, [audio, controls, meta.title, meta.artist, meta.album, meta.cover, onPrev, onNext]);\n}\n","'use client';\n\nimport { LoaderCircle, Pause, Play, RotateCcw } from 'lucide-react';\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@djangocfg/ui-core/components';\nimport { usePlayerControls, usePlayerState } from '../../context/selectors';\n\ntype Props = { size?: 'default' | 'compact' };\n\nexport function PlayButton({ size = 'default' }: Props) {\n const state = usePlayerState();\n const { toggle, play } = usePlayerControls();\n\n const dim = size === 'compact' ? 28 : 36;\n const icon = size === 'compact' ? 14 : 16;\n\n let label = 'Play';\n let Icon: React.ComponentType<{ size?: number; strokeWidth?: number; className?: string }> = Play;\n let onClick: () => void = () => void toggle();\n let disabled = false;\n\n switch (state.kind) {\n case 'idle':\n Icon = Play;\n disabled = true;\n break;\n case 'loading':\n case 'decoding':\n Icon = LoaderCircle;\n label = 'Loading';\n disabled = true;\n break;\n case 'playing':\n Icon = Pause;\n label = 'Pause';\n break;\n case 'paused':\n Icon = Play;\n label = 'Play';\n break;\n case 'ended':\n Icon = RotateCcw;\n label = 'Replay';\n onClick = () => void play();\n break;\n case 'error':\n Icon = Play;\n label = 'Retry';\n onClick = () => void play();\n break;\n }\n\n const button = (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={label}\n className=\"audioplayer-press grid place-items-center rounded-full bg-foreground text-background transition-colors hover:bg-foreground/90 disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/60\"\n style={{ width: dim, height: dim }}\n >\n <Icon\n size={icon}\n strokeWidth={2}\n className={state.kind === 'loading' || state.kind === 'decoding' ? 'animate-spin' : ''}\n />\n </button>\n );\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"top\">\n <span className=\"flex items-center gap-1.5\">\n {label}\n <kbd className=\"rounded border border-border/40 bg-muted px-1 font-mono text-[10px] text-muted-foreground\">\n Space\n </kbd>\n </span>\n </TooltipContent>\n </Tooltip>\n );\n}\n","'use client';\n\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@djangocfg/ui-core/components';\n\ntype Props = {\n label: string;\n // Keyboard shortcut hint shown in the tooltip (e.g. \"L\" for loop). Optional.\n shortcut?: string;\n active?: boolean;\n children: ReactNode;\n // Render the button without the tooltip wrapper. Useful for inline contexts\n // (e.g. inside another tooltip / popover) where nesting Radix portals is\n // unnecessary.\n noTooltip?: boolean;\n} & Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'aria-label'>;\n\nexport function IconButton({\n label,\n shortcut,\n active,\n children,\n noTooltip,\n className = '',\n ...rest\n}: Props) {\n // Active state uses a tinted primary surface — readable, on-brand, not loud.\n const stateClasses = active\n ? 'bg-primary/10 text-primary hover:bg-primary/15'\n : 'text-muted-foreground hover:bg-accent hover:text-foreground';\n const button = (\n <button\n type=\"button\"\n aria-label={label}\n aria-pressed={active}\n className={`audioplayer-press grid h-8 w-8 place-items-center rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/60 disabled:opacity-50 disabled:pointer-events-none ${stateClasses} ${className}`}\n {...rest}\n >\n {children}\n </button>\n );\n if (noTooltip) return button;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"top\">\n <span className=\"flex items-center gap-1.5\">\n {label}\n {shortcut && (\n <kbd className=\"rounded border border-border/40 bg-muted px-1 font-mono text-[10px] text-muted-foreground\">\n {shortcut}\n </kbd>\n )}\n </span>\n </TooltipContent>\n </Tooltip>\n );\n}\n","'use client';\n\nimport { SkipBack, SkipForward } from 'lucide-react';\nimport { IconButton } from './IconButton';\n\ntype Props = { direction: 'prev' | 'next'; onClick?: () => void };\n\nexport function SkipButton({ direction, onClick }: Props) {\n if (!onClick) return null;\n const Icon = direction === 'prev' ? SkipBack : SkipForward;\n const label = direction === 'prev' ? 'Previous track' : 'Next track';\n return (\n <IconButton label={label} shortcut={direction === 'prev' ? '←' : '→'} onClick={onClick}>\n <Icon size={16} strokeWidth={1.75} />\n </IconButton>\n );\n}\n","'use client';\n\nimport { Repeat } from 'lucide-react';\nimport { useEffect, useState } from 'react';\nimport { usePlayerAudio, usePlayerControls } from '../../context/selectors';\nimport { IconButton } from './IconButton';\n\nexport function LoopButton() {\n const audio = usePlayerAudio();\n const { toggleLoop } = usePlayerControls();\n const [loop, setLoop] = useState(audio.loop);\n\n useEffect(() => {\n // <audio> doesn't fire an event for loop changes, but our toggleLoop sets\n // the property directly — so we sync via a small mutation observer pattern:\n // poll on click only by reading audio.loop after toggleLoop runs.\n setLoop(audio.loop);\n }, [audio]);\n\n return (\n <IconButton\n label={loop ? 'Disable loop' : 'Enable loop'}\n shortcut=\"L\"\n active={loop}\n onClick={() => {\n toggleLoop();\n setLoop(audio.loop);\n }}\n >\n <Repeat size={16} strokeWidth={1.75} />\n </IconButton>\n );\n}\n","'use client';\n\nimport { Volume2, VolumeX } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport { useMediaQuery } from '@djangocfg/ui-core/hooks';\nimport { usePlayerAudio, usePlayerControls } from '../../context/selectors';\nimport { IconButton } from './IconButton';\n\nconst CLOSE_DELAY_MS = 120;\n\n// `audio.volume` is read-only on iOS Safari (controlled by hardware buttons),\n// so a JS slider does nothing useful there. Detect once at module load.\nfunction isIosSafari(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent;\n const iOS = /iPad|iPhone|iPod/.test(ua) ||\n (navigator.platform === 'MacIntel' && (navigator as { maxTouchPoints?: number }).maxTouchPoints! > 1);\n return iOS;\n}\nconst HIDE_VOLUME = isIosSafari();\n\nexport function VolumeControl() {\n const audio = usePlayerAudio();\n const { setVolume, toggleMute } = usePlayerControls();\n const [volume, setVol] = useState(audio.volume);\n const [muted, setMuted] = useState(audio.muted);\n const [isOpen, setOpen] = useState(false);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Touch devices have no hover — open the popover on click instead.\n const isTouch = useMediaQuery('(hover: none), (pointer: coarse)');\n\n useEffect(() => {\n const sync = () => {\n setVol(audio.volume);\n setMuted(audio.muted);\n };\n audio.addEventListener('volumechange', sync);\n return () => audio.removeEventListener('volumechange', sync);\n }, [audio]);\n\n useEffect(() => {\n return () => {\n if (closeTimer.current) clearTimeout(closeTimer.current);\n };\n }, []);\n\n // Close on outside-click in touch mode.\n const containerRef = useRef<HTMLDivElement | null>(null);\n useEffect(() => {\n if (!isOpen || !isTouch) return;\n const onDown = (e: PointerEvent) => {\n if (!containerRef.current) return;\n if (!containerRef.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('pointerdown', onDown);\n return () => document.removeEventListener('pointerdown', onDown);\n }, [isOpen, isTouch]);\n\n if (HIDE_VOLUME) {\n // iOS Safari can't change volume via JS — keep mute toggle only.\n return (\n <IconButton\n label={muted ? 'Unmute' : 'Mute'}\n shortcut=\"M\"\n active={muted}\n onClick={() => {\n toggleMute();\n setMuted(audio.muted);\n }}\n >\n {muted || volume === 0 ? <VolumeX size={16} strokeWidth={1.75} /> : <Volume2 size={16} strokeWidth={1.75} />}\n </IconButton>\n );\n }\n\n const cancelClose = () => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n };\n const scheduleClose = () => {\n cancelClose();\n closeTimer.current = setTimeout(() => setOpen(false), CLOSE_DELAY_MS);\n };\n const open = () => {\n cancelClose();\n setOpen(true);\n };\n\n const Icon = muted || volume === 0 ? VolumeX : Volume2;\n\n // Hover bindings only apply on devices with real hover. On touch the popover\n // is toggled by the icon click.\n const hoverHandlers = isTouch\n ? {}\n : {\n onPointerEnter: open,\n onPointerLeave: scheduleClose,\n onFocusCapture: open,\n onBlurCapture: (e: React.FocusEvent) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) scheduleClose();\n },\n };\n\n return (\n <div ref={containerRef} className=\"relative\" {...hoverHandlers}>\n <IconButton\n label={isOpen ? 'Close volume' : muted ? 'Unmute' : 'Volume'}\n shortcut={isTouch ? undefined : 'M'}\n active={muted}\n // Inside the popover wrapper — disable IconButton's tooltip when the\n // popover is open (the popover already shows controls; nesting Radix\n // tooltip+popover content fights for focus/dismiss).\n noTooltip={isOpen}\n onClick={() => {\n if (isTouch) {\n setOpen((v) => !v);\n return;\n }\n toggleMute();\n setMuted(audio.muted);\n }}\n >\n <Icon size={16} strokeWidth={1.75} />\n </IconButton>\n {isOpen && (\n <div\n className=\"absolute bottom-full left-1/2 z-20 -translate-x-1/2 pb-2\"\n onPointerEnter={isTouch ? undefined : open}\n onPointerLeave={isTouch ? undefined : scheduleClose}\n >\n <div className=\"flex items-center gap-2 rounded-md border border-border/60 bg-card px-3 py-2 shadow-sm\">\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={muted ? 0 : volume}\n onChange={(e) => {\n const v = parseFloat(e.target.value);\n setVolume(v);\n setVol(v);\n if (v > 0) setMuted(false);\n }}\n className=\"h-1 w-32 appearance-none rounded-full bg-muted accent-foreground\"\n aria-label=\"Volume\"\n />\n <span className=\"w-8 tabular-nums text-right text-[10px] text-muted-foreground\">\n {Math.round((muted ? 0 : volume) * 100)}\n </span>\n {isTouch && (\n <button\n type=\"button\"\n aria-label={muted ? 'Unmute' : 'Mute'}\n className=\"audioplayer-press grid h-7 w-7 place-items-center rounded text-muted-foreground hover:bg-accent\"\n onClick={() => {\n toggleMute();\n setMuted(audio.muted);\n }}\n >\n {muted ? <VolumeX size={14} strokeWidth={1.75} /> : <Volume2 size={14} strokeWidth={1.75} />}\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","// Formats seconds as `m:ss` or `h:mm:ss`. NaN/Infinity → \"0:00\".\nexport function formatTime(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return '0:00';\n const total = Math.floor(seconds);\n const s = total % 60;\n const m = Math.floor(total / 60) % 60;\n const h = Math.floor(total / 3600);\n const ss = s.toString().padStart(2, '0');\n if (h > 0) {\n const mm = m.toString().padStart(2, '0');\n return `${h}:${mm}:${ss}`;\n }\n return `${m}:${ss}`;\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport { usePlayerAudio, usePlayerDuration } from '../../context/selectors';\nimport { formatTime } from '../../utils/formatTime';\n\nconst READ_INTERVAL_MS = 200;\n\nexport function TimeDisplay() {\n const audio = usePlayerAudio();\n const duration = usePlayerDuration();\n const currentRef = useRef<HTMLSpanElement | null>(null);\n\n useEffect(() => {\n const el = currentRef.current;\n if (!el) return;\n let raf = 0;\n let last = -1;\n let timer: ReturnType<typeof setInterval> | null = null;\n const write = () => {\n const t = audio.currentTime;\n if (Math.abs(t - last) < 0.5) return;\n last = t;\n el.textContent = formatTime(t);\n };\n write();\n const onSeek = () => write();\n audio.addEventListener('seeked', onSeek);\n audio.addEventListener('timeupdate', onSeek);\n // Backup poll when timeupdate is throttled (e.g. background tab → visible).\n timer = setInterval(() => {\n if (!audio.paused) write();\n }, READ_INTERVAL_MS);\n return () => {\n cancelAnimationFrame(raf);\n audio.removeEventListener('seeked', onSeek);\n audio.removeEventListener('timeupdate', onSeek);\n if (timer) clearInterval(timer);\n };\n }, [audio]);\n\n return (\n <span className=\"tabular-nums text-xs text-muted-foreground\">\n <span ref={currentRef}>{formatTime(audio.currentTime)}</span>\n {' / '}\n {formatTime(duration)}\n </span>\n );\n}\n","'use client';\n\nimport { TimeDisplay } from '../Meta/TimeDisplay';\nimport { LoopButton } from './LoopButton';\nimport { PlayButton } from './PlayButton';\nimport { SkipButton } from './SkipButton';\nimport { VolumeControl } from './VolumeControl';\n\ntype Props = {\n onPrev?: () => void;\n onNext?: () => void;\n showTime?: boolean;\n};\n\nexport function ControlsRow({ onPrev, onNext, showTime = false }: Props) {\n return (\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1\">\n <SkipButton direction=\"prev\" onClick={onPrev} />\n <PlayButton />\n <SkipButton direction=\"next\" onClick={onNext} />\n </div>\n <div className=\"flex items-center gap-2\">\n {showTime && <TimeDisplay />}\n <VolumeControl />\n <LoopButton />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Music } from 'lucide-react';\n\ntype Props = { size: number };\n\nexport function CoverPlaceholder({ size }: Props) {\n const inset = Math.max(4, Math.round(size * 0.14));\n const iconSize = Math.round(size * 0.4);\n return (\n <div\n className=\"relative grid place-items-center rounded-md bg-muted\"\n style={{ width: size, height: size }}\n aria-hidden=\"true\"\n >\n <span\n className=\"absolute rounded-sm bg-muted-foreground/10\"\n style={{ inset }}\n />\n <Music\n className=\"relative text-muted-foreground\"\n style={{ width: iconSize, height: iconSize }}\n strokeWidth={1.5}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { CoverPlaceholder } from './CoverPlaceholder';\n\ntype Props = { src?: string; alt?: string; size: number };\n\nexport function Cover({ src, alt, size }: Props) {\n const [errored, setErrored] = useState(false);\n if (!src || errored) return <CoverPlaceholder size={size} />;\n return (\n <img\n src={src}\n alt={alt ?? ''}\n width={size}\n height={size}\n loading=\"lazy\"\n decoding=\"async\"\n onError={() => setErrored(true)}\n className=\"block rounded-md object-cover\"\n style={{ width: size, height: size }}\n />\n );\n}\n","'use client';\n\n// Optional `subtle` reactive cover. Reads levels from the imperative store,\n// down-mixes to a single envelope, writes a CSS variable that drives a\n// compositor-only scale. No box-shadow, no glow.\n\nimport { useEffect, useRef } from 'react';\nimport { usePlayerLevels } from '../../context/selectors';\nimport type { ReactNode } from 'react';\n\ntype Props = { enabled: boolean; children: ReactNode };\n\nconst VAR = '--audioplayer-pulse';\nconst MAX_SCALE = 0.03;\nconst SMOOTH = 0.18;\n\nexport function ReactivePulse({ enabled, children }: Props) {\n const ref = useRef<HTMLDivElement | null>(null);\n const store = usePlayerLevels();\n\n useEffect(() => {\n if (!enabled) {\n ref.current?.style.setProperty(VAR, '1');\n return;\n }\n const el = ref.current;\n if (!el) return;\n\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches) {\n el.style.setProperty(VAR, '1');\n return;\n }\n\n let raf = 0;\n let env = 0;\n const tick = () => {\n const buf = store.getCurrent();\n let energy = 0;\n const usable = Math.min(buf.length, 32);\n if (usable > 0) {\n for (let i = 0; i < usable; i++) energy += buf[i];\n energy /= usable;\n }\n env = env + (energy - env) * SMOOTH;\n const scale = 1 + Math.min(MAX_SCALE, env * MAX_SCALE * 1.5);\n el.style.setProperty(VAR, scale.toFixed(4));\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [enabled, store]);\n\n return (\n <div\n ref={ref}\n className=\"audioplayer-pulse\"\n style={{\n transform: 'scale(var(--audioplayer-pulse, 1))',\n transformOrigin: 'center',\n willChange: enabled ? 'transform' : undefined,\n }}\n >\n {children}\n </div>\n );\n}\n","'use client';\n\nimport { AlertTriangle, RotateCcw } from 'lucide-react';\nimport { usePlayerControls, usePlayerState } from '../../context/selectors';\n\nconst REASONS: Record<string, string> = {\n network: 'Network error while loading audio.',\n decode: \"We can't decode this audio.\",\n unsupported: 'This audio format is not supported.',\n unknown: 'Audio playback failed.',\n};\n\nexport function ErrorState() {\n const state = usePlayerState();\n const { play } = usePlayerControls();\n if (state.kind !== 'error') return null;\n const message = REASONS[state.reason] ?? REASONS.unknown;\n return (\n <div\n role=\"alert\"\n className=\"flex items-center gap-3 rounded-md bg-destructive/10 px-3 py-2 text-xs text-destructive\"\n >\n <AlertTriangle size={14} strokeWidth={1.75} />\n <span className=\"flex-1\">{message}</span>\n <button\n type=\"button\"\n onClick={() => void play()}\n className=\"audioplayer-press inline-flex items-center gap-1 rounded-md px-2 py-1 text-destructive hover:bg-destructive/15 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-destructive/40\"\n >\n <RotateCcw size={12} strokeWidth={2} />\n Retry\n </button>\n </div>\n );\n}\n","'use client';\n\nimport { usePlayerMeta } from '../../context/selectors';\n\nexport function Title() {\n const { title } = usePlayerMeta();\n if (!title) return null;\n return (\n <p className=\"truncate text-sm font-medium text-foreground\" title={title}>\n {title}\n </p>\n );\n}\n","'use client';\n\nimport { usePlayerMeta } from '../../context/selectors';\n\nexport function Artist() {\n const { artist, album } = usePlayerMeta();\n if (!artist && !album) return null;\n const text = [artist, album].filter(Boolean).join(' · ');\n return (\n <p className=\"truncate text-xs text-muted-foreground\" title={text}>\n {text}\n </p>\n );\n}\n","'use client';\n\n// Lazy peaks fetch with module-cache + in-flight dedupe. Triggers on first\n// `play()`, IntersectionObserver visibility, or explicit `decodeOnMount` flag.\n\nimport { useEffect, useState } from 'react';\nimport { getPeaks, getPeaksFromCache } from '../audio/peaksCache';\n\nexport type UsePeaksOptions = {\n src: string;\n enabled?: boolean;\n triggerRef?: React.RefObject<Element | null>;\n decodeOnMount?: boolean;\n};\n\nexport function usePeaks(opts: UsePeaksOptions): {\n peaks: Float32Array | null;\n loading: boolean;\n error: unknown;\n} {\n const { src, enabled = true, triggerRef, decodeOnMount = false } = opts;\n const cached = getPeaksFromCache(src) ?? null;\n const [peaks, setLocal] = useState<Float32Array | null>(cached);\n const [loading, setLoading] = useState<boolean>(!cached && enabled);\n const [error, setError] = useState<unknown>(null);\n\n useEffect(() => {\n if (!enabled) return;\n const hit = getPeaksFromCache(src);\n if (hit) {\n setLocal(hit);\n setLoading(false);\n return;\n }\n setLocal(null);\n setLoading(true);\n let cancelled = false;\n let started = false;\n\n const startDecode = () => {\n if (started) return;\n started = true;\n getPeaks(src)\n .then((p) => {\n if (cancelled) return;\n setLocal(p);\n setLoading(false);\n })\n .catch((e) => {\n if (cancelled) return;\n setError(e);\n setLoading(false);\n });\n };\n\n if (decodeOnMount || !triggerRef?.current || typeof IntersectionObserver === 'undefined') {\n startDecode();\n return () => {\n cancelled = true;\n };\n }\n\n const obs = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n startDecode();\n obs.disconnect();\n break;\n }\n }\n },\n { rootMargin: '200px' },\n );\n obs.observe(triggerRef.current);\n return () => {\n cancelled = true;\n obs.disconnect();\n };\n }, [src, enabled, decodeOnMount, triggerRef]);\n\n return { peaks, loading, error };\n}\n","'use client';\n\n// Decorative CSS-only equalizer. No audio coupling. Use when waveform shape\n// doesn't matter (notification bells, generic \"audio playing\" affordance).\n\nimport { useMemo } from 'react';\nimport { usePlayerPaused } from '../../context/selectors';\n\ntype Props = {\n height: number;\n barWidth: number;\n barGap: number;\n bars?: number;\n};\n\nconst BAR_COUNT = 28;\n\nexport function BarsWaveform({ height, barWidth, barGap, bars = BAR_COUNT }: Props) {\n const paused = usePlayerPaused();\n const items = useMemo(() => {\n return Array.from({ length: bars }, (_, i) => ({\n delay: `${(i % 7) * 90}ms`,\n duration: `${800 + (i % 5) * 120}ms`,\n }));\n }, [bars]);\n\n return (\n <div\n className=\"audioplayer-bars flex w-full items-center justify-between\"\n style={{ height, gap: barGap }}\n data-mode=\"bars\"\n aria-hidden=\"true\"\n >\n {items.map((it, i) => (\n <span\n key={i}\n className=\"rounded-sm bg-primary\"\n style={{\n width: barWidth,\n height: '40%',\n animation: paused ? undefined : `audioplayer-bar ${it.duration} ${it.delay} ease-in-out infinite`,\n transformOrigin: 'center',\n }}\n />\n ))}\n </div>\n );\n}\n","// Per-element MediaElementSourceNode cache.\n// See ADR-004 §B. WeakMap so entries die with the audio element.\n\nimport { getAudioContext } from './audioContext';\n\nconst cache = new WeakMap<HTMLAudioElement, MediaElementAudioSourceNode>();\n\nexport function getMediaElementSource(el: HTMLAudioElement): MediaElementAudioSourceNode {\n const hit = cache.get(el);\n if (hit) return hit;\n const ctx = getAudioContext();\n const node = ctx.createMediaElementSource(el);\n node.connect(ctx.destination);\n cache.set(el, node);\n return node;\n}\n\nexport function hasMediaElementSource(el: HTMLAudioElement): boolean {\n return cache.has(el);\n}\n","'use client';\n\n// Lazily creates an AnalyserNode bound to the player's <audio> via the cached\n// MediaElementSourceNode, samples it at ~30 Hz into a Float32Array, and pushes\n// frames into the LevelsStore. Only mounted by LiveWaveform / reactive cover.\n\nimport { useEffect } from 'react';\nimport { getAudioContext } from '../audio/audioContext';\nimport { getMediaElementSource } from '../audio/mediaElementSourceCache';\nimport type { LevelsStore } from '../store/createLevelsStore';\n\nconst FFT_SIZE = 1024;\nconst READ_INTERVAL_MS = 33;\nconst SMOOTHING = 0.8;\n\nexport function useAnalyser(audio: HTMLAudioElement, store: LevelsStore, enabled: boolean) {\n useEffect(() => {\n if (!enabled) return;\n let analyser: AnalyserNode | null = null;\n let interval: ReturnType<typeof setInterval> | null = null;\n let buffer = new Uint8Array(0);\n let normalized = new Float32Array(0);\n let cancelled = false;\n\n try {\n const ctx = getAudioContext();\n const source = getMediaElementSource(audio);\n analyser = ctx.createAnalyser();\n analyser.fftSize = FFT_SIZE;\n analyser.smoothingTimeConstant = SMOOTHING;\n source.connect(analyser);\n buffer = new Uint8Array(analyser.frequencyBinCount);\n normalized = new Float32Array(analyser.frequencyBinCount);\n store.setActive(true);\n\n const tick = () => {\n if (cancelled || !analyser) return;\n if (typeof document !== 'undefined' && document.hidden) return;\n analyser.getByteFrequencyData(buffer);\n for (let i = 0; i < buffer.length; i++) normalized[i] = buffer[i] / 255;\n store.set(normalized);\n };\n interval = setInterval(tick, READ_INTERVAL_MS);\n } catch {\n // Not supported in this environment; leave levels empty.\n store.setActive(false);\n }\n\n return () => {\n cancelled = true;\n if (interval) clearInterval(interval);\n if (analyser) {\n try {\n analyser.disconnect();\n } catch {\n // ignore\n }\n }\n store.setActive(false);\n };\n }, [audio, store, enabled]);\n}\n","// Pointer interaction for the waveform: click-to-seek, drag-to-scrub,\n// hover indicator + tooltip with time-at-cursor. CSS variables only — no\n// React state, no canvas redraws.\n\nimport { formatTime } from '../../utils/formatTime';\n\nconst HOVER_X = '--hp';\nconst HOVER_OPACITY = '--ho';\nconst TOOLTIP_LABEL = '--ht';\n\nexport type AttachSeekOptions = {\n // When the user clicks while paused/idle, also start playback. Drag scrub\n // never auto-starts (already playing or user is scrubbing without intent).\n startsPlayback?: boolean;\n onPlayRequest?: () => void;\n};\n\nexport function attachSeek(\n container: HTMLElement,\n audio: HTMLAudioElement,\n options: AttachSeekOptions = {},\n): () => void {\n let dragging = false;\n let movedDuringDrag = false;\n const { startsPlayback = true, onPlayRequest } = options;\n\n const ratioFor = (clientX: number): number => {\n const rect = container.getBoundingClientRect();\n if (rect.width === 0) return 0;\n return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n };\n\n const seekTo = (clientX: number) => {\n const dur = Number.isFinite(audio.duration) ? audio.duration : 0;\n if (dur > 0) audio.currentTime = ratioFor(clientX) * dur;\n };\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.button !== 0 && e.pointerType === 'mouse') return;\n dragging = true;\n movedDuringDrag = false;\n container.setPointerCapture?.(e.pointerId);\n seekTo(e.clientX);\n };\n const onPointerMove = (e: PointerEvent) => {\n if (!dragging) return;\n movedDuringDrag = true;\n seekTo(e.clientX);\n };\n const onPointerEnd = (e: PointerEvent) => {\n if (!dragging) return;\n const wasDrag = movedDuringDrag;\n dragging = false;\n movedDuringDrag = false;\n try {\n container.releasePointerCapture?.(e.pointerId);\n } catch {\n // ignore\n }\n // Click (not drag) while paused → start playback at the seek target.\n if (!wasDrag && startsPlayback && (audio.paused || audio.ended)) {\n onPlayRequest?.();\n }\n };\n\n container.addEventListener('pointerdown', onPointerDown);\n container.addEventListener('pointermove', onPointerMove);\n container.addEventListener('pointerup', onPointerEnd);\n container.addEventListener('pointercancel', onPointerEnd);\n\n return () => {\n container.removeEventListener('pointerdown', onPointerDown);\n container.removeEventListener('pointermove', onPointerMove);\n container.removeEventListener('pointerup', onPointerEnd);\n container.removeEventListener('pointercancel', onPointerEnd);\n };\n}\n\nexport function attachHover(container: HTMLElement, audio: HTMLAudioElement): () => void {\n const tooltip = container.querySelector<HTMLElement>('[data-audioplayer-time-tip]');\n\n const onMove = (e: PointerEvent) => {\n const rect = container.getBoundingClientRect();\n if (rect.width === 0) return;\n const x = Math.max(0, Math.min(rect.width, e.clientX - rect.left));\n container.style.setProperty(HOVER_X, `${x}px`);\n container.style.setProperty(HOVER_OPACITY, '1');\n if (tooltip) {\n const dur = Number.isFinite(audio.duration) ? audio.duration : 0;\n const t = (x / rect.width) * dur;\n tooltip.textContent = formatTime(t);\n tooltip.style.setProperty(TOOLTIP_LABEL, '1');\n }\n };\n const onLeave = () => {\n container.style.setProperty(HOVER_OPACITY, '0');\n if (tooltip) tooltip.style.setProperty(TOOLTIP_LABEL, '0');\n };\n\n container.addEventListener('pointermove', onMove);\n container.addEventListener('pointerleave', onLeave);\n return () => {\n container.removeEventListener('pointermove', onMove);\n container.removeEventListener('pointerleave', onLeave);\n };\n}\n","// Device pixel ratio helpers. Clamped to 2 to keep canvases under iOS 15 GPU\n// process limits (research 01 §canvas).\n\nconst MAX_DPR = 2;\nconst MAX_BACKING_WIDTH = 2048;\n\nexport function getDpr(): number {\n if (typeof window === 'undefined') return 1;\n const dpr = window.devicePixelRatio ?? 1;\n return Math.min(Math.max(dpr, 1), MAX_DPR);\n}\n\nexport function backingWidth(cssWidth: number, dpr = getDpr()): number {\n return Math.min(Math.round(cssWidth * dpr), MAX_BACKING_WIDTH);\n}\n\nexport function backingHeight(cssHeight: number, dpr = getDpr()): number {\n return Math.round(cssHeight * dpr);\n}\n","// Pure canvas painters. No React, no DOM events. Re-painted only when peaks\n// change, the container resizes, or theme tokens change. See ADR-003.\n\nimport { backingHeight, backingWidth, getDpr } from '../../utils/dpr';\n\nexport type PaintPeaksOptions = {\n color: string;\n background?: string;\n barWidth: number;\n barGap: number;\n minBarHeight?: number;\n};\n\nfunction resizeCanvas(canvas: HTMLCanvasElement): { ctx: CanvasRenderingContext2D; cssW: number; cssH: number } | null {\n const cssW = canvas.clientWidth;\n const cssH = canvas.clientHeight;\n if (cssW === 0 || cssH === 0) return null;\n const dpr = getDpr();\n const w = backingWidth(cssW, dpr);\n const h = backingHeight(cssH, dpr);\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n const ctx = canvas.getContext('2d', { alpha: true, desynchronized: true });\n if (!ctx) return null;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n return { ctx, cssW, cssH };\n}\n\nexport function paintPeaks(\n canvas: HTMLCanvasElement,\n peaks: Float32Array,\n opts: PaintPeaksOptions,\n): void {\n const sized = resizeCanvas(canvas);\n if (!sized) return;\n const { ctx, cssW, cssH } = sized;\n ctx.clearRect(0, 0, cssW, cssH);\n if (opts.background) {\n ctx.fillStyle = opts.background;\n ctx.fillRect(0, 0, cssW, cssH);\n }\n\n if (peaks.length === 0) return;\n const step = Math.max(1, opts.barWidth + opts.barGap);\n const numBars = Math.max(1, Math.floor(cssW / step));\n const mid = cssH / 2;\n const minH = opts.minBarHeight ?? 1;\n\n ctx.fillStyle = opts.color;\n for (let i = 0; i < numBars; i++) {\n const peakIdx = Math.min(peaks.length - 1, Math.floor((i / numBars) * peaks.length));\n const amp = peaks[peakIdx];\n const h = Math.max(minH, amp * cssH);\n const x = i * step;\n ctx.fillRect(x, mid - h / 2, opts.barWidth, h);\n }\n}\n\nexport type PaintLiveOptions = {\n color: string;\n barWidth: number;\n barGap: number;\n minBarHeight?: number;\n};\n\nexport function paintLive(\n canvas: HTMLCanvasElement,\n levels: Float32Array,\n opts: PaintLiveOptions,\n): void {\n const sized = resizeCanvas(canvas);\n if (!sized) return;\n const { ctx, cssW, cssH } = sized;\n ctx.clearRect(0, 0, cssW, cssH);\n if (levels.length === 0) return;\n\n const step = Math.max(1, opts.barWidth + opts.barGap);\n const numBars = Math.max(1, Math.floor(cssW / step));\n const mid = cssH / 2;\n const minH = opts.minBarHeight ?? 1;\n // Concentrate visible energy in the lower frequency bands.\n const usable = Math.floor(levels.length * 0.7);\n\n ctx.fillStyle = opts.color;\n for (let i = 0; i < numBars; i++) {\n const idx = Math.min(usable - 1, Math.floor((i / numBars) * usable));\n const v = levels[idx] ?? 0;\n const h = Math.max(minH, v * cssH);\n ctx.fillRect(i * step, mid - h / 2, opts.barWidth, h);\n }\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { alpha, useThemeColor } from '@djangocfg/ui-core/styles/palette';\nimport { useAnalyser } from '../../hooks/useAnalyser';\nimport { useElementWidth } from '../../hooks/useResizeObserver';\nimport { usePlayerAudio, usePlayerControls, usePlayerLevels } from '../../context/selectors';\nimport { attachHover, attachSeek } from './waveformInteraction';\nimport { paintLive } from './waveformRenderer';\n\ntype Props = {\n height: number;\n barWidth: number;\n barGap: number;\n seekStartsPlayback?: boolean;\n};\n\nexport function LiveWaveform({ height, barWidth, barGap, seekStartsPlayback }: Props) {\n const audio = usePlayerAudio();\n const controls = usePlayerControls();\n const store = usePlayerLevels();\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const fgHex = useThemeColor('primary');\n const mutedHex = useThemeColor('muted-foreground');\n const colorRef = useRef(fgHex);\n colorRef.current = fgHex;\n useElementWidth(container);\n\n useAnalyser(audio, store, true);\n\n // rAF paint loop reads from the imperative store. Zero React renders.\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n let raf = 0;\n const tick = () => {\n if (typeof document !== 'undefined' && document.hidden) {\n raf = requestAnimationFrame(tick);\n return;\n }\n paintLive(canvas, store.getCurrent(), {\n color: colorRef.current,\n barWidth,\n barGap,\n minBarHeight: 1,\n });\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [store, barWidth, barGap]);\n\n useEffect(() => {\n if (!container) return;\n const detachSeek = attachSeek(container, audio, {\n startsPlayback: seekStartsPlayback,\n onPlayRequest: () => void controls.play(),\n });\n const detachHover = attachHover(container, audio);\n return () => {\n detachSeek();\n detachHover();\n };\n }, [audio, container, controls, seekStartsPlayback]);\n\n return (\n <div\n ref={setContainer}\n className=\"audioplayer-waveform relative w-full select-none cursor-pointer\"\n style={{ height }}\n data-mode=\"live\"\n >\n <canvas ref={canvasRef} className=\"absolute inset-0 h-full w-full\" aria-hidden=\"true\" />\n <div\n className=\"audioplayer-hover pointer-events-none absolute top-0 bottom-0 w-px transition-opacity\"\n style={{\n left: 'var(--hp, -10px)',\n opacity: 'var(--ho, 0)',\n backgroundColor: alpha(mutedHex, 0.5),\n }}\n aria-hidden=\"true\"\n />\n <div\n data-audioplayer-time-tip\n className=\"audioplayer-tip pointer-events-none absolute -top-7 -translate-x-1/2 rounded bg-foreground px-1.5 py-0.5 text-[10px] tabular-nums text-background transition-opacity\"\n style={{\n left: 'var(--hp, -100px)',\n opacity: 'var(--ht, 0)',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n","'use client';\n\n// One rAF loop reads audio.currentTime and writes a single CSS variable.\n// Pauses on document.hidden and when the audio is paused (with a final\n// flush to keep the bar in sync after the seek that triggered the pause).\n\nimport { useEffect } from 'react';\n\nconst VAR = '--p';\n\nexport function usePlayheadLoop(\n audio: HTMLAudioElement,\n el: HTMLElement | null,\n enabled = true,\n): void {\n useEffect(() => {\n if (!enabled || !el) return;\n let raf = 0;\n let lastPct = -1;\n\n const writePct = () => {\n const dur = audio.duration;\n if (!Number.isFinite(dur) || dur <= 0) return;\n const pct = Math.max(0, Math.min(100, (audio.currentTime / dur) * 100));\n if (Math.abs(pct - lastPct) < 0.01) return;\n lastPct = pct;\n el.style.setProperty(VAR, `${pct.toFixed(2)}%`);\n };\n\n const tick = () => {\n if (typeof document !== 'undefined' && document.hidden) {\n raf = 0;\n return;\n }\n writePct();\n raf = requestAnimationFrame(tick);\n };\n\n const start = () => {\n if (raf) return;\n raf = requestAnimationFrame(tick);\n };\n const stop = () => {\n if (!raf) return;\n cancelAnimationFrame(raf);\n raf = 0;\n writePct();\n };\n\n if (!audio.paused) start();\n\n const onPlay = () => start();\n const onPauseOrEnd = () => stop();\n const onSeek = () => writePct();\n const onVisibility = () => {\n if (document.hidden) stop();\n else if (!audio.paused) start();\n };\n\n audio.addEventListener('play', onPlay);\n audio.addEventListener('pause', onPauseOrEnd);\n audio.addEventListener('ended', onPauseOrEnd);\n audio.addEventListener('seeked', onSeek);\n audio.addEventListener('timeupdate', writePct);\n document.addEventListener('visibilitychange', onVisibility);\n\n return () => {\n stop();\n audio.removeEventListener('play', onPlay);\n audio.removeEventListener('pause', onPauseOrEnd);\n audio.removeEventListener('ended', onPauseOrEnd);\n audio.removeEventListener('seeked', onSeek);\n audio.removeEventListener('timeupdate', writePct);\n document.removeEventListener('visibilitychange', onVisibility);\n };\n }, [audio, el, enabled]);\n}\n","'use client';\n\n// Fires `cb` whenever <html> class changes (typical light/dark toggle convention)\n// or the user's color-scheme media preference flips. Used to repaint canvases\n// after a theme switch — see ADR-003.\n\nimport { useEffect } from 'react';\n\nexport function useThemeWatcher(cb: () => void): void {\n useEffect(() => {\n const root = document.documentElement;\n const obs = new MutationObserver(cb);\n obs.observe(root, { attributes: true, attributeFilter: ['class', 'data-theme'] });\n const mq = window.matchMedia?.('(prefers-color-scheme: dark)');\n const onMq = () => cb();\n mq?.addEventListener?.('change', onMq);\n return () => {\n obs.disconnect();\n mq?.removeEventListener?.('change', onMq);\n };\n }, [cb]);\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { alpha, useThemeColor } from '@djangocfg/ui-core/styles/palette';\nimport { usePlayerAudio, usePlayerControls } from '../../context/selectors';\nimport { useElementWidth } from '../../hooks/useResizeObserver';\nimport { usePlayheadLoop } from '../../hooks/usePlayheadLoop';\nimport { useThemeWatcher } from '../../hooks/useThemeWatcher';\nimport { attachHover, attachSeek } from './waveformInteraction';\nimport { paintPeaks } from './waveformRenderer';\n\ntype Props = {\n peaks: Float32Array;\n height: number;\n barWidth: number;\n barGap: number;\n seekStartsPlayback?: boolean;\n};\n\nexport function PeaksWaveform({ peaks, height, barWidth, barGap, seekStartsPlayback }: Props) {\n const audio = usePlayerAudio();\n const controls = usePlayerControls();\n // State-backed ref so child hooks re-run once the DOM node attaches.\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const bgCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const fgCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const width = useElementWidth(container);\n\n const fgHex = useThemeColor('primary');\n const mutedHex = useThemeColor('muted-foreground');\n\n const repaint = useCallback(() => {\n const bg = bgCanvasRef.current;\n const fg = fgCanvasRef.current;\n if (!bg || !fg) return;\n paintPeaks(bg, peaks, { color: alpha(mutedHex, 0.4), barWidth, barGap, minBarHeight: 1 });\n paintPeaks(fg, peaks, { color: fgHex, barWidth, barGap, minBarHeight: 1 });\n }, [peaks, barWidth, barGap, fgHex, mutedHex]);\n\n useEffect(repaint, [repaint, width]);\n useThemeWatcher(repaint);\n\n usePlayheadLoop(audio, container, true);\n\n useEffect(() => {\n if (!container) return;\n const detachSeek = attachSeek(container, audio, {\n startsPlayback: seekStartsPlayback,\n onPlayRequest: () => void controls.play(),\n });\n const detachHover = attachHover(container, audio);\n return () => {\n detachSeek();\n detachHover();\n };\n }, [audio, container, controls, seekStartsPlayback]);\n\n return (\n <div\n ref={setContainer}\n className=\"audioplayer-waveform relative w-full select-none cursor-pointer\"\n style={{ height, ['--p' as string]: '0%' }}\n data-mode=\"peaks\"\n >\n <canvas ref={bgCanvasRef} className=\"absolute inset-0 h-full w-full\" aria-hidden=\"true\" />\n <div\n className=\"audioplayer-fg-clip absolute inset-0\"\n style={{\n clipPath: 'polygon(0 0, var(--p) 0, var(--p) 100%, 0 100%)',\n willChange: 'clip-path',\n }}\n >\n <canvas ref={fgCanvasRef} className=\"absolute inset-0 h-full w-full\" aria-hidden=\"true\" />\n </div>\n <div\n className=\"audioplayer-cursor pointer-events-none absolute top-0 bottom-0 w-px\"\n style={{ left: 'var(--p)', backgroundColor: alpha(fgHex, 0.7) }}\n aria-hidden=\"true\"\n />\n <div\n className=\"audioplayer-hover pointer-events-none absolute top-0 bottom-0 w-px transition-opacity\"\n style={{\n left: 'var(--hp, -10px)',\n opacity: 'var(--ho, 0)',\n backgroundColor: alpha(mutedHex, 0.5),\n }}\n aria-hidden=\"true\"\n />\n <div\n data-audioplayer-time-tip\n className=\"audioplayer-tip pointer-events-none absolute -top-7 -translate-x-1/2 rounded bg-foreground px-1.5 py-0.5 text-[10px] tabular-nums text-background transition-opacity\"\n style={{\n left: 'var(--hp, -100px)',\n opacity: 'var(--ht, 0)',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n","'use client';\n\n// Plain progress bar — no waveform, no animation. Same playhead mechanics as\n// the canvas modes (clip-path via --p, click/drag to seek). Use when you want\n// a track scrubber without amplitude visualisation.\n\nimport { useEffect, useState } from 'react';\nimport { alpha, useThemeColor } from '@djangocfg/ui-core/styles/palette';\nimport { usePlayerAudio, usePlayerControls } from '../../context/selectors';\nimport { usePlayheadLoop } from '../../hooks/usePlayheadLoop';\nimport { attachHover, attachSeek } from './waveformInteraction';\n\ntype Props = { height?: number; seekStartsPlayback?: boolean };\n\nexport function ProgressBar({ height = 4, seekStartsPlayback }: Props) {\n const audio = usePlayerAudio();\n const controls = usePlayerControls();\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const fgHex = useThemeColor('primary');\n const mutedHex = useThemeColor('muted-foreground');\n\n usePlayheadLoop(audio, container, true);\n\n useEffect(() => {\n if (!container) return;\n const detachSeek = attachSeek(container, audio, {\n startsPlayback: seekStartsPlayback,\n onPlayRequest: () => void controls.play(),\n });\n const detachHover = attachHover(container, audio);\n return () => {\n detachSeek();\n detachHover();\n };\n }, [audio, container, controls, seekStartsPlayback]);\n\n return (\n <div\n ref={setContainer}\n className=\"audioplayer-waveform relative w-full select-none cursor-pointer\"\n style={{ ['--p' as string]: '0%' }}\n data-mode=\"progress\"\n >\n <div\n className=\"rounded-full\"\n style={{ height, backgroundColor: alpha(mutedHex, 0.25) }}\n />\n <div\n className=\"absolute inset-y-0 left-0 rounded-full\"\n style={{\n width: 'var(--p)',\n backgroundColor: fgHex,\n }}\n aria-hidden=\"true\"\n />\n <div\n className=\"audioplayer-hover pointer-events-none absolute -top-1 -bottom-1 w-px transition-opacity\"\n style={{\n left: 'var(--hp, -10px)',\n opacity: 'var(--ho, 0)',\n backgroundColor: alpha(mutedHex, 0.5),\n }}\n aria-hidden=\"true\"\n />\n <div\n data-audioplayer-time-tip\n className=\"audioplayer-tip pointer-events-none absolute -top-7 -translate-x-1/2 rounded bg-foreground px-1.5 py-0.5 text-[10px] tabular-nums text-background transition-opacity\"\n style={{\n left: 'var(--hp, -100px)',\n opacity: 'var(--ht, 0)',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n","'use client';\n\ntype Props = { height: number };\n\nexport function WaveformSkeleton({ height }: Props) {\n return (\n <div\n className=\"audioplayer-skeleton relative w-full overflow-hidden\"\n style={{ height }}\n aria-hidden=\"true\"\n >\n <div className=\"absolute inset-x-0 top-1/2 h-px -translate-y-1/2 bg-muted-foreground/30\" />\n <div className=\"absolute inset-0 audioplayer-shimmer\" />\n </div>\n );\n}\n","'use client';\n\nimport { useRef } from 'react';\nimport { usePlayerMeta } from '../../context/selectors';\nimport { usePeaks } from '../../hooks/usePeaks';\nimport type { WaveformConfig } from '../../types';\nimport { BarsWaveform } from './BarsWaveform';\nimport { LiveWaveform } from './LiveWaveform';\nimport { PeaksWaveform } from './PeaksWaveform';\nimport { ProgressBar } from './ProgressBar';\nimport { WaveformSkeleton } from './WaveformSkeleton';\n\ntype Props = {\n config?: WaveformConfig;\n height: number;\n seekStartsPlayback?: boolean;\n};\n\nexport function Waveform({ config, height, seekStartsPlayback }: Props) {\n const meta = usePlayerMeta();\n const triggerRef = useRef<HTMLDivElement | null>(null);\n\n const mode = config?.mode ?? 'peaks';\n const barWidth = config?.barWidth ?? 2;\n const barGap = config?.barGap ?? 1;\n\n const peaksEnabled = mode === 'peaks';\n const { peaks, loading, error } = usePeaks({\n src: meta.src,\n enabled: peaksEnabled,\n triggerRef,\n decodeOnMount: config?.decodeOnMount,\n });\n\n if (mode === 'none') return null;\n if (mode === 'progress')\n return <ProgressBar height={Math.min(height, 6)} seekStartsPlayback={seekStartsPlayback} />;\n if (mode === 'bars') return <BarsWaveform height={height} barWidth={barWidth} barGap={barGap} />;\n if (mode === 'live')\n return (\n <LiveWaveform\n height={height}\n barWidth={barWidth}\n barGap={barGap}\n seekStartsPlayback={seekStartsPlayback}\n />\n );\n\n // peaks mode\n if (loading || (!peaks && !error)) {\n return (\n <div ref={triggerRef}>\n <WaveformSkeleton height={height} />\n </div>\n );\n }\n if (!peaks) {\n // Decode failed — degrade to a plain scrubber. Playback works; user can\n // still seek; we just can't show amplitude. Per ADR-002 we never surface\n // decode failure as a hard error.\n return <ProgressBar height={Math.min(height, 6)} seekStartsPlayback={seekStartsPlayback} />;\n }\n return (\n <div ref={triggerRef}>\n <PeaksWaveform\n peaks={peaks}\n height={height}\n barWidth={barWidth}\n barGap={barGap}\n seekStartsPlayback={seekStartsPlayback}\n />\n </div>\n );\n}\n","'use client';\n\nimport { ControlsRow } from '../Controls';\nimport { Cover, ReactivePulse } from '../Cover';\nimport { ErrorState } from '../ErrorState';\nimport { Artist, Title } from '../Meta';\nimport { Waveform } from '../Waveform';\nimport type { ReactiveCoverMode, WaveformConfig } from '../../types';\nimport { usePlayerMeta } from '../../context/selectors';\n\ntype Props = {\n waveform?: WaveformConfig;\n reactiveCover?: ReactiveCoverMode;\n onPrev?: () => void;\n onNext?: () => void;\n seekStartsPlayback?: boolean;\n};\n\nexport function DefaultLayout({ waveform, reactiveCover, onPrev, onNext, seekStartsPlayback }: Props) {\n const meta = usePlayerMeta();\n const cover = (\n <Cover src={meta.cover} alt={meta.title ? `${meta.title} cover` : ''} size={56} />\n );\n return (\n <div className=\"flex flex-col gap-3.5 p-4\">\n {/* Header: cover ↔ meta, vertically centered. No timer here — timer\n lives in ControlsRow next to playback. */}\n <div className=\"flex items-center gap-3\">\n {reactiveCover === 'subtle' ? (\n <ReactivePulse enabled>{cover}</ReactivePulse>\n ) : (\n cover\n )}\n <div className=\"min-w-0 flex-1\">\n <Title />\n <Artist />\n </div>\n </div>\n <Waveform\n config={waveform}\n height={waveform?.height ?? 40}\n seekStartsPlayback={seekStartsPlayback}\n />\n <ErrorState />\n <ControlsRow onPrev={onPrev} onNext={onNext} showTime />\n </div>\n );\n}\n","'use client';\n\nimport { PlayButton, VolumeControl } from '../Controls';\nimport { TimeDisplay } from '../Meta';\nimport { Waveform } from '../Waveform';\nimport type { WaveformConfig } from '../../types';\n\ntype Props = { waveform?: WaveformConfig; seekStartsPlayback?: boolean };\n\nexport function CompactLayout({ waveform, seekStartsPlayback }: Props) {\n return (\n <div className=\"flex items-center gap-3 p-2\">\n <PlayButton size=\"compact\" />\n <div className=\"min-w-0 flex-1\">\n <Waveform\n config={waveform}\n height={waveform?.height ?? 24}\n seekStartsPlayback={seekStartsPlayback}\n />\n </div>\n <TimeDisplay />\n <VolumeControl />\n </div>\n );\n}\n","'use client';\n\n// Inner shell that runs inside <PlayerProvider>. Owns variant selection,\n// keyboard shortcuts and MediaSession wiring; renders the picked layout.\n\nimport { useCallback, useEffect, useImperativeHandle, useState } from 'react';\nimport { TooltipProvider } from '@djangocfg/ui-core/components';\nimport { useIsPhone } from '@djangocfg/ui-core/hooks';\nimport { usePlayerAudio, usePlayerControls, usePlayerMeta } from './context/selectors';\nimport { useElementWidth } from './hooks/useResizeObserver';\nimport { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts';\nimport { useMediaSession } from './hooks/useMediaSession';\nimport { CompactLayout, DefaultLayout } from './parts/Layout';\nimport type { PlayerHandle, PlayerProps, PlayerVariant } from './types';\n\nconst COMPACT_BREAKPOINT = 480;\n\ntype Props = Pick<\n PlayerProps,\n | 'className'\n | 'variant'\n | 'waveform'\n | 'reactiveCover'\n | 'onPrev'\n | 'onNext'\n | 'enableKeyboardShortcuts'\n | 'ariaLabel'\n | 'seekStartsPlayback'\n> & {\n handleRef?: React.Ref<PlayerHandle>;\n};\n\nexport function PlayerShell({\n className = '',\n variant = 'auto',\n waveform,\n reactiveCover = false,\n onPrev,\n onNext,\n enableKeyboardShortcuts = true,\n ariaLabel,\n seekStartsPlayback = true,\n handleRef,\n}: Props) {\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const audio = usePlayerAudio();\n const controls = usePlayerControls();\n const meta = usePlayerMeta();\n const width = useElementWidth(container);\n const isPhone = useIsPhone();\n\n // `auto` resolves to the layout best for the available space:\n // - on a phone viewport we always use compact (regardless of container);\n // - otherwise compact only when the container itself is narrower than\n // COMPACT_BREAKPOINT.\n const resolvedVariant: PlayerVariant =\n variant === 'auto'\n ? isPhone || (width > 0 && width < COMPACT_BREAKPOINT)\n ? 'compact'\n : 'default'\n : variant;\n\n useMediaSession(audio, meta, controls, onPrev, onNext);\n const hotkeys = useKeyboardShortcuts({\n audio,\n controls,\n enabled: enableKeyboardShortcuts,\n });\n\n // Compose the container state-ref with the hotkey scoping ref. Both want\n // to see the same DOM node — one for layout/keyboard-focus management, the\n // other for react-hotkeys-hook's scoped listener.\n const setRootRef = useCallback(\n (node: HTMLDivElement | null) => {\n setContainer(node);\n hotkeys.ref(node);\n },\n [hotkeys],\n );\n\n useImperativeHandle(\n handleRef,\n (): PlayerHandle => ({\n audio,\n play: () => controls.play(),\n pause: () => controls.pause(),\n seek: (s: number) => controls.seek(s),\n getCurrentTime: () => audio.currentTime,\n getDuration: () => (Number.isFinite(audio.duration) ? audio.duration : 0),\n }),\n [audio, controls],\n );\n\n // Keyboard shortcuts work only when the container can take focus.\n useEffect(() => {\n if (!container || container.hasAttribute('tabindex')) return;\n container.setAttribute('tabindex', '0');\n }, [container]);\n\n return (\n <TooltipProvider delayDuration={400}>\n <div\n ref={setRootRef}\n role=\"group\"\n aria-label={ariaLabel ?? 'Audio player'}\n className={`audioplayer @container/player rounded-lg border border-border/60 bg-card text-foreground shadow-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50 ${className}`}\n >\n {resolvedVariant === 'compact' ? (\n <CompactLayout waveform={waveform} seekStartsPlayback={seekStartsPlayback} />\n ) : (\n <DefaultLayout\n waveform={waveform}\n reactiveCover={reactiveCover}\n onPrev={onPrev}\n onNext={onNext}\n seekStartsPlayback={seekStartsPlayback}\n />\n )}\n </div>\n </TooltipProvider>\n );\n}\n","'use client';\n\nimport { forwardRef } from 'react';\nimport { PlayerProvider } from './context/PlayerProvider';\nimport { PlayerShell } from './PlayerShell';\nimport './styles/webview-safe.css';\nimport type { PlayerHandle, PlayerProps } from './types';\n\nexport const Player = forwardRef<PlayerHandle, PlayerProps>(function Player(props, ref) {\n const {\n src,\n peaks,\n title,\n artist,\n album,\n cover,\n autoplay,\n loop,\n initialVolume,\n muted,\n preload,\n exclusive,\n onPrev,\n onNext,\n onPlay,\n onPause,\n onEnded,\n onError,\n onTimeUpdate,\n variant,\n waveform,\n reactiveCover,\n className,\n ariaLabel,\n enableKeyboardShortcuts,\n seekStartsPlayback,\n } = props;\n\n // onTimeUpdate is intentionally not wired in the provider — we expose it via\n // ref or future hook. Keep the prop accepted so callers can adopt later.\n void onTimeUpdate;\n\n return (\n <PlayerProvider\n src={src}\n peaks={peaks}\n title={title}\n artist={artist}\n album={album}\n cover={cover}\n autoplay={autoplay}\n loop={loop}\n initialVolume={initialVolume}\n muted={muted}\n preload={preload}\n exclusive={exclusive}\n onPrev={onPrev}\n onNext={onNext}\n onPlay={onPlay}\n onPause={onPause}\n onEnded={onEnded}\n onError={onError}\n >\n <PlayerShell\n className={className}\n variant={variant}\n waveform={waveform}\n reactiveCover={reactiveCover}\n onPrev={onPrev}\n onNext={onNext}\n enableKeyboardShortcuts={enableKeyboardShortcuts}\n ariaLabel={ariaLabel}\n seekStartsPlayback={seekStartsPlayback}\n handleRef={ref}\n />\n </PlayerProvider>\n );\n});\n\nPlayer.displayName = 'AudioPlayer';\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkDFTVB66S_cjs = require('./chunk-DFTVB66S.cjs');
|
|
4
|
+
require('./chunk-77HQWEQ6.cjs');
|
|
5
|
+
require('./chunk-WGEGR3DF.cjs');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
Object.defineProperty(exports, "VideoControls", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function () { return chunkDFTVB66S_cjs.VideoControls; }
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(exports, "VideoErrorFallback", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () { return chunkDFTVB66S_cjs.VideoErrorFallback; }
|
|
16
|
+
});
|
|
17
|
+
Object.defineProperty(exports, "VideoPlayer", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return chunkDFTVB66S_cjs.VideoPlayer; }
|
|
20
|
+
});
|
|
21
|
+
Object.defineProperty(exports, "createVideoErrorFallback", {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () { return chunkDFTVB66S_cjs.createVideoErrorFallback; }
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=components-WYEZL5TE.cjs.map
|
|
26
|
+
//# sourceMappingURL=components-WYEZL5TE.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"components-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"components-WYEZL5TE.cjs"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { VideoControls, VideoErrorFallback, VideoPlayer, createVideoErrorFallback } from './chunk-EUADAUBQ.mjs';
|
|
2
|
+
import './chunk-5LBDYFWH.mjs';
|
|
3
|
+
import './chunk-CGILA3WO.mjs';
|
|
4
|
+
//# sourceMappingURL=components-ZAGG2PBO.mjs.map
|
|
5
|
+
//# sourceMappingURL=components-ZAGG2PBO.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"components-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"components-ZAGG2PBO.mjs"}
|