{"version":3,"sources":["../../src/tools/media/AudioPlayer/audio/audioContext.ts","../../src/tools/media/AudioPlayer/utils/bucketize.ts","../../src/tools/media/AudioPlayer/audio/decodePeaks.ts","../../src/tools/media/AudioPlayer/audio/peaksCache.ts","../../src/tools/media/AudioPlayer/store/activePlayerBus.ts","../../src/tools/media/AudioPlayer/store/createLevelsStore.ts","../../src/tools/media/AudioPlayer/store/preferencesStore.ts","../../src/tools/media/AudioPlayer/utils/clamp.ts","../../src/tools/media/AudioPlayer/context/AudioRefContext.tsx","../../src/tools/media/AudioPlayer/context/ControlsContext.tsx","../../src/tools/media/AudioPlayer/context/LevelsContext.tsx","../../src/tools/media/AudioPlayer/context/MetaContext.tsx","../../src/tools/media/AudioPlayer/context/StateContext.tsx","../../src/tools/media/AudioPlayer/hooks/useAudioElementEvents.ts","../../src/tools/media/AudioPlayer/context/PlayerProvider.tsx","../../src/tools/media/AudioPlayer/context/selectors.ts","../../src/tools/media/AudioPlayer/hooks/useResizeObserver.ts","../../src/tools/media/AudioPlayer/hooks/useKeyboardShortcuts.ts","../../src/tools/media/AudioPlayer/hooks/useMediaSession.ts","../../src/tools/media/AudioPlayer/parts/Controls/PlayButton.tsx","../../src/tools/media/AudioPlayer/parts/Controls/IconButton.tsx","../../src/tools/media/AudioPlayer/parts/Controls/SkipButton.tsx","../../src/tools/media/AudioPlayer/parts/Controls/LoopButton.tsx","../../src/tools/media/AudioPlayer/parts/Controls/VolumeControl.tsx","../../src/tools/media/AudioPlayer/utils/formatTime.ts","../../src/tools/media/AudioPlayer/parts/Meta/TimeDisplay.tsx","../../src/tools/media/AudioPlayer/parts/Controls/ControlsRow.tsx","../../src/tools/media/AudioPlayer/parts/Cover/CoverPlaceholder.tsx","../../src/tools/media/AudioPlayer/parts/Cover/Cover.tsx","../../src/tools/media/AudioPlayer/parts/Cover/ReactivePulse.tsx","../../src/tools/media/AudioPlayer/parts/ErrorState/ErrorState.tsx","../../src/tools/media/AudioPlayer/parts/Meta/Title.tsx","../../src/tools/media/AudioPlayer/parts/Meta/Artist.tsx","../../src/tools/media/AudioPlayer/hooks/usePeaks.ts","../../src/tools/media/AudioPlayer/parts/Waveform/BarsWaveform.tsx","../../src/tools/media/AudioPlayer/audio/mediaElementSourceCache.ts","../../src/tools/media/AudioPlayer/hooks/useAnalyser.ts","../../src/tools/media/AudioPlayer/parts/Waveform/waveformInteraction.ts","../../src/tools/media/AudioPlayer/utils/dpr.ts","../../src/tools/media/AudioPlayer/parts/Waveform/waveformRenderer.ts","../../src/tools/media/AudioPlayer/parts/Waveform/LiveWaveform.tsx","../../src/tools/media/AudioPlayer/hooks/usePlayheadLoop.ts","../../src/tools/media/AudioPlayer/hooks/useThemeWatcher.ts","../../src/tools/media/AudioPlayer/parts/Waveform/PeaksWaveform.tsx","../../src/tools/media/AudioPlayer/parts/Waveform/ProgressBar.tsx","../../src/tools/media/AudioPlayer/parts/Waveform/WaveformSkeleton.tsx","../../src/tools/media/AudioPlayer/parts/Waveform/Waveform.tsx","../../src/tools/media/AudioPlayer/parts/Layout/DefaultLayout.tsx","../../src/tools/media/AudioPlayer/parts/Layout/CompactLayout.tsx","../../src/tools/media/AudioPlayer/PlayerShell.tsx","../../src/tools/media/AudioPlayer/Player.tsx","../../src/tools/media/AudioPlayer/hooks/useActivePlayer.ts","../../src/tools/media/AudioPlayer/hooks/usePlayerPreferences.ts"],"names":["channel","listeners","createContext","cached","useState","useEffect","jsx","IconButton","jsxs","Tooltip","TooltipTrigger","TooltipContent","useRef","RotateCcw","useMemo","cache","READ_INTERVAL_MS","VAR","useThemeColor","useCallback","alpha","forwardRef","Player","useSyncExternalStore","getServerSnapshot"],"mappings":"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","file":"index.mjs","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  'loadstart',\n  'loadedmetadata',\n  'durationchange',\n  'emptied',\n  'waiting',\n  'canplay',\n  'error',\n] as const;\n\n// A detached <audio> whose `src` 404s (or points at a dead host) often never\n// fires an `error` event — it stalls in NETWORK_LOADING indefinitely. After\n// this long without metadata/canplay/error we synthesize a network error so\n// the UI can surface it instead of showing a stuck skeleton forever.\nconst LOAD_WATCHDOG_MS = 12_000;\nconst SYNTHETIC_NETWORK_ERROR = 2;\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, stalled: boolean): Snapshot {\n  const nativeCode = audio.error?.code ?? null;\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: nativeCode ?? (stalled ? SYNTHETIC_NETWORK_ERROR : 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 stalled = false;\n  let cached: Snapshot = readSnapshot(audio, stalled);\n  return {\n    subscribe(cb: () => void): () => void {\n      let watchdog: ReturnType<typeof setTimeout> | null = null;\n\n      const clearWatchdog = () => {\n        if (watchdog !== null) {\n          clearTimeout(watchdog);\n          watchdog = null;\n        }\n      };\n      const refresh = () => {\n        const next = readSnapshot(audio, stalled);\n        if (!snapshotsEqual(cached, next)) {\n          cached = next;\n          cb();\n        }\n      };\n      const armWatchdog = () => {\n        clearWatchdog();\n        if (audio.readyState >= 2 || audio.error) return;\n        watchdog = setTimeout(() => {\n          watchdog = null;\n          if (audio.readyState < 2 && !audio.error) {\n            stalled = true;\n            refresh();\n          }\n        }, LOAD_WATCHDOG_MS);\n      };\n      const onProgress = (e: Event) => {\n        if (e.type === 'loadstart' || e.type === 'emptied') {\n          // New load cycle — drop any prior stall and restart the watchdog.\n          stalled = false;\n          armWatchdog();\n        } else if (audio.readyState >= 2 || audio.error) {\n          // Real progress (or a native error) clears a pending stall timer.\n          clearWatchdog();\n          if (stalled) stalled = false;\n        }\n        refresh();\n      };\n\n      for (const e of TRACKED) audio.addEventListener(e, onProgress);\n      // Re-sync immediately: events (error, loadedmetadata, …) may have fired\n      // between source creation and this subscription. Without this, a stale\n      // snapshot from construction time would never update — e.g. a `src` that\n      // already errored would stay stuck on `loading`.\n      armWatchdog();\n      refresh();\n      return () => {\n        clearWatchdog();\n        for (const e of TRACKED) audio.removeEventListener(e, onProgress);\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  const [activePeaks, setActivePeaks] = useState<Float32Array | undefined>(\n    () => peaksProp ?? getPeaksFromCache(src),\n  );\n\n  // Seed peaks-from-prop into the module cache so other consumers benefit too.\n  // Done in an effect (not render) to keep render pure under StrictMode.\n  useEffect(() => {\n    if (peaksProp && getPeaksFromCache(src) === undefined) {\n      setPeaks(src, peaksProp);\n    }\n  }, [src, peaksProp]);\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 peaks: prop wins, then module cache, else clear.\n  useEffect(() => {\n    setActivePeaks(peaksProp ?? getPeaksFromCache(src));\n  }, [src, peaksProp]);\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","'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 { forwardRef, type ButtonHTMLAttributes, type 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\n// `forwardRef` is mandatory: this button is used as `<PopoverTrigger asChild>`\n// in VolumeControl. Without ref forwarding, Radix can't anchor the popper to\n// the trigger, and `<PopoverContent>` renders with zero rect (invisible).\nexport const IconButton = forwardRef<HTMLButtonElement, Props>(function IconButton(\n  { label, shortcut, active, children, noTooltip, className = '', ...rest },\n  ref,\n) {\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      ref={ref}\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, useState } from 'react';\nimport { Popover, PopoverContent, PopoverTrigger, Slider } from '@djangocfg/ui-core/components';\nimport { usePlayerAudio, usePlayerControls } from '../../context/selectors';\nimport { IconButton } from './IconButton';\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\n/**\n * Volume control — click-to-open Popover with a vertical `<Slider>`.\n *\n * Click on the trigger toggles the popover (not mute). Mute lives as a\n * dedicated icon button inside the popover. This avoids the classic\n * Radix `<Tooltip>` + `<Popover>` collision on the same trigger:\n * hovering opened the tooltip, click toggled the popover — but the\n * tooltip's pointer-events fought the popover's outside-click logic.\n * One trigger, one job: open the popover; volume + mute live inside.\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\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  if (HIDE_VOLUME) {\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 Icon = muted || volume === 0 ? VolumeX : Volume2;\n\n  const handleChange = (v: number) => {\n    setVolume(v);\n    setVol(v);\n    if (v > 0) setMuted(false);\n  };\n\n  return (\n    <Popover open={isOpen} onOpenChange={setOpen}>\n      <PopoverTrigger asChild>\n        <IconButton\n          label={isOpen ? 'Close volume' : 'Volume'}\n          // Tooltip while open would race the popover for pointer/focus\n          // — suppress it as soon as the popover opens.\n          noTooltip={isOpen}\n          active={muted}\n        >\n          <Icon size={16} strokeWidth={1.75} />\n        </IconButton>\n      </PopoverTrigger>\n      <PopoverContent\n        side=\"top\"\n        align=\"center\"\n        sideOffset={6}\n        className=\"flex w-14! flex-col items-center gap-2 p-3!\"\n        // Keep the focus ring on the trigger; the slider still accepts\n        // keyboard once tabbed into.\n        onOpenAutoFocus={(e) => e.preventDefault()}\n      >\n        <span className=\"w-full text-center tabular-nums text-[10px] text-muted-foreground\">\n          {Math.round((muted ? 0 : volume) * 100)}\n        </span>\n        <Slider\n          orientation=\"vertical\"\n          min={0}\n          max={1}\n          step={0.01}\n          value={[muted ? 0 : volume]}\n          onValueChange={([v]) => handleChange(v)}\n          aria-label=\"Volume\"\n          className=\"h-32\"\n        />\n      </PopoverContent>\n    </Popover>\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 last = -1;\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    const timer = setInterval(() => {\n      if (!audio.paused) write();\n    }, READ_INTERVAL_MS);\n    return () => {\n      audio.removeEventListener('seeked', onSeek);\n      audio.removeEventListener('timeupdate', onSeek);\n      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 { 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  | 'autoFocus'\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  autoFocus = false,\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      focus: () => container?.focus(),\n    }),\n    [audio, controls, container],\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  // Declarative autoFocus: focus the container once the DOM node is ready.\n  // Parents that want a *fresh* focus per source remount us via `key={src}`.\n  useEffect(() => {\n    if (!autoFocus || !container) return;\n    container.focus({ preventScroll: true });\n  }, [autoFocus, container]);\n\n  return (\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  );\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    autoFocus,\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        autoFocus={autoFocus}\n        handleRef={ref}\n      />\n    </PlayerProvider>\n  );\n});\n\nPlayer.displayName = 'AudioPlayer';\n","'use client';\n\n// Subscribe to the global active-player id. Reads from activePlayerBus, which\n// already coordinates same-tab + cross-tab via BroadcastChannel.\n\nimport { useSyncExternalStore } from 'react';\nimport {\n  getActivePlayer,\n  getLastActivePlayer,\n  subscribeActivePlayer,\n} from '../store/activePlayerBus';\n\nconst getServerSnapshot = (): string | null => null;\n\n/** Currently active player id. `null` when nothing plays. */\nexport function useActivePlayer(): string | null {\n  return useSyncExternalStore(subscribeActivePlayer, getActivePlayer, getServerSnapshot);\n}\n\n/** Most recently active player id. Stays set after pause; useful for \"last\n * played\" UIs where you want to keep showing a track even when paused. */\nexport function useLastActivePlayer(): string | null {\n  return useSyncExternalStore(subscribeActivePlayer, getLastActivePlayer, getServerSnapshot);\n}\n\n/** True when the given id is currently active. Convenience for conditional\n * styling without comparing strings inline. */\nexport function useIsActivePlayer(id: string | null | undefined): boolean {\n  const active = useActivePlayer();\n  return Boolean(id) && active === id;\n}\n","'use client';\n\n// Read the persistent player preferences (volume, muted). useSyncExternalStore\n// over preferencesStore — re-renders when localStorage changes (same tab or\n// other tab via the native `storage` event).\n\nimport { useSyncExternalStore } from 'react';\nimport {\n  getPreferences,\n  subscribePreferences,\n  type PlayerPreferences,\n} from '../store/preferencesStore';\n\nconst SSR: PlayerPreferences = { volume: 1, muted: false };\nfunction getServerSnapshot(): PlayerPreferences {\n  return SSR;\n}\n\nexport function usePlayerPreferences(): PlayerPreferences {\n  return useSyncExternalStore(subscribePreferences, getPreferences, getServerSnapshot);\n}\n"]}