@lucaismyname/ginger 0.0.24 → 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GingerSplitContexts-BzBExb95.js.map +1 -1
- package/dist/GingerSplitContexts-C7puo0M7.cjs.map +1 -1
- package/dist/analyzer/liveAudioGraph.d.ts.map +1 -1
- package/dist/analyzer/useGingerLiveAnalyzer.d.ts.map +1 -1
- package/dist/audio/GingerPlayer.d.ts.map +1 -1
- package/dist/client.cjs +1 -1
- package/dist/client.js +2 -2
- package/dist/components/controls/Controls.d.ts +6 -3
- package/dist/components/controls/Controls.d.ts.map +1 -1
- package/dist/components/current/Artwork.d.ts.map +1 -1
- package/dist/components/current/Chapters.d.ts +1 -1
- package/dist/components/current/Chapters.d.ts.map +1 -1
- package/dist/components/current/FileUrl.d.ts +1 -1
- package/dist/components/current/FileUrl.d.ts.map +1 -1
- package/dist/components/current/Lyrics.d.ts +1 -1
- package/dist/components/current/Lyrics.d.ts.map +1 -1
- package/dist/components/current/LyricsSynced.d.ts +1 -1
- package/dist/components/current/LyricsSynced.d.ts.map +1 -1
- package/dist/components/current/Playback.d.ts +1 -1
- package/dist/components/current/Playback.d.ts.map +1 -1
- package/dist/components/current/QueueMeta.d.ts +1 -1
- package/dist/components/current/QueueMeta.d.ts.map +1 -1
- package/dist/components/current/Time.d.ts.map +1 -1
- package/dist/components/current/Year.d.ts.map +1 -1
- package/dist/components/current/createTextDisplay.d.ts.map +1 -1
- package/dist/components/current/texts.d.ts.map +1 -1
- package/dist/components/playlist/GingerPlaylist.d.ts.map +1 -1
- package/dist/components/queue/QueueDisplay.d.ts +1 -1
- package/dist/components/queue/QueueDisplay.d.ts.map +1 -1
- package/dist/context/GingerContext.d.ts.map +1 -1
- package/dist/context/GingerLocaleContext.d.ts.map +1 -1
- package/dist/context/GingerProvider.d.ts.map +1 -1
- package/dist/context/GingerSplitContexts.d.ts.map +1 -1
- package/dist/core/playbackReducer.d.ts.map +1 -1
- package/dist/core/queue.d.ts.map +1 -1
- package/dist/core/transitions.d.ts.map +1 -1
- package/dist/{ginger-BoNnuade.js → ginger-DE4TKdCR.js} +950 -894
- package/dist/ginger-DE4TKdCR.js.map +1 -0
- package/dist/ginger-yY4Y5liv.cjs +2 -0
- package/dist/ginger-yY4Y5liv.cjs.map +1 -0
- package/dist/ginger.d.ts +1 -1
- package/dist/ginger.d.ts.map +1 -1
- package/dist/hooks/useControlBindings.d.ts.map +1 -1
- package/dist/hooks/useGinger.d.ts.map +1 -1
- package/dist/hooks/useGingerKeyboardShortcuts.d.ts.map +1 -1
- package/dist/hooks/useGingerLyricsSync.d.ts.map +1 -1
- package/dist/hooks/useSeekDrag.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +2 -2
- package/dist/internal/selectors.d.ts.map +1 -1
- package/dist/testing/helpers.d.ts.map +1 -1
- package/dist/testing/index.cjs +1 -1
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/{useNextTrackPrefetch-CaTRhYHd.cjs → useNextTrackPrefetch-Cs4A1oFv.cjs} +2 -2
- package/dist/useNextTrackPrefetch-Cs4A1oFv.cjs.map +1 -0
- package/dist/{useNextTrackPrefetch-BUx0bK_a.js → useNextTrackPrefetch-eR_p__O2.js} +53 -45
- package/dist/useNextTrackPrefetch-eR_p__O2.js.map +1 -0
- package/dist/waveform/analyzeAudioFile.d.ts.map +1 -1
- package/dist/waveform/index.cjs +1 -1
- package/dist/waveform/index.cjs.map +1 -1
- package/dist/waveform/index.js +91 -84
- package/dist/waveform/index.js.map +1 -1
- package/dist/waveform/useAudioFileAnalysis.d.ts.map +1 -1
- package/dist/waveform/useAudioPeaks.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/ginger-BKmH7kWx.cjs +0 -2
- package/dist/ginger-BKmH7kWx.cjs.map +0 -1
- package/dist/ginger-BoNnuade.js.map +0 -1
- package/dist/useNextTrackPrefetch-BUx0bK_a.js.map +0 -1
- package/dist/useNextTrackPrefetch-CaTRhYHd.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ginger-DE4TKdCR.js","sources":["../src/context/GingerContext.tsx","../src/audio/GingerPlayer.tsx","../src/context/GingerLocaleContext.tsx","../src/internal/formatTime.ts","../src/core/queue.ts","../src/core/transitions.ts","../src/internal/selectors.ts","../src/hooks/useControlBindings.ts","../src/components/controls/Controls.tsx","../src/components/current/createTextDisplay.tsx","../src/components/current/texts.ts","../src/components/current/Year.tsx","../src/components/current/Lyrics.tsx","../src/internal/lyrics.ts","../src/hooks/useGingerLyricsSync.ts","../src/components/current/LyricsSynced.tsx","../src/hooks/useGingerChapters.ts","../src/components/current/Chapters.tsx","../src/components/current/FileUrl.tsx","../src/components/current/Artwork.tsx","../src/components/current/QueueMeta.tsx","../src/components/current/Time.tsx","../src/components/current/Playback.tsx","../src/components/playlist/GingerPlaylist.tsx","../src/components/queue/QueueDisplay.tsx","../src/core/playbackReducer.ts","../src/media/useMediaSession.ts","../src/context/GingerProvider.tsx","../src/ginger.ts"],"sourcesContent":["import { type Dispatch, type MutableRefObject, createContext, useContext } from \"react\";\nimport type {\n GingerAction,\n GingerInitPayload,\n GingerState,\n PlaybackMode,\n PlaylistMeta,\n RepeatMode,\n Track,\n} from \"../types\";\n\nexport type GingerContextValue = {\n state: GingerState;\n dispatch: Dispatch<GingerAction>;\n audioRef: MutableRefObject<HTMLAudioElement | null>;\n notifyEnded: () => void;\n /** Full reset to match `createInitialState` / provider `initial*` props. */\n init: (payload: GingerInitPayload) => void;\n play: () => void;\n pause: () => void;\n togglePlayPause: () => void;\n seek: (timeSeconds: number) => void;\n setVolume: (volume: number) => void;\n setMuted: (muted: boolean) => void;\n toggleMute: () => void;\n setPlaybackRate: (rate: number) => void;\n next: () => void;\n prev: () => void;\n setRepeatMode: (mode: RepeatMode) => void;\n cycleRepeat: () => void;\n toggleShuffle: () => void;\n setQueue: (tracks: Track[], currentIndex?: number) => void;\n insertTrackAt: (track: Track, index?: number, autoPlay?: boolean) => void;\n removeTrackAt: (index: number) => void;\n moveTrack: (fromIndex: number, toIndex: number) => void;\n enqueueNext: (track: Track) => void;\n playTrackAt: (index: number) => void;\n selectTrackAt: (index: number) => void;\n setPlaylistMeta: (meta: PlaylistMeta | null) => void;\n setPlaybackMode: (mode: PlaybackMode) => void;\n};\n\nconst GingerContext = createContext<GingerContextValue | null>(null);\n\nexport function useGingerContext(): GingerContextValue {\n const ctx = useContext(GingerContext);\n if (!ctx) throw new Error(\"Ginger components must be used within <Ginger.Provider>\");\n return ctx;\n}\n\nexport { GingerContext };\n","import { type AudioHTMLAttributes, type CSSProperties, useEffect, useRef, useState } from \"react\";\nimport { useGingerContext } from \"../context/GingerContext\";\n\nexport type GingerPlayerProps = {\n className?: string;\n style?: CSSProperties;\n preload?: AudioHTMLAttributes<HTMLAudioElement>[\"preload\"];\n crossOrigin?: AudioHTMLAttributes<HTMLAudioElement>[\"crossOrigin\"];\n respectReducedMotion?: boolean;\n};\n\nfunction readBufferedFraction(el: HTMLAudioElement): number {\n const { buffered, duration } = el;\n if (!(duration > 0) || buffered.length === 0) return 0;\n return Math.min(1, buffered.end(buffered.length - 1) / duration);\n}\n\nexport function GingerPlayer({\n className,\n style,\n preload = \"metadata\",\n crossOrigin,\n respectReducedMotion = false,\n}: GingerPlayerProps) {\n const { audioRef, dispatch, state, notifyEnded } = useGingerContext();\n const url = state.tracks[state.currentIndex]?.fileUrl ?? \"\";\n const lastTimeSnapshotRef = useRef({\n currentTime: -1,\n duration: -1,\n bufferedFraction: -1,\n });\n /** Avoid MEDIA_SOURCE_CLEARED on first paint with an empty queue (no prior media). */\n const lastActiveUrlRef = useRef(\"\");\n\n const [reducedMotion, setReducedMotion] = useState(false);\n\n useEffect(() => {\n if (!respectReducedMotion || typeof window === \"undefined\") return;\n const mql = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const sync = () => setReducedMotion(mql.matches);\n sync();\n mql.addEventListener(\"change\", sync);\n return () => mql.removeEventListener(\"change\", sync);\n }, [respectReducedMotion]);\n\n const syncTime = (el: HTMLAudioElement, force = false) => {\n const next = {\n currentTime: el.currentTime,\n duration: el.duration,\n bufferedFraction: readBufferedFraction(el),\n };\n const prev = lastTimeSnapshotRef.current;\n const timeThreshold = reducedMotion ? 0.5 : 0.25;\n const changedEnough =\n Math.abs(next.currentTime - prev.currentTime) >= timeThreshold ||\n Math.abs(next.duration - prev.duration) >= 0.01 ||\n Math.abs(next.bufferedFraction - prev.bufferedFraction) >= 0.01;\n if (!force && !changedEnough) return;\n lastTimeSnapshotRef.current = next;\n dispatch({\n type: \"MEDIA_TIME_UPDATE\",\n payload: next,\n });\n };\n\n useEffect(() => {\n const el = audioRef.current;\n if (!el) return;\n el.volume = state.volume;\n el.muted = state.muted;\n }, [audioRef, state.volume, state.muted]);\n\n useEffect(() => {\n const el = audioRef.current;\n if (!el) return;\n if (!url) {\n el.removeAttribute(\"src\");\n lastTimeSnapshotRef.current = { currentTime: -1, duration: -1, bufferedFraction: -1 };\n if (lastActiveUrlRef.current !== \"\") {\n dispatch({ type: \"MEDIA_SOURCE_CLEARED\" });\n }\n lastActiveUrlRef.current = \"\";\n return;\n }\n if (el.getAttribute(\"src\") !== url) {\n el.src = url;\n el.load();\n lastTimeSnapshotRef.current = { currentTime: -1, duration: -1, bufferedFraction: -1 };\n }\n lastActiveUrlRef.current = url;\n }, [audioRef, dispatch, state.currentIndex, state.tracks, url]);\n\n useEffect(() => {\n const el = audioRef.current;\n if (!el) return;\n // Browsers reset playbackRate to 1.0 when source changes + load() runs.\n el.playbackRate = state.playbackRate;\n }, [audioRef, state.playbackRate, url]);\n\n return (\n <audio\n ref={audioRef}\n className={className}\n style={style}\n preload={preload}\n crossOrigin={crossOrigin}\n controls={false}\n playsInline\n onTimeUpdate={(e) => {\n syncTime(e.currentTarget);\n }}\n onLoadedMetadata={(e) => {\n const el = e.currentTarget;\n lastTimeSnapshotRef.current = { currentTime: -1, duration: -1, bufferedFraction: -1 };\n dispatch({\n type: \"MEDIA_LOADED_METADATA\",\n payload: {\n duration: el.duration,\n bufferedFraction: readBufferedFraction(el),\n },\n });\n }}\n onSeeking={(e) => syncTime(e.currentTarget, true)}\n onSeeked={(e) => syncTime(e.currentTarget, true)}\n onEnded={() => notifyEnded()}\n onPlay={() => dispatch({ type: \"MEDIA_PLAY\" })}\n onPause={() => dispatch({ type: \"MEDIA_PAUSE\" })}\n onWaiting={() => dispatch({ type: \"MEDIA_WAITING\" })}\n onCanPlay={() => dispatch({ type: \"MEDIA_CANPLAY\" })}\n onProgress={(e) => syncTime(e.currentTarget, true)}\n onVolumeChange={(e) => {\n const el = e.currentTarget;\n dispatch({\n type: \"MEDIA_VOLUME_SYNC\",\n payload: { volume: el.volume, muted: el.muted },\n });\n }}\n onError={() => {\n const el = audioRef.current;\n const code = el?.error?.code;\n const message =\n code === 1\n ? \"MEDIA_ERR_ABORTED\"\n : code === 2\n ? \"MEDIA_ERR_NETWORK\"\n : code === 3\n ? \"MEDIA_ERR_DECODE\"\n : code === 4\n ? \"MEDIA_ERR_SRC_NOT_SUPPORTED\"\n : \"MEDIA_ERR_UNKNOWN\";\n dispatch({ type: \"MEDIA_ERROR\", payload: { message } });\n }}\n />\n );\n}\n","import { type ReactNode, createContext, useContext } from \"react\";\nimport type { GingerLocaleMessages } from \"../types\";\n\nexport const defaultGingerLocale: GingerLocaleMessages = {\n seek: \"Seek\",\n volume: \"Volume\",\n playbackSpeed: \"Playback speed\",\n nextTrack: \"Next track\",\n previousTrack: \"Previous track\",\n shuffle: \"Shuffle\",\n mute: \"Mute\",\n unmute: \"Unmute\",\n play: \"Play\",\n pause: \"Pause\",\n repeat: {\n off: \"Repeat off\",\n all: \"Repeat all\",\n one: \"Repeat one\",\n },\n playbackRateNormal: \"1× normal\",\n playbackRateTimes: (rate) => `${rate}×`,\n};\n\nfunction mergeLocale(partial?: Partial<GingerLocaleMessages>): GingerLocaleMessages {\n if (!partial) return defaultGingerLocale;\n return {\n ...defaultGingerLocale,\n ...partial,\n repeat: { ...defaultGingerLocale.repeat, ...partial.repeat },\n };\n}\n\nconst GingerLocaleContext = createContext<GingerLocaleMessages>(defaultGingerLocale);\n\nexport function GingerLocaleProvider({\n locale,\n children,\n}: {\n locale?: Partial<GingerLocaleMessages>;\n children: ReactNode;\n}) {\n const value = mergeLocale(locale);\n return <GingerLocaleContext.Provider value={value}>{children}</GingerLocaleContext.Provider>;\n}\n\nexport function useGingerLocale(): GingerLocaleMessages {\n return useContext(GingerLocaleContext);\n}\n","export function formatMmSs(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return \"0:00\";\n const s = Math.floor(seconds % 60);\n const m = Math.floor(seconds / 60);\n return `${m}:${s.toString().padStart(2, \"0\")}`;\n}\n","import type { Track } from \"../types\";\n\nexport function clampIndex(index: number, length: number): number {\n if (length <= 0) return 0;\n return Math.max(0, Math.min(length - 1, index));\n}\n\nexport function shuffleWithAnchor(tracks: Track[], anchorIndex: number): Track[] {\n if (tracks.length <= 1) return [...tracks];\n const anchor = tracks[anchorIndex];\n if (!anchor) return [...tracks];\n const rest = tracks.filter((_, i) => i !== anchorIndex);\n for (let i = rest.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [rest[i], rest[j]] = [rest[j]!, rest[i]!];\n }\n return [anchor, ...rest];\n}\n\nexport function trackIdentity(track: Track | null | undefined): string {\n if (!track) return \"\";\n return track.id != null && track.id !== \"\" ? `id:${track.id}` : `file:${track.fileUrl}`;\n}\n\nexport function findIndexByTrackIdentity(\n tracks: Track[],\n target: Track | null | undefined,\n): number {\n if (!target) return 0;\n const byRef = tracks.findIndex((t) => t === target);\n if (byRef !== -1) return byRef;\n\n const identity = trackIdentity(target);\n if (!identity) return 0;\n\n const matches: number[] = [];\n for (let i = 0; i < tracks.length; i += 1) {\n if (trackIdentity(tracks[i]) === identity) matches.push(i);\n }\n if (matches.length === 0) return 0;\n if (matches.length === 1) return matches[0]!;\n\n const nodeEnv =\n typeof globalThis !== \"undefined\" && \"process\" in globalThis\n ? (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV\n : undefined;\n if (nodeEnv != null && nodeEnv !== \"production\") {\n console.warn(\n \"[@lucaismyname/ginger] Ambiguous track identity: multiple queue rows share the same fileUrl without a unique `id`. Resolving to the first match.\",\n );\n }\n return matches[0]!;\n}\n\nexport function insertTrackAt(tracks: Track[], track: Track, index?: number): Track[] {\n const next = [...tracks];\n const at = Math.max(0, Math.min(next.length, index ?? next.length));\n next.splice(at, 0, track);\n return next;\n}\n\nexport function removeTrackAt(tracks: Track[], index: number): Track[] {\n if (index < 0 || index >= tracks.length) return [...tracks];\n const next = [...tracks];\n next.splice(index, 1);\n return next;\n}\n\nexport function moveTrack(tracks: Track[], fromIndex: number, toIndex: number): Track[] {\n if (\n fromIndex === toIndex ||\n fromIndex < 0 ||\n fromIndex >= tracks.length ||\n toIndex < 0 ||\n toIndex >= tracks.length\n ) {\n return [...tracks];\n }\n const next = [...tracks];\n const [item] = next.splice(fromIndex, 1);\n if (!item) return [...tracks];\n next.splice(toIndex, 0, item);\n return next;\n}\n\nexport function addNextTrack(tracks: Track[], currentIndex: number, track: Track): Track[] {\n return insertTrackAt(tracks, track, Math.max(0, Math.min(tracks.length, currentIndex + 1)));\n}\n","import type { GingerState, RepeatMode, Track } from \"../types\";\nimport { clampIndex } from \"./queue\";\n\n/** Fields used by next/prev/ended navigation; avoids coupling helpers to full `GingerState`. */\nexport type GingerPlaybackNavigationSlice = Pick<\n GingerState,\n \"tracks\" | \"currentIndex\" | \"repeatMode\" | \"playbackMode\"\n>;\n\nexport type EndedTransition =\n | { kind: \"replay_same\" }\n | { kind: \"advance\"; nextIndex: number }\n | { kind: \"wrap\"; nextIndex: number }\n | { kind: \"stop\"; nextIndex: number };\n\nexport function computeEndedTransition(state: GingerPlaybackNavigationSlice): EndedTransition {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return { kind: \"stop\", nextIndex: 0 };\n if (repeatMode === \"one\") return { kind: \"replay_same\" };\n if (playbackMode === \"single\") return { kind: \"stop\", nextIndex: clampIndex(currentIndex, len) };\n if (currentIndex < len - 1) return { kind: \"advance\", nextIndex: currentIndex + 1 };\n if (repeatMode === \"all\") return { kind: \"wrap\", nextIndex: 0 };\n return { kind: \"stop\", nextIndex: clampIndex(currentIndex, len) };\n}\n\nexport function computeNextIndex(state: GingerPlaybackNavigationSlice): number {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return 0;\n if (playbackMode === \"single\") return clampIndex(currentIndex, len);\n if (currentIndex < len - 1) return currentIndex + 1;\n if (repeatMode === \"all\") return 0;\n return clampIndex(currentIndex, len);\n}\n\nexport function computePrevIndex(state: GingerPlaybackNavigationSlice): number {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return 0;\n if (playbackMode === \"single\") return clampIndex(currentIndex, len);\n if (currentIndex > 0) return currentIndex - 1;\n if (repeatMode === \"all\") return len - 1;\n return 0;\n}\n\nexport function cycleRepeatMode(mode: RepeatMode): RepeatMode {\n if (mode === \"off\") return \"all\";\n if (mode === \"all\") return \"one\";\n return \"off\";\n}\n\nexport function resolveArtworkUrl(\n track: Track | null,\n playlistArtwork?: string | null,\n): string | undefined {\n return track?.artworkUrl ?? playlistArtwork ?? undefined;\n}\n\nexport function resolveAlbumLine(\n track: Track | null,\n playlistSubtitle?: string | null,\n): string | undefined {\n return track?.album ?? playlistSubtitle ?? undefined;\n}\n","import { resolveAlbumLine, resolveArtworkUrl } from \"../core/transitions\";\nimport type { GingerState, PlaybackUiState, Track } from \"../types\";\n\nexport function getCurrentTrack(state: GingerState): Track | null {\n const t = state.tracks[state.currentIndex];\n return t ?? null;\n}\n\nexport function derivePlaybackUiState(state: GingerState): PlaybackUiState {\n if (state.errorMessage) return \"error\";\n if (state.tracks.length === 0) return \"idle\";\n if (state.isBuffering) return \"loading\";\n if (!state.isPaused) return \"playing\";\n if (\n Number.isFinite(state.duration) &&\n state.duration > 0 &&\n state.currentTime >= state.duration - 0.05\n ) {\n return \"ended\";\n }\n return \"paused\";\n}\n\nexport function effectiveDuration(state: GingerState): number {\n const d = state.duration;\n if (Number.isFinite(d) && d > 0) return d;\n const hint = state.tracks[state.currentIndex]?.durationSeconds;\n if (typeof hint === \"number\" && Number.isFinite(hint) && hint > 0) return hint;\n return 0;\n}\n\nexport function effectiveRemaining(state: GingerState): number {\n const dur = effectiveDuration(state);\n const rem = dur - state.currentTime;\n return Number.isFinite(rem) ? Math.max(0, rem) : 0;\n}\n\nexport function progressFraction(state: GingerState): number {\n const dur = effectiveDuration(state);\n if (!(dur > 0)) return 0;\n return Math.min(1, Math.max(0, state.currentTime / dur));\n}\n\nexport function resolvedArtwork(state: GingerState): string | undefined {\n const track = getCurrentTrack(state);\n return resolveArtworkUrl(track, state.playlistMeta?.artworkUrl);\n}\n\nexport function resolvedAlbumLine(state: GingerState): string | undefined {\n const track = getCurrentTrack(state);\n return resolveAlbumLine(track, state.playlistMeta?.subtitle);\n}\n","import { useMemo } from \"react\";\nimport type { FormEvent } from \"react\";\nimport { useGingerLocale } from \"../context/GingerLocaleContext\";\nimport {\n gingerStateFromContextValues,\n useGingerMedia,\n useGingerPlayback,\n} from \"../context/GingerSplitContexts\";\nimport { formatMmSs } from \"../internal/formatTime\";\nimport { effectiveDuration } from \"../internal/selectors\";\nimport type { GingerState } from \"../types\";\n\nexport type SeekBarBinding = {\n state: GingerState;\n value: number;\n min: number;\n max: number;\n step: \"any\";\n ariaValueText: string;\n ariaLabel: string;\n onSeekInput: (e: FormEvent<HTMLInputElement>) => void;\n onSeekChange: (e: FormEvent<HTMLInputElement>) => void;\n};\n\n/** Headless seek slider: bind return value to `<input type=\"range\" />` or your own component. */\nexport function useSeekBarBinding(): SeekBarBinding {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n const locale = useGingerLocale();\n const state = useMemo(() => gingerStateFromContextValues(pb, md), [pb, md]);\n const duration = effectiveDuration(state);\n const value = duration > 0 ? state.currentTime : 0;\n const numericValue = Number.isFinite(value) ? value : 0;\n const ariaValueText =\n duration > 0\n ? `${formatMmSs(numericValue)} of ${formatMmSs(duration)}`\n : formatMmSs(numericValue);\n\n const onSeekInput = (e: FormEvent<HTMLInputElement>) => {\n md.seek(Number(e.currentTarget.value));\n };\n\n return {\n state,\n value: numericValue,\n min: 0,\n max: duration > 0 ? duration : 1,\n step: \"any\",\n ariaValueText,\n ariaLabel: locale.seek,\n onSeekInput,\n onSeekChange: onSeekInput,\n };\n}\n\nexport type VolumeBinding = {\n state: GingerState;\n value: number;\n min: number;\n max: number;\n step: \"any\";\n ariaValueText: string;\n ariaLabel: string;\n onVolumeInput: (e: FormEvent<HTMLInputElement>) => void;\n onVolumeChange: (e: FormEvent<HTMLInputElement>) => void;\n};\n\n/** Headless volume slider. */\nexport function useVolumeSlider(): VolumeBinding {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n const locale = useGingerLocale();\n const state = useMemo(() => gingerStateFromContextValues(pb, md), [pb, md]);\n\n const onVolumeInput = (e: FormEvent<HTMLInputElement>) => {\n md.setVolume(Number(e.currentTarget.value));\n };\n\n return {\n state,\n value: state.volume,\n min: 0,\n max: 1,\n step: \"any\",\n ariaValueText: `${Math.round(state.volume * 100)}%`,\n ariaLabel: locale.volume,\n onVolumeInput,\n onVolumeChange: onVolumeInput,\n };\n}\n\nexport type PlayPauseBinding = {\n isPaused: boolean;\n toggle: () => void;\n /** Resolved aria label for the button’s *next* action (play vs pause). */\n ariaLabel: string;\n};\n\n/** Headless play/pause control; use with `playAriaLabel` / `pauseAriaLabel` from locale or custom strings. */\nexport function usePlayPauseBinding(options?: {\n playAriaLabel?: string;\n pauseAriaLabel?: string;\n}): PlayPauseBinding {\n const pb = useGingerPlayback();\n const locale = useGingerLocale();\n const playL = options?.playAriaLabel ?? locale.play;\n const pauseL = options?.pauseAriaLabel ?? locale.pause;\n return {\n isPaused: pb.isPaused,\n toggle: pb.togglePlayPause,\n ariaLabel: pb.isPaused ? playL : pauseL,\n };\n}\n","import { useMemo } from \"react\";\nimport type {\n ButtonHTMLAttributes,\n CSSProperties,\n InputHTMLAttributes,\n ReactNode,\n SelectHTMLAttributes,\n} from \"react\";\nimport { useGingerLocale } from \"../../context/GingerLocaleContext\";\nimport { useGingerMedia, useGingerPlayback } from \"../../context/GingerSplitContexts\";\nimport {\n usePlayPauseBinding,\n useSeekBarBinding,\n useVolumeSlider,\n} from \"../../hooks/useControlBindings\";\n\nexport type PlayPauseProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Optional labels; still headless—defaults are text for a11y */\n playLabel?: ReactNode;\n pauseLabel?: ReactNode;\n /** Screen-reader label when paused (playing would start); defaults to match `playLabel` when it is a string */\n playAriaLabel?: string;\n /** Screen-reader label when playing (action would pause); defaults to match `pauseLabel` when it is a string */\n pauseAriaLabel?: string;\n children?: ReactNode;\n};\n\nexport function PlayPause({\n playLabel = \"Play\",\n pauseLabel = \"Pause\",\n playAriaLabel,\n pauseAriaLabel,\n children,\n type = \"button\",\n onClick,\n ...rest\n}: PlayPauseProps) {\n const locale = useGingerLocale();\n const defaultPlayAria = typeof playLabel === \"string\" ? playLabel : locale.play;\n const defaultPauseAria = typeof pauseLabel === \"string\" ? pauseLabel : locale.pause;\n const b = usePlayPauseBinding({\n playAriaLabel: playAriaLabel ?? defaultPlayAria,\n pauseAriaLabel: pauseAriaLabel ?? defaultPauseAria,\n });\n return (\n <button\n {...rest}\n type={type}\n aria-label={b.ariaLabel}\n onClick={(e) => {\n b.toggle();\n onClick?.(e);\n }}\n >\n {children ?? (b.isPaused ? playLabel : pauseLabel)}\n </button>\n );\n}\n\nPlayPause.displayName = \"Ginger.Control.PlayPause\";\n\nexport type RepeatProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n children?: ReactNode;\n};\n\nexport function Repeat({ type = \"button\", ariaLabel, onClick, children, ...rest }: RepeatProps) {\n const { repeatMode, cycleRepeat } = useGingerPlayback();\n const locale = useGingerLocale();\n const label = locale.repeat[repeatMode];\n return (\n <button\n {...rest}\n type={type}\n aria-label={ariaLabel ?? label}\n onClick={(e) => {\n cycleRepeat();\n onClick?.(e);\n }}\n >\n {children ?? label}\n </button>\n );\n}\n\nRepeat.displayName = \"Ginger.Control.Repeat\";\n\nexport type NextProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n};\nexport function Next({\n type = \"button\",\n children = \"Next\",\n ariaLabel,\n onClick,\n ...rest\n}: NextProps) {\n const { next } = useGingerPlayback();\n const locale = useGingerLocale();\n return (\n <button\n {...rest}\n type={type}\n aria-label={ariaLabel ?? locale.nextTrack}\n onClick={(e) => {\n next();\n onClick?.(e);\n }}\n >\n {children ?? locale.nextTrack}\n </button>\n );\n}\nNext.displayName = \"Ginger.Control.Next\";\n\nexport type PreviousProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n};\nexport function Previous({\n type = \"button\",\n children = \"Previous\",\n ariaLabel,\n onClick,\n ...rest\n}: PreviousProps) {\n const { prev } = useGingerPlayback();\n const locale = useGingerLocale();\n return (\n <button\n {...rest}\n type={type}\n aria-label={ariaLabel ?? locale.previousTrack}\n onClick={(e) => {\n prev();\n onClick?.(e);\n }}\n >\n {children}\n </button>\n );\n}\nPrevious.displayName = \"Ginger.Control.Previous\";\n\nexport type ShuffleProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n};\nexport function Shuffle({\n type = \"button\",\n children = \"Shuffle\",\n ariaLabel,\n onClick,\n ...rest\n}: ShuffleProps) {\n const { isShuffled, toggleShuffle } = useGingerPlayback();\n const locale = useGingerLocale();\n return (\n <button\n {...rest}\n type={type}\n aria-pressed={isShuffled}\n aria-label={ariaLabel ?? locale.shuffle}\n onClick={(e) => {\n toggleShuffle();\n onClick?.(e);\n }}\n >\n {children ?? locale.shuffle}\n </button>\n );\n}\nShuffle.displayName = \"Ginger.Control.Shuffle\";\n\nexport type SeekBarProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"value\" | \"onChange\" | \"onInput\" | \"min\" | \"max\" | \"step\"\n> & {\n /** Remove default width style for fully custom styling. */\n unstyled?: boolean;\n ariaLabel?: string;\n inputStyle?: CSSProperties;\n};\n\nexport function SeekBar({ inputStyle, style, unstyled = false, ariaLabel, ...rest }: SeekBarProps) {\n const b = useSeekBarBinding();\n const mergedStyle = unstyled\n ? { ...style, ...inputStyle }\n : { width: \"100%\", ...style, ...inputStyle };\n return (\n <input\n {...rest}\n type=\"range\"\n min={b.min}\n max={b.max}\n step={b.step}\n value={b.value}\n aria-label={ariaLabel ?? b.ariaLabel}\n aria-valuetext={b.ariaValueText}\n onInput={b.onSeekInput}\n onChange={b.onSeekChange}\n style={mergedStyle}\n />\n );\n}\n\nSeekBar.displayName = \"Ginger.Control.SeekBar\";\n\nexport type VolumeProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"value\" | \"onChange\" | \"onInput\" | \"min\" | \"max\" | \"step\"\n> & {\n /** Remove default width style for fully custom styling. */\n unstyled?: boolean;\n ariaLabel?: string;\n inputStyle?: CSSProperties;\n};\n\nexport function Volume({ inputStyle, style, unstyled = false, ariaLabel, ...rest }: VolumeProps) {\n const b = useVolumeSlider();\n const mergedStyle = unstyled\n ? { ...style, ...inputStyle }\n : { width: \"100%\", ...style, ...inputStyle };\n return (\n <input\n {...rest}\n type=\"range\"\n min={b.min}\n max={b.max}\n step={b.step}\n value={b.value}\n aria-label={ariaLabel ?? b.ariaLabel}\n aria-valuetext={b.ariaValueText}\n onInput={b.onVolumeInput}\n onChange={b.onVolumeChange}\n style={mergedStyle}\n />\n );\n}\n\nVolume.displayName = \"Ginger.Control.Volume\";\n\nexport type MuteProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n muteLabel?: ReactNode;\n unmuteLabel?: ReactNode;\n children?: ReactNode;\n};\n\nexport function Mute({\n ariaLabel,\n muteLabel,\n unmuteLabel,\n type = \"button\",\n onClick,\n children,\n ...rest\n}: MuteProps) {\n const { muted, toggleMute } = useGingerMedia();\n const locale = useGingerLocale();\n const m = muteLabel ?? locale.mute;\n const u = unmuteLabel ?? locale.unmute;\n return (\n <button\n {...rest}\n type={type}\n aria-pressed={muted}\n aria-label={ariaLabel ?? (muted ? locale.unmute : locale.mute)}\n onClick={(e) => {\n toggleMute();\n onClick?.(e);\n }}\n >\n {children ?? (muted ? u : m)}\n </button>\n );\n}\n\nMute.displayName = \"Ginger.Control.Mute\";\n\nconst defaultRates = [0.5, 0.75, 1, 1.25, 1.5, 2] as const;\n\nexport type PlaybackRateProps = Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n \"value\" | \"onChange\"\n> & {\n /** Playback speed options (default: 0.5 … 2) */\n rates?: readonly number[];\n ariaLabel?: string;\n children?: ReactNode;\n};\n\nexport function PlaybackRate({\n rates = defaultRates,\n style,\n ariaLabel,\n children,\n ...rest\n}: PlaybackRateProps) {\n const { playbackRate, setPlaybackRate } = useGingerMedia();\n const locale = useGingerLocale();\n const options = useMemo(\n () => Array.from(new Set([...rates, playbackRate])).sort((a, b) => a - b),\n [rates, playbackRate],\n );\n return (\n <select\n {...rest}\n aria-label={ariaLabel ?? locale.playbackSpeed}\n value={String(playbackRate)}\n style={style}\n onChange={(e) => setPlaybackRate(Number(e.currentTarget.value))}\n >\n {children ?? locale.playbackSpeed}\n {options.map((r) => (\n <option key={r} value={String(r)}>\n {r === 1 ? locale.playbackRateNormal : locale.playbackRateTimes(r)}\n </option>\n ))}\n </select>\n );\n}\n\nPlaybackRate.displayName = \"Ginger.Control.PlaybackRate\";\n","import type { ReactElement, ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { getCurrentTrack } from \"../../internal/selectors\";\nimport type { DisplayBaseProps, GingerState, Track } from \"../../types\";\n\nexport type TextDisplayProps = DisplayBaseProps & {\n children?: (value: string, state: GingerState) => ReactNode;\n};\n\nexport function createTextDisplay(\n displayName: string,\n select: (state: GingerState) => string | undefined,\n): (props: TextDisplayProps) => ReactElement | null {\n function Comp(props: TextDisplayProps) {\n const state = useGingerState();\n const raw = select(state) ?? \"\";\n const value = raw.trim();\n const { className, style, fallback, empty, children } = props;\n if (!value) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n if (children)\n return (\n <span className={className} style={style}>\n {children(value, state)}\n </span>\n );\n return (\n <span className={className} style={style}>\n {value}\n </span>\n );\n }\n Comp.displayName = displayName;\n return Comp;\n}\n\nexport function createTrackFieldDisplay(\n displayName: string,\n select: (track: Track | null) => string | undefined,\n): (props: TextDisplayProps) => ReactElement | null {\n return createTextDisplay(displayName, (state) => select(getCurrentTrack(state)));\n}\n","import { getCurrentTrack, resolvedAlbumLine } from \"../../internal/selectors\";\nimport { createTextDisplay, createTrackFieldDisplay } from \"./createTextDisplay\";\n\nexport const Title = createTrackFieldDisplay(\"Ginger.Current.Title\", (t) => t?.title);\nexport const Artist = createTrackFieldDisplay(\"Ginger.Current.Artist\", (t) => t?.artist);\nexport const Album = createTextDisplay(\"Ginger.Current.Album\", (s) => resolvedAlbumLine(s));\nexport const Description = createTrackFieldDisplay(\n \"Ginger.Current.Description\",\n (t) => t?.description,\n);\nexport const Copyright = createTextDisplay(\"Ginger.Current.Copyright\", (s) => {\n const t = getCurrentTrack(s);\n return t?.copyright ?? s.playlistMeta?.copyright;\n});\nexport const Genre = createTrackFieldDisplay(\"Ginger.Current.Genre\", (t) => t?.genre);\nexport const Label = createTrackFieldDisplay(\"Ginger.Current.Label\", (t) => t?.label);\nexport const Isrc = createTrackFieldDisplay(\"Ginger.Current.Isrc\", (t) => t?.isrc);\nexport const TrackNumber = createTrackFieldDisplay(\"Ginger.Current.TrackNumber\", (t) =>\n t?.trackNumber != null ? String(t.trackNumber) : undefined,\n);\n","import { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { getCurrentTrack } from \"../../internal/selectors\";\nimport type { TextDisplayProps } from \"./createTextDisplay\";\n\nexport type YearProps = TextDisplayProps & {\n format?: (year: number) => string;\n};\n\nexport function Year({ className, style, fallback, empty, children, format }: YearProps) {\n const state = useGingerState();\n const y = getCurrentTrack(state)?.year;\n if (typeof y !== \"number\" || !Number.isFinite(y)) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const text = format ? format(y) : String(y);\n if (children)\n return (\n <span className={className} style={style}>\n {children(text, state)}\n </span>\n );\n return (\n <span className={className} style={style}>\n {text}\n </span>\n );\n}\n\nYear.displayName = \"Ginger.Current.Year\";\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { getCurrentTrack } from \"../../internal/selectors\";\nimport type { DisplayBaseProps, GingerState } from \"../../types\";\n\nexport type LyricsProps = DisplayBaseProps & {\n children?: (value: string, state: GingerState) => ReactNode;\n /** When true, preserves internal newlines; trims only leading/trailing whitespace */\n preserveWhitespace?: boolean;\n};\n\nexport function Lyrics({\n className,\n style,\n fallback,\n empty,\n children,\n preserveWhitespace = true,\n}: LyricsProps) {\n const state = useGingerState();\n const raw = getCurrentTrack(state)?.lyrics ?? \"\";\n const value = preserveWhitespace ? raw.replace(/^\\s+|\\s+$/g, \"\") : raw.trim();\n if (!value) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const whiteStyle: CSSProperties | undefined = preserveWhitespace\n ? { whiteSpace: \"pre-wrap\" }\n : undefined;\n if (children)\n return (\n <span className={className} style={{ ...whiteStyle, ...style }}>\n {children(value, state)}\n </span>\n );\n return (\n <span className={className} style={{ ...whiteStyle, ...style }}>\n {value}\n </span>\n );\n}\n\nLyrics.displayName = \"Ginger.Current.Lyrics\";\n","export type TimedLyricLine = {\n time: number;\n text: string;\n};\n\nconst lrcTag = /\\[(\\d{1,2}):(\\d{2})(?:\\.(\\d{1,3}))?\\]/g;\n\nexport function parseLrc(lrc: string): TimedLyricLine[] {\n const lines: TimedLyricLine[] = [];\n for (const rawLine of lrc.split(/\\r?\\n/)) {\n const matches = [...rawLine.matchAll(lrcTag)];\n if (matches.length === 0) continue;\n const text = rawLine.replace(lrcTag, \"\").trim();\n for (const m of matches) {\n const minutes = Number(m[1] ?? 0);\n const seconds = Number(m[2] ?? 0);\n const millis = Number((m[3] ?? \"0\").padEnd(3, \"0\"));\n const time = minutes * 60 + seconds + millis / 1000;\n if (Number.isFinite(time) && time >= 0) {\n lines.push({ time, text });\n }\n }\n }\n return lines.sort((a, b) => a.time - b.time);\n}\n","import { useMemo } from \"react\";\nimport { useGingerMedia, useGingerPlayback } from \"../context/GingerSplitContexts\";\nimport { type TimedLyricLine, parseLrc } from \"../internal/lyrics\";\n\nexport type GingerLyricsSyncState = {\n lines: TimedLyricLine[];\n activeIndex: number;\n activeLine: TimedLyricLine | null;\n};\n\nexport function useGingerLyricsSync(): GingerLyricsSyncState {\n const { tracks, currentIndex } = useGingerPlayback();\n const { currentTime } = useGingerMedia();\n const currentTrack = tracks[currentIndex];\n\n const lines = useMemo(() => {\n if (!currentTrack) return [];\n if (Array.isArray(currentTrack.lyricsTimed) && currentTrack.lyricsTimed.length > 0) {\n return [...currentTrack.lyricsTimed]\n .filter((line) => Number.isFinite(line.time) && line.time >= 0)\n .sort((a, b) => a.time - b.time);\n }\n if (typeof currentTrack.lyrics === \"string\") {\n return parseLrc(currentTrack.lyrics);\n }\n return [];\n }, [currentTrack]);\n\n const activeIndex = useMemo(() => {\n for (let i = lines.length - 1; i >= 0; i -= 1) {\n if (currentTime >= lines[i]!.time) return i;\n }\n return -1;\n }, [currentTime, lines]);\n\n return {\n lines,\n activeIndex,\n activeLine: activeIndex >= 0 ? (lines[activeIndex] ?? null) : null,\n };\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { useGingerLyricsSync } from \"../../hooks/useGingerLyricsSync\";\nimport type { TimedLyricLine } from \"../../internal/lyrics\";\nimport type { DisplayBaseProps, GingerState } from \"../../types\";\n\nexport type LyricsSyncedProps = Omit<DisplayBaseProps, \"children\"> & {\n unstyled?: boolean;\n /** Class applied to the line that matches the current playback time. */\n activeClassName?: string;\n /** Class applied to every line. */\n lineClassName?: string;\n children?: (\n line: TimedLyricLine,\n index: number,\n active: boolean,\n state: GingerState,\n ) => ReactNode;\n};\n\nexport function LyricsSynced({\n className,\n style,\n fallback,\n empty,\n unstyled = false,\n activeClassName,\n lineClassName,\n children,\n}: LyricsSyncedProps) {\n const state = useGingerState();\n const { lines, activeIndex } = useGingerLyricsSync();\n\n if (lines.length === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n\n const listStyle: CSSProperties = unstyled\n ? {}\n : {\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n fontFamily: \"var(--ginger-font-family, system-ui, sans-serif)\",\n fontSize: \"var(--ginger-font-size, 14px)\",\n color: \"var(--ginger-primary-color, #111827)\",\n };\n\n return (\n <ul className={className} style={{ ...listStyle, ...style }} aria-label=\"Synced lyrics\">\n {lines.map((line, index) => {\n const active = index === activeIndex;\n return (\n <li\n key={`${line.time}-${index}`}\n aria-current={active ? \"true\" : undefined}\n data-ginger-active={active || undefined}\n className={\n [lineClassName, active ? activeClassName : undefined].filter(Boolean).join(\" \") ||\n undefined\n }\n style={\n unstyled\n ? undefined\n : {\n padding: \"var(--ginger-playlist-row-padding, 4px 8px)\",\n fontWeight: active ? 600 : 400,\n opacity: active ? 1 : 0.75,\n }\n }\n >\n {children ? children(line, index, active, state) : line.text}\n </li>\n );\n })}\n </ul>\n );\n}\n\nLyricsSynced.displayName = \"Ginger.Current.LyricsSynced\";\n","import { useMemo } from \"react\";\nimport { useGingerMedia, useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type GingerChapter = {\n title: string;\n startSeconds: number;\n};\n\nexport type GingerChapterState = {\n list: GingerChapter[];\n activeIndex: number;\n active: GingerChapter | null;\n seekTo: (index: number) => void;\n};\n\nexport function useGingerChapters(): GingerChapterState {\n const { tracks, currentIndex } = useGingerPlayback();\n const { currentTime, seek } = useGingerMedia();\n\n const list = useMemo(() => {\n const chapters = tracks[currentIndex]?.chapters ?? [];\n return [...chapters]\n .filter((item) => item && Number.isFinite(item.startSeconds) && item.startSeconds >= 0)\n .sort((a, b) => a.startSeconds - b.startSeconds);\n }, [currentIndex, tracks]);\n\n const activeIndex = useMemo(() => {\n if (list.length === 0) return -1;\n for (let i = list.length - 1; i >= 0; i -= 1) {\n if (currentTime >= list[i]!.startSeconds) return i;\n }\n return -1;\n }, [currentTime, list]);\n\n return {\n list,\n activeIndex,\n active: activeIndex >= 0 ? (list[activeIndex] ?? null) : null,\n seekTo: (index: number) => {\n const chapter = list[index];\n if (chapter) seek(chapter.startSeconds);\n },\n };\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { type GingerChapter, useGingerChapters } from \"../../hooks/useGingerChapters\";\nimport { formatMmSs } from \"../../internal/formatTime\";\nimport type { DisplayBaseProps, GingerState } from \"../../types\";\n\nexport type ChaptersProps = Omit<DisplayBaseProps, \"children\"> & {\n /** Remove default list/row styles for fully custom styling. */\n unstyled?: boolean;\n /** Prefix before each chapter title (default: `formatMmSs(startSeconds)`). */\n formatStart?: (startSeconds: number) => string;\n children?: (\n chapter: GingerChapter,\n index: number,\n active: boolean,\n state: GingerState,\n ) => ReactNode;\n};\n\nexport function Chapters({\n className,\n style,\n fallback,\n empty,\n unstyled = false,\n formatStart = formatMmSs,\n children,\n}: ChaptersProps) {\n const state = useGingerState();\n const { list, activeIndex, seekTo } = useGingerChapters();\n\n if (list.length === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n\n const listStyle: CSSProperties = unstyled\n ? {}\n : {\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n fontFamily: \"var(--ginger-font-family, system-ui, sans-serif)\",\n fontSize: \"var(--ginger-font-size, 14px)\",\n color: \"var(--ginger-primary-color, #111827)\",\n };\n\n return (\n <ul className={className} style={{ ...listStyle, ...style }} aria-label=\"Chapters\">\n {list.map((chapter, index) => {\n const active = index === activeIndex;\n return (\n <li key={`${chapter.startSeconds}-${chapter.title}`}>\n <button\n type=\"button\"\n aria-current={active ? \"true\" : undefined}\n data-ginger-active={active || undefined}\n onClick={() => seekTo(index)}\n style={{\n width: unstyled ? undefined : \"100%\",\n textAlign: unstyled ? undefined : \"left\",\n border: unstyled ? undefined : \"none\",\n background: unstyled\n ? undefined\n : active\n ? \"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))\"\n : \"transparent\",\n color: unstyled ? undefined : \"inherit\",\n font: unstyled ? undefined : \"inherit\",\n cursor: unstyled ? undefined : \"pointer\",\n padding: unstyled ? undefined : \"var(--ginger-playlist-row-padding, 6px 8px)\",\n }}\n >\n {children ? (\n children(chapter, index, active, state)\n ) : (\n <span>\n <span style={{ opacity: 0.75, marginRight: \"0.35em\" }}>\n {formatStart(chapter.startSeconds)}\n </span>\n {chapter.title}\n </span>\n )}\n </button>\n </li>\n );\n })}\n </ul>\n );\n}\n\nChapters.displayName = \"Ginger.Current.Chapters\";\n","import { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { getCurrentTrack } from \"../../internal/selectors\";\nimport type { TextDisplayProps } from \"./createTextDisplay\";\n\nexport type FileUrlProps = TextDisplayProps & {\n /** When false (default), renders nothing unless you explicitly opt in */\n visible?: boolean;\n};\n\nexport function FileUrl({\n visible = false,\n className,\n style,\n fallback,\n empty,\n children,\n}: FileUrlProps) {\n const state = useGingerState();\n if (!visible) return null;\n const value = getCurrentTrack(state)?.fileUrl ?? \"\";\n if (!value) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n if (children)\n return (\n <span className={className} style={style}>\n {children(value, state)}\n </span>\n );\n return (\n <span className={className} style={style}>\n {value}\n </span>\n );\n}\n\nFileUrl.displayName = \"Ginger.Current.FileUrl\";\n","import type { CSSProperties, ImgHTMLAttributes } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { getCurrentTrack, resolvedArtwork } from \"../../internal/selectors\";\nimport type { DisplayBaseProps } from \"../../types\";\n\nexport type ArtworkProps = DisplayBaseProps &\n Pick<ImgHTMLAttributes<HTMLImageElement>, \"sizes\" | \"loading\" | \"onError\" | \"decoding\"> & {\n /** Remove default wrapper/image styles for fully custom layout. */\n unstyled?: boolean;\n imgStyle?: CSSProperties;\n };\n\nexport function Artwork({\n className,\n style,\n fallback,\n empty,\n sizes,\n loading,\n onError,\n decoding,\n unstyled = false,\n imgStyle,\n}: ArtworkProps) {\n const state = useGingerState();\n const track = getCurrentTrack(state);\n const src = resolvedArtwork(state);\n if (!src) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const alt = [track?.title, track?.artist].filter(Boolean).join(\" — \") || \"Artwork\";\n return (\n <div\n className={className}\n style={\n unstyled\n ? { ...style }\n : {\n background: \"var(--ginger-artwork-bg, transparent)\",\n borderRadius: \"var(--ginger-artwork-radius, 0)\",\n overflow: \"hidden\",\n ...style,\n }\n }\n >\n <img\n src={src}\n alt={alt}\n sizes={sizes}\n loading={loading}\n decoding={decoding}\n onError={onError}\n style={{\n display: unstyled ? undefined : \"block\",\n width: unstyled ? undefined : \"100%\",\n height: unstyled ? undefined : \"100%\",\n objectFit: unstyled ? undefined : \"cover\",\n ...imgStyle,\n }}\n />\n </div>\n );\n}\n\nArtwork.displayName = \"Ginger.Current.Artwork\";\n","import type { ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport type { DisplayBaseProps, GingerState } from \"../../types\";\n\nexport type QueueIndexProps = DisplayBaseProps & {\n base?: 0 | 1;\n children?: (value: string, state: GingerState) => ReactNode;\n};\n\nexport function QueueIndex({\n base = 0,\n className,\n style,\n fallback,\n empty,\n children,\n}: QueueIndexProps) {\n const state = useGingerState();\n const len = state.tracks.length;\n if (len === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const value = String(state.currentIndex + base);\n if (children)\n return (\n <span className={className} style={style}>\n {children(value, state)}\n </span>\n );\n return (\n <span className={className} style={style}>\n {value}\n </span>\n );\n}\n\nQueueIndex.displayName = \"Ginger.Current.QueueIndex\";\n\nexport type QueueLengthProps = DisplayBaseProps & {\n children?: (value: string, state: GingerState) => ReactNode;\n};\n\nexport function QueueLength({ className, style, fallback, empty, children }: QueueLengthProps) {\n const state = useGingerState();\n const value = String(state.tracks.length);\n if (state.tracks.length === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n if (children)\n return (\n <span className={className} style={style}>\n {children(value, state)}\n </span>\n );\n return (\n <span className={className} style={style}>\n {value}\n </span>\n );\n}\n\nQueueLength.displayName = \"Ginger.Current.QueueLength\";\n\nexport type QueuePositionProps = DisplayBaseProps & {\n base?: 0 | 1;\n separator?: string;\n children?: (\n value: { index: string; length: string; label: string },\n state: GingerState,\n ) => ReactNode;\n};\n\nexport function QueuePosition({\n base = 0,\n separator = \" / \",\n className,\n style,\n fallback,\n empty,\n children,\n}: QueuePositionProps) {\n const state = useGingerState();\n const len = state.tracks.length;\n if (len === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const index = String(state.currentIndex + base);\n const length = String(len);\n const label = `${index}${separator}${length}`;\n if (children)\n return (\n <span className={className} style={style}>\n {children({ index, length, label }, state)}\n </span>\n );\n return (\n <span className={className} style={style}>\n {label}\n </span>\n );\n}\n\nQueuePosition.displayName = \"Ginger.Current.QueuePosition\";\n","import type { ReactElement, ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { formatMmSs } from \"../../internal/formatTime\";\nimport { effectiveDuration, effectiveRemaining, progressFraction } from \"../../internal/selectors\";\nimport type { DisplayBaseProps, GingerState } from \"../../types\";\n\nexport type TimeTextProps = DisplayBaseProps & {\n format?: (seconds: number) => string;\n children?: (value: string, state: GingerState) => ReactNode;\n};\n\nfunction renderTime(\n valueSeconds: number,\n state: GingerState,\n props: TimeTextProps,\n): ReactElement | null {\n const { className, style, fallback, empty, children, format = formatMmSs } = props;\n if (!(valueSeconds >= 0) || !Number.isFinite(valueSeconds)) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const text = format(valueSeconds);\n if (children)\n return (\n <span className={className} style={style}>\n {children(text, state)}\n </span>\n );\n return (\n <span className={className} style={style}>\n {text}\n </span>\n );\n}\n\nexport function Elapsed(props: TimeTextProps) {\n const state = useGingerState();\n return renderTime(state.currentTime, state, props);\n}\n\nElapsed.displayName = \"Ginger.Current.Elapsed\";\n\nexport function Duration(props: TimeTextProps) {\n const state = useGingerState();\n return renderTime(effectiveDuration(state), state, props);\n}\n\nDuration.displayName = \"Ginger.Current.Duration\";\n\nexport function Remaining(props: TimeTextProps) {\n const state = useGingerState();\n return renderTime(effectiveRemaining(state), state, props);\n}\n\nRemaining.displayName = \"Ginger.Current.Remaining\";\n\nexport type ProgressProps = DisplayBaseProps & {\n children?: (\n value: { fraction: number; currentTime: number; duration: number },\n state: GingerState,\n ) => ReactNode;\n};\n\nexport function Progress({ className, style, fallback, empty, children }: ProgressProps) {\n const state = useGingerState();\n const duration = effectiveDuration(state);\n const fraction = progressFraction(state);\n if (!(duration > 0)) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n if (children)\n return (\n <span className={className} style={style}>\n {children({ fraction, currentTime: state.currentTime, duration }, state)}\n </span>\n );\n return (\n <span className={className} style={style}>\n {`${Math.round(fraction * 100)}%`}\n </span>\n );\n}\n\nProgress.displayName = \"Ginger.Current.Progress\";\n\nexport type TimeRailProps = DisplayBaseProps & {\n /** 0-1 height in px for the rail */\n height?: number;\n /** When true, shows a buffered range behind the progress fill (uses `bufferedFraction`). */\n showBuffered?: boolean;\n /** Remove default rail styles and render only inline width values. */\n unstyled?: boolean;\n};\n\nexport function TimeRail({\n className,\n style,\n height = 4,\n showBuffered = false,\n unstyled = false,\n}: TimeRailProps) {\n const state = useGingerState();\n const progressPct = `${Math.round(progressFraction(state) * 100)}%`;\n const bufPct = `${Math.round(Math.min(1, Math.max(0, state.bufferedFraction)) * 100)}%`;\n return (\n <div\n className={className}\n style={\n unstyled\n ? { ...style }\n : {\n width: \"100%\",\n height,\n background: \"var(--ginger-muted-color, #e5e7eb)\",\n borderRadius: 999,\n overflow: \"hidden\",\n position: \"relative\",\n ...style,\n }\n }\n aria-hidden\n >\n {showBuffered ? (\n <div\n style={{\n position: unstyled ? undefined : \"absolute\",\n left: unstyled ? undefined : 0,\n top: unstyled ? undefined : 0,\n height: unstyled ? undefined : \"100%\",\n width: bufPct,\n background: unstyled\n ? undefined\n : \"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))\",\n }}\n />\n ) : null}\n <div\n style={{\n position: unstyled ? undefined : \"relative\",\n width: progressPct,\n height: unstyled ? undefined : \"100%\",\n background: unstyled ? undefined : \"var(--ginger-primary-color, #111827)\",\n }}\n />\n </div>\n );\n}\n\nTimeRail.displayName = \"Ginger.Current.TimeRail\";\n\nexport type BufferRailProps = DisplayBaseProps & {\n height?: number;\n /** Remove default rail styles and render only buffered width value. */\n unstyled?: boolean;\n};\n\n/** Buffered portion of the timeline (0…`bufferedFraction`); pair with `TimeRail` or use alone. */\nexport function BufferRail({ className, style, height = 4, unstyled = false }: BufferRailProps) {\n const state = useGingerState();\n const bufPct = `${Math.round(Math.min(1, Math.max(0, state.bufferedFraction)) * 100)}%`;\n return (\n <div\n className={className}\n style={\n unstyled\n ? { ...style }\n : {\n width: \"100%\",\n height,\n background: \"var(--ginger-muted-color, #e5e7eb)\",\n borderRadius: 999,\n overflow: \"hidden\",\n ...style,\n }\n }\n aria-hidden\n >\n <div\n style={{\n width: bufPct,\n height: unstyled ? undefined : \"100%\",\n background: unstyled\n ? undefined\n : \"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))\",\n }}\n />\n </div>\n );\n}\n\nBufferRail.displayName = \"Ginger.Current.BufferRail\";\n","import type { ReactNode } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport { derivePlaybackUiState } from \"../../internal/selectors\";\nimport type { DisplayBaseProps, GingerState, PlaybackUiState } from \"../../types\";\n\nexport type PlaybackStateProps = DisplayBaseProps & {\n children?: (value: PlaybackUiState, state: GingerState) => ReactNode;\n};\n\nexport function PlaybackState({ className, style, fallback, empty, children }: PlaybackStateProps) {\n const state = useGingerState();\n const value = derivePlaybackUiState(state);\n if (children)\n return (\n <span className={className} style={style}>\n {children(value, state)}\n </span>\n );\n return (\n <span className={className} style={style}>\n {value}\n </span>\n );\n}\n\nPlaybackState.displayName = \"Ginger.Current.PlaybackState\";\n\nexport type ErrorMessageProps = DisplayBaseProps & {\n live?: \"polite\" | \"assertive\" | \"off\";\n children?: (value: string, state: GingerState) => ReactNode;\n};\n\nexport function ErrorMessage({\n className,\n style,\n fallback,\n empty,\n live = \"polite\",\n children,\n}: ErrorMessageProps) {\n const state = useGingerState();\n const value = state.errorMessage ?? \"\";\n if (!value) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n if (children) {\n return (\n <span className={className} style={style} aria-live={live}>\n {children(value, state)}\n </span>\n );\n }\n return (\n <span className={className} style={style} aria-live={live}>\n {value}\n </span>\n );\n}\n\nErrorMessage.displayName = \"Ginger.Current.ErrorMessage\";\n","import {\n type ButtonHTMLAttributes,\n type CSSProperties,\n type HTMLAttributes,\n type LiHTMLAttributes,\n type ReactNode,\n createContext,\n useContext,\n} from \"react\";\nimport { useGingerPlayback } from \"../../context/GingerSplitContexts\";\nimport { trackIdentity } from \"../../core/queue\";\nimport type { Track } from \"../../types\";\n\nexport type GingerPlaylistConfig = {\n playOnSelect: boolean;\n};\n\nconst GingerPlaylistConfigContext = createContext<GingerPlaylistConfig | null>(null);\n\nfunction usePlaylistConfig(): GingerPlaylistConfig {\n const ctx = useContext(GingerPlaylistConfigContext);\n if (!ctx) {\n throw new Error(\"Ginger.Playlist.Track must be used inside <Ginger.Playlist>\");\n }\n return ctx;\n}\n\nexport type GingerPlaylistProps = Omit<HTMLAttributes<HTMLUListElement>, \"children\"> & {\n children?: ReactNode;\n /** Remove default list/row styles for fully custom playlist styling. */\n unstyled?: boolean;\n rowStyle?: CSSProperties;\n /**\n * Used only in **auto** mode (no custom `children`). Ignored when you pass custom `children`\n * (manual mode); use `Ginger.Playlist.Track` for each row instead.\n */\n renderTrack?: (track: Track, index: number, isActive: boolean) => ReactNode;\n /** When true (default), clicking a row selects that index and starts playback */\n playOnSelect?: boolean;\n};\n\n/**\n * - **Auto mode** (no `children`): maps `state.tracks` to rows (optional `renderTrack`).\n * - **Manual mode** (`children` defined): renders `<ul>{children}</ul>`; map `state.tracks` yourself\n * with `Ginger.Playlist.Track` for each index.\n */\nexport function GingerPlaylist({\n children,\n unstyled = false,\n rowStyle,\n renderTrack,\n playOnSelect = true,\n style,\n ...rest\n}: GingerPlaylistProps) {\n const { tracks, currentIndex, playTrackAt, selectTrackAt } = useGingerPlayback();\n\n const listStyle: CSSProperties = unstyled\n ? { ...style }\n : {\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n fontFamily: \"var(--ginger-font-family, system-ui, sans-serif)\",\n fontSize: \"var(--ginger-font-size, 14px)\",\n color: \"var(--ginger-primary-color, #111827)\",\n ...style,\n };\n\n const manual = children !== undefined;\n\n if (manual) {\n return (\n <GingerPlaylistConfigContext.Provider value={{ playOnSelect }}>\n <ul style={listStyle} {...rest}>\n {children}\n </ul>\n </GingerPlaylistConfigContext.Provider>\n );\n }\n\n return (\n <GingerPlaylistConfigContext.Provider value={{ playOnSelect }}>\n <ul style={listStyle} {...rest}>\n {tracks.map((track, index) => {\n const active = index === currentIndex;\n return (\n <li key={`${index}-${trackIdentity(track)}`}>\n <button\n type=\"button\"\n onClick={() => {\n if (playOnSelect) playTrackAt(index);\n else selectTrackAt(index);\n }}\n style={{\n width: unstyled ? undefined : \"100%\",\n textAlign: unstyled ? undefined : \"left\",\n border: unstyled ? undefined : \"none\",\n background: unstyled\n ? undefined\n : active\n ? \"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))\"\n : \"transparent\",\n color: unstyled ? undefined : \"inherit\",\n font: unstyled ? undefined : \"inherit\",\n cursor: unstyled ? undefined : \"pointer\",\n padding: unstyled ? undefined : \"var(--ginger-playlist-row-padding, 6px 8px)\",\n ...rowStyle,\n }}\n >\n {renderTrack ? (\n renderTrack(track, index, active)\n ) : (\n <span>\n {track.title}\n {track.artist ? ` — ${track.artist}` : \"\"}\n </span>\n )}\n </button>\n </li>\n );\n })}\n </ul>\n </GingerPlaylistConfigContext.Provider>\n );\n}\n\nGingerPlaylist.displayName = \"Ginger.Playlist\";\n\nexport type GingerPlaylistTrackProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"type\"> & {\n index: number;\n /** Remove default row button styles for fully custom styling. */\n unstyled?: boolean;\n /** Optional wrapper for the row; defaults to a plain `<li>` */\n liProps?: LiHTMLAttributes<HTMLLIElement>;\n};\n\nexport function GingerPlaylistTrack({\n index,\n unstyled = false,\n className,\n style,\n children,\n liProps,\n onClick,\n ...buttonRest\n}: GingerPlaylistTrackProps) {\n const { playOnSelect } = usePlaylistConfig();\n const { tracks, currentIndex, playTrackAt, selectTrackAt } = useGingerPlayback();\n const active = index === currentIndex;\n const track = tracks[index];\n const defaultLabel =\n track != null ? (\n <span>\n {track.title}\n {track.artist ? ` — ${track.artist}` : \"\"}\n </span>\n ) : null;\n\n return (\n <li {...liProps}>\n <button\n type=\"button\"\n aria-current={active ? \"true\" : undefined}\n data-ginger-active={active || undefined}\n className={className}\n style={{\n width: unstyled ? undefined : \"100%\",\n textAlign: unstyled ? undefined : \"left\",\n border: unstyled ? undefined : \"none\",\n background: unstyled\n ? undefined\n : active\n ? \"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))\"\n : \"transparent\",\n color: unstyled ? undefined : \"inherit\",\n font: unstyled ? undefined : \"inherit\",\n cursor: unstyled ? undefined : \"pointer\",\n padding: unstyled ? undefined : \"var(--ginger-playlist-row-padding, 6px 8px)\",\n ...style,\n }}\n {...buttonRest}\n onClick={(e) => {\n onClick?.(e);\n if (e.defaultPrevented) return;\n if (playOnSelect) playTrackAt(index);\n else selectTrackAt(index);\n }}\n >\n {children ?? defaultLabel}\n </button>\n </li>\n );\n}\n\nGingerPlaylistTrack.displayName = \"Ginger.Playlist.Track\";\n\nexport const GingerPlaylistCompound = Object.assign(GingerPlaylist, {\n Track: GingerPlaylistTrack,\n});\n","import type { CSSProperties } from \"react\";\nimport { useGingerState } from \"../../context/GingerSplitContexts\";\nimport type { DisplayBaseProps } from \"../../types\";\nimport { createTextDisplay } from \"../current/createTextDisplay\";\n\nexport const Title = createTextDisplay(\"Ginger.Queue.Title\", (s) => s.playlistMeta?.title);\nexport const Subtitle = createTextDisplay(\"Ginger.Queue.Subtitle\", (s) => s.playlistMeta?.subtitle);\nexport const Description = createTextDisplay(\n \"Ginger.Queue.Description\",\n (s) => s.playlistMeta?.description,\n);\nexport const Copyright = createTextDisplay(\n \"Ginger.Queue.Copyright\",\n (s) => s.playlistMeta?.copyright,\n);\n\nexport type QueueArtworkProps = DisplayBaseProps & {\n /** Remove default wrapper/image styles for fully custom layout. */\n unstyled?: boolean;\n imgStyle?: CSSProperties;\n};\n\nexport function Artwork({\n className,\n style,\n fallback,\n empty,\n unstyled = false,\n imgStyle,\n}: QueueArtworkProps) {\n const state = useGingerState();\n const src = state.playlistMeta?.artworkUrl;\n if (!src) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const alt = state.playlistMeta?.title ?? \"Playlist artwork\";\n return (\n <span\n className={className}\n style={\n unstyled\n ? { ...style }\n : {\n display: \"inline-block\",\n background: \"var(--ginger-artwork-bg, #f3f4f6)\",\n borderRadius: \"var(--ginger-artwork-radius, 6px)\",\n overflow: \"hidden\",\n ...style,\n }\n }\n >\n <img\n src={src}\n alt={alt}\n style={{\n display: unstyled ? undefined : \"block\",\n width: unstyled ? undefined : \"100%\",\n height: unstyled ? undefined : \"100%\",\n objectFit: unstyled ? undefined : \"cover\",\n ...imgStyle,\n }}\n />\n </span>\n );\n}\n\nArtwork.displayName = \"Ginger.Queue.Artwork\";\n","import type { GingerAction, GingerState, RepeatMode, Track } from \"../types\";\nimport {\n addNextTrack,\n clampIndex,\n findIndexByTrackIdentity,\n insertTrackAt,\n moveTrack,\n removeTrackAt,\n shuffleWithAnchor,\n} from \"./queue\";\nimport { computeNextIndex, computePrevIndex, cycleRepeatMode } from \"./transitions\";\n\nexport function clampVolume(v: number): number {\n if (!Number.isFinite(v)) return 1;\n return Math.min(1, Math.max(0, v));\n}\n\nexport function clampPlaybackRate(r: number): number {\n if (!Number.isFinite(r)) return 1;\n return Math.min(4, Math.max(0.25, r));\n}\n\n/** Reset when the active track / position changes; keeps volume / mute / speed */\nconst resetTimingOnly = {\n currentTime: 0,\n duration: 0,\n bufferedFraction: 0,\n isBuffering: false,\n errorMessage: null as string | null,\n};\n\nconst defaultMedia = {\n ...resetTimingOnly,\n volume: 1,\n muted: false,\n playbackRate: 1,\n};\n\nexport function createInitialState(params: {\n tracks: Track[];\n currentIndex?: number;\n playlistMeta?: GingerState[\"playlistMeta\"];\n isPaused?: boolean;\n isShuffled?: boolean;\n repeatMode?: RepeatMode;\n playbackMode?: GingerState[\"playbackMode\"];\n volume?: number;\n muted?: boolean;\n playbackRate?: number;\n}): GingerState {\n const tracks = [...params.tracks];\n let currentIndex = clampIndex(params.currentIndex ?? 0, tracks.length);\n let originalTracks: Track[] | null = null;\n let ordered = tracks;\n\n if (params.isShuffled && tracks.length > 1) {\n originalTracks = [...tracks];\n ordered = shuffleWithAnchor(tracks, currentIndex);\n currentIndex = 0;\n }\n\n return {\n tracks: ordered,\n currentIndex,\n playbackMode: params.playbackMode ?? \"playlist\",\n isPaused: params.isPaused ?? true,\n isShuffled: Boolean(params.isShuffled && ordered.length > 1),\n repeatMode: params.repeatMode ?? \"off\",\n originalTracks,\n playlistMeta: params.playlistMeta ?? null,\n ...defaultMedia,\n volume: clampVolume(params.volume ?? 1),\n muted: params.muted ?? false,\n playbackRate: clampPlaybackRate(params.playbackRate ?? 1),\n };\n}\n\nexport function gingerReducer(state: GingerState, action: GingerAction): GingerState {\n switch (action.type) {\n case \"INIT\": {\n const {\n tracks,\n currentIndex,\n playlistMeta,\n isPaused,\n isShuffled,\n repeatMode,\n playbackMode,\n volume,\n muted,\n playbackRate,\n } = action.payload;\n return createInitialState({\n tracks,\n currentIndex,\n playlistMeta: playlistMeta ?? null,\n isPaused: isPaused ?? true,\n isShuffled: isShuffled ?? false,\n repeatMode: repeatMode ?? \"off\",\n playbackMode: playbackMode ?? \"playlist\",\n volume,\n muted,\n playbackRate,\n });\n }\n case \"SET_QUEUE\": {\n const { tracks, currentIndex } = action.payload;\n const next = [...tracks];\n const idx = clampIndex(currentIndex ?? state.currentIndex, next.length);\n return {\n ...state,\n tracks: next,\n currentIndex: idx,\n isShuffled: false,\n originalTracks: null,\n ...resetTimingOnly,\n };\n }\n case \"INSERT_TRACK\": {\n const insertIndex = action.payload.index ?? state.tracks.length;\n const tracks = insertTrackAt(state.tracks, action.payload.track, insertIndex);\n if (action.payload.autoPlay) {\n const idx = clampIndex(insertIndex, tracks.length);\n return {\n ...state,\n tracks,\n currentIndex: idx,\n isShuffled: false,\n originalTracks: null,\n isPaused: false,\n ...resetTimingOnly,\n };\n }\n const currentIndex =\n insertIndex <= state.currentIndex ? state.currentIndex + 1 : state.currentIndex;\n return {\n ...state,\n tracks,\n isShuffled: false,\n originalTracks: null,\n currentIndex: clampIndex(currentIndex, tracks.length),\n };\n }\n case \"REMOVE_TRACK\": {\n const index = action.payload.index;\n const tracks = removeTrackAt(state.tracks, index);\n const currentIndex =\n index < state.currentIndex\n ? state.currentIndex - 1\n : index === state.currentIndex\n ? Math.min(state.currentIndex, Math.max(0, tracks.length - 1))\n : state.currentIndex;\n return {\n ...state,\n tracks,\n isShuffled: false,\n originalTracks: null,\n currentIndex: clampIndex(currentIndex, tracks.length),\n ...(index === state.currentIndex ? resetTimingOnly : {}),\n };\n }\n case \"MOVE_TRACK\": {\n const { fromIndex, toIndex } = action.payload;\n const tracks = moveTrack(state.tracks, fromIndex, toIndex);\n let currentIndex = state.currentIndex;\n if (state.currentIndex === fromIndex) currentIndex = toIndex;\n else if (fromIndex < state.currentIndex && toIndex >= state.currentIndex) currentIndex -= 1;\n else if (fromIndex > state.currentIndex && toIndex <= state.currentIndex) currentIndex += 1;\n return {\n ...state,\n tracks,\n isShuffled: false,\n originalTracks: null,\n currentIndex: clampIndex(currentIndex, tracks.length),\n };\n }\n case \"ADD_NEXT\": {\n const tracks = addNextTrack(state.tracks, state.currentIndex, action.payload.track);\n return {\n ...state,\n tracks,\n isShuffled: false,\n originalTracks: null,\n };\n }\n case \"SET_INDEX\": {\n const idx = clampIndex(action.payload.index, state.tracks.length);\n const ap = action.payload.autoPlay;\n const isPaused = ap === true ? false : ap === false ? true : state.isPaused;\n return {\n ...state,\n currentIndex: idx,\n ...resetTimingOnly,\n isPaused,\n };\n }\n case \"PLAY\":\n return { ...state, isPaused: false };\n case \"PAUSE\":\n return { ...state, isPaused: true };\n case \"TOGGLE_PAUSE\":\n return { ...state, isPaused: !state.isPaused };\n case \"SET_REPEAT\":\n return { ...state, repeatMode: action.payload };\n case \"CYCLE_REPEAT\":\n return { ...state, repeatMode: cycleRepeatMode(state.repeatMode) };\n case \"TOGGLE_SHUFFLE\": {\n if (state.tracks.length <= 1) return { ...state, isShuffled: false, originalTracks: null };\n if (!state.isShuffled) {\n const snapshot = [...state.tracks];\n const shuffled = shuffleWithAnchor(snapshot, state.currentIndex);\n return {\n ...state,\n isShuffled: true,\n originalTracks: snapshot,\n tracks: shuffled,\n currentIndex: 0,\n };\n }\n const restored = state.originalTracks ? [...state.originalTracks] : [...state.tracks];\n const current = state.tracks[state.currentIndex];\n const newIndex = findIndexByTrackIdentity(restored, current);\n return {\n ...state,\n isShuffled: false,\n originalTracks: null,\n tracks: restored,\n currentIndex: clampIndex(newIndex, restored.length),\n };\n }\n case \"NEXT\": {\n const nextIndex = computeNextIndex(state);\n const same = nextIndex === state.currentIndex;\n return {\n ...state,\n currentIndex: nextIndex,\n ...(same ? {} : resetTimingOnly),\n isPaused: same ? state.isPaused : false,\n };\n }\n case \"PREV\": {\n const prevIndex = computePrevIndex(state);\n const same = prevIndex === state.currentIndex;\n return {\n ...state,\n currentIndex: prevIndex,\n ...(same ? {} : resetTimingOnly),\n isPaused: same ? state.isPaused : false,\n };\n }\n case \"MEDIA_TIME_UPDATE\":\n return {\n ...state,\n currentTime: action.payload.currentTime,\n duration: Number.isFinite(action.payload.duration)\n ? action.payload.duration\n : state.duration,\n bufferedFraction: action.payload.bufferedFraction,\n isBuffering: false,\n };\n case \"MEDIA_LOADED_METADATA\":\n return {\n ...state,\n duration: Number.isFinite(action.payload.duration)\n ? action.payload.duration\n : state.duration,\n bufferedFraction: action.payload.bufferedFraction,\n errorMessage: null,\n };\n case \"SET_PLAYLIST_META\":\n return { ...state, playlistMeta: action.payload };\n case \"SET_PLAYBACK_MODE\":\n return { ...state, playbackMode: action.payload };\n case \"MEDIA_ERROR\":\n return {\n ...state,\n errorMessage: action.payload.message,\n isPaused: true,\n isBuffering: false,\n };\n case \"MEDIA_WAITING\":\n return { ...state, isBuffering: true };\n case \"MEDIA_CANPLAY\":\n return { ...state, isBuffering: false, errorMessage: null };\n case \"MEDIA_PLAY\":\n return { ...state, isPaused: false, isBuffering: false };\n case \"MEDIA_PAUSE\":\n return { ...state, isPaused: true };\n case \"RESET_MEDIA_TIMES\":\n return { ...state, currentTime: 0, duration: 0, bufferedFraction: 0 };\n case \"MEDIA_SOURCE_CLEARED\":\n return { ...state, ...resetTimingOnly };\n case \"SET_VOLUME\":\n return { ...state, volume: clampVolume(action.payload) };\n case \"SET_MUTED\":\n return { ...state, muted: action.payload };\n case \"TOGGLE_MUTE\":\n return { ...state, muted: !state.muted };\n case \"SET_PLAYBACK_RATE\":\n return { ...state, playbackRate: clampPlaybackRate(action.payload) };\n case \"MEDIA_VOLUME_SYNC\": {\n const { volume, muted } = action.payload;\n const v = clampVolume(volume);\n if (v === state.volume && muted === state.muted) return state;\n return { ...state, volume: v, muted };\n }\n default: {\n const _exhaustive: never = action;\n void _exhaustive;\n return state;\n }\n }\n}\n","import { useEffect } from \"react\";\nimport { resolveArtworkUrl } from \"../core/transitions\";\nimport type { GingerState } from \"../types\";\n\nexport type MediaSessionBridgeActions = {\n play: () => void;\n pause: () => void;\n next: () => void;\n prev: () => void;\n seek: (timeSeconds: number) => void;\n};\n\nfunction getMediaSession(): MediaSession | null {\n if (typeof navigator === \"undefined\" || !(\"mediaSession\" in navigator)) return null;\n return navigator.mediaSession;\n}\n\nexport function useMediaSessionBridge(\n enabled: boolean,\n state: GingerState,\n actions: MediaSessionBridgeActions,\n): void {\n const track = state.tracks[state.currentIndex];\n const title = track?.title;\n const artist = track?.artist;\n const album = track?.album;\n const artworkUrl = resolveArtworkUrl(track, state.playlistMeta?.artworkUrl);\n\n useEffect(() => {\n const ms = getMediaSession();\n if (!enabled || !ms) return;\n ms.metadata = new MediaMetadata({\n title: title ?? \"Unknown track\",\n artist,\n album,\n artwork: artworkUrl ? [{ src: artworkUrl }] : undefined,\n });\n }, [enabled, title, artist, album, artworkUrl]);\n\n useEffect(() => {\n const ms = getMediaSession();\n if (!enabled || !ms) return;\n ms.playbackState = state.isPaused ? \"paused\" : \"playing\";\n }, [enabled, state.isPaused]);\n\n useEffect(() => {\n const ms = getMediaSession();\n if (!enabled || !ms) return;\n try {\n ms.setActionHandler(\"play\", actions.play);\n ms.setActionHandler(\"pause\", actions.pause);\n ms.setActionHandler(\"nexttrack\", actions.next);\n ms.setActionHandler(\"previoustrack\", actions.prev);\n ms.setActionHandler(\"seekto\", (details) => {\n if (typeof details.seekTime === \"number\" && Number.isFinite(details.seekTime)) {\n actions.seek(details.seekTime);\n }\n });\n } catch {\n // Best-effort API support differs across browsers.\n }\n return () => {\n try {\n ms.setActionHandler(\"play\", null);\n ms.setActionHandler(\"pause\", null);\n ms.setActionHandler(\"nexttrack\", null);\n ms.setActionHandler(\"previoustrack\", null);\n ms.setActionHandler(\"seekto\", null);\n } catch {\n // Ignore platforms that do not support clearing handlers.\n }\n };\n }, [enabled, actions]);\n}\n","import { type CSSProperties, useCallback, useEffect, useMemo, useReducer, useRef } from \"react\";\nimport {\n clampPlaybackRate,\n clampVolume,\n createInitialState,\n gingerReducer,\n} from \"../core/playbackReducer\";\nimport { trackIdentity } from \"../core/queue\";\nimport { computeEndedTransition } from \"../core/transitions\";\nimport { derivePlaybackUiState } from \"../internal/selectors\";\nimport { useMediaSessionBridge } from \"../media/useMediaSession\";\nimport type {\n GingerInitPayload,\n GingerProviderProps,\n PlaybackMode,\n PlaylistMeta,\n RepeatMode,\n Track,\n} from \"../types\";\nimport { GingerContext, type GingerContextValue } from \"./GingerContext\";\nimport { GingerLocaleProvider } from \"./GingerLocaleContext\";\nimport {\n GingerMediaContext,\n type GingerMediaContextValue,\n GingerPlaybackContext,\n type GingerPlaybackContextValue,\n} from \"./GingerSplitContexts\";\n\nconst defaultProviderStyle: CSSProperties = {\n [\"--ginger-primary-color\" as string]: \"#111827\",\n [\"--ginger-muted-color\" as string]: \"#6b7280\",\n [\"--ginger-font-size\" as string]: \"14px\",\n [\"--ginger-font-family\" as string]: \"system-ui, sans-serif\",\n [\"--ginger-playlist-row-padding\" as string]: \"6px 8px\",\n [\"--ginger-artwork-radius\" as string]: \"6px\",\n [\"--ginger-artwork-bg\" as string]: \"#f3f4f6\",\n [\"--ginger-playlist-active-bg\" as string]: \"rgba(17, 24, 39, 0.06)\",\n [\"--ginger-buffer-color\" as string]: \"rgba(107, 114, 128, 0.35)\",\n [\"--ginger-focus-ring\" as string]: \"0 0 0 2px rgba(59, 130, 246, 0.45)\",\n};\n\nexport function GingerProvider({\n children,\n initialTracks = [],\n initialIndex = 0,\n initialPlaylistMeta = null,\n initialShuffle = false,\n initialRepeatMode = \"off\",\n initialPlaybackMode = \"playlist\",\n initialPaused = true,\n initialVolume = 1,\n initialMuted = false,\n initialPlaybackRate = 1,\n initialStateKey,\n locale,\n mediaSession = false,\n beforePlay,\n onPlayBlocked,\n persistence,\n hydrateOnMount = false,\n resumeOnTrackChange = false,\n unstyled = false,\n className,\n style,\n onTrackChange,\n onPlay,\n onPause,\n onQueueEnd,\n onError,\n}: GingerProviderProps) {\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const [state, dispatch] = useReducer(gingerReducer, undefined, () =>\n createInitialState({\n tracks: initialTracks,\n currentIndex: initialIndex,\n playlistMeta: initialPlaylistMeta,\n isPaused: initialPaused,\n isShuffled: initialShuffle,\n repeatMode: initialRepeatMode,\n playbackMode: initialPlaybackMode,\n volume: initialVolume,\n muted: initialMuted,\n playbackRate: initialPlaybackRate,\n }),\n );\n const stateRef = useRef(state);\n\n const latestInitRef = useRef({\n tracks: initialTracks,\n currentIndex: initialIndex,\n playlistMeta: initialPlaylistMeta,\n isPaused: initialPaused,\n isShuffled: initialShuffle,\n repeatMode: initialRepeatMode,\n playbackMode: initialPlaybackMode,\n volume: initialVolume,\n muted: initialMuted,\n playbackRate: initialPlaybackRate,\n });\n latestInitRef.current = {\n tracks: initialTracks,\n currentIndex: initialIndex,\n playlistMeta: initialPlaylistMeta,\n isPaused: initialPaused,\n isShuffled: initialShuffle,\n repeatMode: initialRepeatMode,\n playbackMode: initialPlaybackMode,\n volume: initialVolume,\n muted: initialMuted,\n playbackRate: initialPlaybackRate,\n };\n\n const prevInitialStateKeyRef = useRef<typeof initialStateKey>(undefined);\n\n useEffect(() => {\n if (initialStateKey === undefined) {\n prevInitialStateKeyRef.current = undefined;\n return;\n }\n if (prevInitialStateKeyRef.current === undefined) {\n prevInitialStateKeyRef.current = initialStateKey;\n return;\n }\n if (prevInitialStateKeyRef.current === initialStateKey) return;\n prevInitialStateKeyRef.current = initialStateKey;\n const p = latestInitRef.current;\n dispatch({\n type: \"INIT\",\n payload: {\n tracks: p.tracks,\n currentIndex: p.currentIndex,\n playlistMeta: p.playlistMeta,\n isPaused: p.isPaused,\n isShuffled: p.isShuffled,\n repeatMode: p.repeatMode,\n playbackMode: p.playbackMode,\n volume: p.volume,\n muted: p.muted,\n playbackRate: p.playbackRate,\n },\n });\n }, [initialStateKey, dispatch]);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n const currentTrack = state.tracks[state.currentIndex] ?? null;\n\n useEffect(() => {\n onTrackChange?.(currentTrack, state.currentIndex);\n }, [currentTrack, state.currentIndex, onTrackChange]);\n\n useEffect(() => {\n if (state.errorMessage) onError?.(state.errorMessage);\n }, [state.errorMessage, onError]);\n\n const prevPausedRef = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n if (prevPausedRef.current === undefined) {\n prevPausedRef.current = state.isPaused;\n return;\n }\n if (prevPausedRef.current !== state.isPaused) {\n if (state.isPaused) onPause?.();\n else onPlay?.();\n }\n prevPausedRef.current = state.isPaused;\n }, [state.isPaused, onPause, onPlay]);\n\n const play = useCallback(() => {\n dispatch({ type: \"PLAY\" });\n }, []);\n\n const pause = useCallback(() => {\n dispatch({ type: \"PAUSE\" });\n audioRef.current?.pause();\n }, []);\n\n const togglePlayPause = useCallback(() => {\n if (state.isPaused) play();\n else pause();\n }, [pause, play, state.isPaused]);\n\n const seek = useCallback((timeSeconds: number) => {\n const el = audioRef.current;\n if (!el) return;\n if (!Number.isFinite(timeSeconds)) return;\n el.currentTime = Math.max(0, timeSeconds);\n }, []);\n\n const setVolume = useCallback((volume: number) => {\n dispatch({ type: \"SET_VOLUME\", payload: clampVolume(volume) });\n }, []);\n\n const setMuted = useCallback((muted: boolean) => {\n dispatch({ type: \"SET_MUTED\", payload: muted });\n }, []);\n\n const toggleMute = useCallback(() => {\n dispatch({ type: \"TOGGLE_MUTE\" });\n }, []);\n\n const setPlaybackRate = useCallback((rate: number) => {\n dispatch({ type: \"SET_PLAYBACK_RATE\", payload: clampPlaybackRate(rate) });\n }, []);\n\n const next = useCallback(() => {\n dispatch({ type: \"NEXT\" });\n }, []);\n\n const prev = useCallback(() => {\n dispatch({ type: \"PREV\" });\n }, []);\n\n const setRepeatMode = useCallback((mode: RepeatMode) => {\n dispatch({ type: \"SET_REPEAT\", payload: mode });\n }, []);\n\n const cycleRepeat = useCallback(() => {\n dispatch({ type: \"CYCLE_REPEAT\" });\n }, []);\n\n const toggleShuffle = useCallback(() => {\n dispatch({ type: \"TOGGLE_SHUFFLE\" });\n }, []);\n\n const setQueue = useCallback((tracks: Track[], currentIndex?: number) => {\n dispatch({ type: \"SET_QUEUE\", payload: { tracks, currentIndex } });\n }, []);\n\n const insertTrackAt = useCallback((track: Track, index?: number, autoPlay?: boolean) => {\n dispatch({ type: \"INSERT_TRACK\", payload: { track, index, autoPlay } });\n }, []);\n\n const removeTrackAt = useCallback((index: number) => {\n dispatch({ type: \"REMOVE_TRACK\", payload: { index } });\n }, []);\n\n const moveTrack = useCallback((fromIndex: number, toIndex: number) => {\n dispatch({ type: \"MOVE_TRACK\", payload: { fromIndex, toIndex } });\n }, []);\n\n const enqueueNext = useCallback((track: Track) => {\n dispatch({ type: \"ADD_NEXT\", payload: { track } });\n }, []);\n\n const playTrackAt = useCallback((index: number) => {\n dispatch({ type: \"SET_INDEX\", payload: { index, autoPlay: true } });\n }, []);\n\n const selectTrackAt = useCallback((index: number) => {\n dispatch({ type: \"SET_INDEX\", payload: { index, autoPlay: false } });\n }, []);\n\n const setPlaylistMeta = useCallback((meta: PlaylistMeta | null) => {\n dispatch({ type: \"SET_PLAYLIST_META\", payload: meta });\n }, []);\n\n const setPlaybackMode = useCallback((mode: PlaybackMode) => {\n dispatch({ type: \"SET_PLAYBACK_MODE\", payload: mode });\n }, []);\n\n const init = useCallback((payload: GingerInitPayload) => {\n dispatch({ type: \"INIT\", payload });\n }, []);\n\n useEffect(() => {\n if (!persistence || !hydrateOnMount) return;\n const volume = persistence.get(\"ginger:volume\");\n const muted = persistence.get(\"ginger:muted\");\n const playbackRate = persistence.get(\"ginger:playbackRate\");\n const repeatMode = persistence.get(\"ginger:repeatMode\");\n const currentIndex = persistence.get(\"ginger:currentIndex\");\n const p = latestInitRef.current;\n dispatch({\n type: \"INIT\",\n payload: {\n tracks: p.tracks,\n playlistMeta: p.playlistMeta,\n isPaused: p.isPaused,\n isShuffled: p.isShuffled,\n playbackMode: p.playbackMode,\n currentIndex: typeof currentIndex === \"number\" ? currentIndex : p.currentIndex,\n repeatMode:\n repeatMode === \"off\" || repeatMode === \"all\" || repeatMode === \"one\"\n ? repeatMode\n : p.repeatMode,\n volume: typeof volume === \"number\" ? volume : p.volume,\n muted: typeof muted === \"boolean\" ? muted : p.muted,\n playbackRate: typeof playbackRate === \"number\" ? playbackRate : p.playbackRate,\n },\n });\n }, [hydrateOnMount, persistence]);\n\n useEffect(() => {\n if (!persistence) return;\n persistence.set(\"ginger:volume\", state.volume);\n persistence.set(\"ginger:muted\", state.muted);\n persistence.set(\"ginger:playbackRate\", state.playbackRate);\n persistence.set(\"ginger:repeatMode\", state.repeatMode);\n persistence.set(\"ginger:currentIndex\", state.currentIndex);\n }, [\n persistence,\n state.volume,\n state.muted,\n state.playbackRate,\n state.repeatMode,\n state.currentIndex,\n ]);\n\n useEffect(() => {\n if (!persistence || !resumeOnTrackChange) return;\n const track = state.tracks[state.currentIndex];\n if (!track) return;\n const key = `ginger:resume:${trackIdentity(track)}`;\n const saved = persistence.get(key);\n if (typeof saved === \"number\" && Number.isFinite(saved)) {\n seek(saved);\n }\n }, [persistence, resumeOnTrackChange, state.currentIndex, state.tracks, seek]);\n\n useEffect(() => {\n if (!persistence || !resumeOnTrackChange) return;\n const track = state.tracks[state.currentIndex];\n if (!track || !(state.currentTime >= 0)) return;\n const key = `ginger:resume:${trackIdentity(track)}`;\n const id = setTimeout(() => persistence.set(key, state.currentTime), 250);\n return () => clearTimeout(id);\n }, [persistence, resumeOnTrackChange, state.currentIndex, state.tracks, state.currentTime]);\n\n const currentUrl = state.tracks[state.currentIndex]?.fileUrl;\n\n useEffect(() => {\n const el = audioRef.current;\n if (!el) return;\n if (state.isPaused) {\n el.pause();\n return;\n }\n let cancelled = false;\n void (async () => {\n if (beforePlay) {\n let allowed = false;\n try {\n allowed = await beforePlay();\n } catch (error) {\n const message = error instanceof Error ? error.message : \"beforePlay rejected\";\n dispatch({ type: \"MEDIA_ERROR\", payload: { message } });\n return;\n }\n if (!allowed) {\n if (!cancelled) {\n dispatch({ type: \"PAUSE\" });\n onPlayBlocked?.();\n }\n return;\n }\n }\n if (cancelled) return;\n void el.play().catch((e: unknown) => {\n const msg =\n e instanceof Error\n ? e.message\n : typeof e === \"string\"\n ? e\n : \"Playback failed (e.g. autoplay blocked or unavailable source)\";\n dispatch({ type: \"MEDIA_ERROR\", payload: { message: msg } });\n });\n })();\n return () => {\n cancelled = true;\n };\n }, [beforePlay, currentUrl, onPlayBlocked, state.isPaused]);\n\n const notifyEnded = useCallback(() => {\n const transition = computeEndedTransition(stateRef.current);\n if (transition.kind === \"replay_same\") {\n const el = audioRef.current;\n if (el) {\n el.currentTime = 0;\n }\n dispatch({ type: \"PLAY\" });\n return;\n }\n if (transition.kind === \"stop\") {\n dispatch({ type: \"PAUSE\" });\n onQueueEnd?.();\n return;\n }\n const nextIndex = transition.nextIndex;\n dispatch({ type: \"SET_INDEX\", payload: { index: nextIndex, autoPlay: true } });\n }, [onQueueEnd]);\n\n const mediaSessionActions = useMemo(\n () => ({ play, pause, next, prev, seek }),\n [play, pause, next, prev, seek],\n );\n useMediaSessionBridge(Boolean(mediaSession), state, mediaSessionActions);\n\n const providerDir = locale?.seek && /[\\u0590-\\u08FF]/.test(locale.seek) ? \"rtl\" : \"ltr\";\n\n const value = useMemo<GingerContextValue>(\n () => ({\n state,\n dispatch,\n audioRef,\n notifyEnded,\n init,\n play,\n pause,\n togglePlayPause,\n seek,\n setVolume,\n setMuted,\n toggleMute,\n setPlaybackRate,\n next,\n prev,\n setRepeatMode,\n cycleRepeat,\n toggleShuffle,\n setQueue,\n insertTrackAt,\n removeTrackAt,\n moveTrack,\n enqueueNext,\n playTrackAt,\n selectTrackAt,\n setPlaylistMeta,\n setPlaybackMode,\n }),\n [\n cycleRepeat,\n dispatch,\n init,\n next,\n notifyEnded,\n pause,\n play,\n playTrackAt,\n insertTrackAt,\n removeTrackAt,\n moveTrack,\n enqueueNext,\n selectTrackAt,\n prev,\n seek,\n setMuted,\n setPlaybackRate,\n setQueue,\n setRepeatMode,\n setPlaylistMeta,\n setPlaybackMode,\n setVolume,\n state,\n toggleMute,\n togglePlayPause,\n toggleShuffle,\n ],\n );\n\n const playbackValue = useMemo<GingerPlaybackContextValue>(\n () => ({\n tracks: state.tracks,\n currentIndex: state.currentIndex,\n isPaused: state.isPaused,\n isShuffled: state.isShuffled,\n repeatMode: state.repeatMode,\n originalTracks: state.originalTracks,\n playlistMeta: state.playlistMeta,\n init,\n play,\n pause,\n togglePlayPause,\n next,\n prev,\n setRepeatMode,\n cycleRepeat,\n toggleShuffle,\n playbackMode: state.playbackMode,\n setQueue,\n insertTrackAt,\n removeTrackAt,\n moveTrack,\n enqueueNext,\n playTrackAt,\n selectTrackAt,\n setPlaylistMeta,\n setPlaybackMode,\n dispatch,\n }),\n [\n state.tracks,\n state.currentIndex,\n state.isPaused,\n state.isShuffled,\n state.repeatMode,\n state.playbackMode,\n state.originalTracks,\n state.playlistMeta,\n init,\n play,\n pause,\n togglePlayPause,\n next,\n prev,\n setRepeatMode,\n cycleRepeat,\n toggleShuffle,\n setQueue,\n insertTrackAt,\n removeTrackAt,\n moveTrack,\n enqueueNext,\n playTrackAt,\n selectTrackAt,\n setPlaylistMeta,\n setPlaybackMode,\n dispatch,\n ],\n );\n\n const mediaValue = useMemo<GingerMediaContextValue>(\n () => ({\n currentTime: state.currentTime,\n duration: state.duration,\n bufferedFraction: state.bufferedFraction,\n isBuffering: state.isBuffering,\n errorMessage: state.errorMessage,\n volume: state.volume,\n muted: state.muted,\n playbackRate: state.playbackRate,\n seek,\n setVolume,\n setMuted,\n toggleMute,\n setPlaybackRate,\n audioRef,\n notifyEnded,\n dispatch,\n }),\n [\n state.currentTime,\n state.duration,\n state.bufferedFraction,\n state.isBuffering,\n state.errorMessage,\n state.volume,\n state.muted,\n state.playbackRate,\n seek,\n setVolume,\n setMuted,\n toggleMute,\n setPlaybackRate,\n audioRef,\n notifyEnded,\n dispatch,\n ],\n );\n\n const playbackUi = derivePlaybackUiState(state);\n\n const mergedStyle = useMemo(\n () => (unstyled ? style : { ...defaultProviderStyle, ...style }),\n [style, unstyled],\n );\n\n return (\n <GingerLocaleProvider locale={locale}>\n <GingerPlaybackContext.Provider value={playbackValue}>\n <GingerMediaContext.Provider value={mediaValue}>\n <GingerContext.Provider value={value}>\n <div\n className={className}\n style={mergedStyle}\n data-ginger-playback={playbackUi}\n dir={providerDir}\n >\n {children}\n </div>\n </GingerContext.Provider>\n </GingerMediaContext.Provider>\n </GingerPlaybackContext.Provider>\n </GingerLocaleProvider>\n );\n}\n","import { GingerPlayer } from \"./audio/GingerPlayer\";\nimport * as Control from \"./components/controls/Controls\";\nimport * as Current from \"./components/current\";\nimport { GingerPlaylistCompound } from \"./components/playlist/GingerPlaylist\";\nimport * as Queue from \"./components/queue/QueueDisplay\";\nimport { GingerProvider } from \"./context/GingerProvider\";\n\nexport const Ginger = {\n Provider: GingerProvider,\n Player: GingerPlayer,\n Current: {\n Title: Current.Title,\n Artist: Current.Artist,\n Album: Current.Album,\n Description: Current.Description,\n Copyright: Current.Copyright,\n Genre: Current.Genre,\n Label: Current.Label,\n Isrc: Current.Isrc,\n TrackNumber: Current.TrackNumber,\n Year: Current.Year,\n Lyrics: Current.Lyrics,\n LyricsSynced: Current.LyricsSynced,\n Chapters: Current.Chapters,\n FileUrl: Current.FileUrl,\n Artwork: Current.Artwork,\n QueueIndex: Current.QueueIndex,\n QueueLength: Current.QueueLength,\n QueuePosition: Current.QueuePosition,\n Elapsed: Current.Elapsed,\n Duration: Current.Duration,\n Remaining: Current.Remaining,\n Progress: Current.Progress,\n TimeRail: Current.TimeRail,\n BufferRail: Current.BufferRail,\n PlaybackState: Current.PlaybackState,\n ErrorMessage: Current.ErrorMessage,\n },\n Queue: {\n Title: Queue.Title,\n Subtitle: Queue.Subtitle,\n Description: Queue.Description,\n Copyright: Queue.Copyright,\n Artwork: Queue.Artwork,\n },\n Control: {\n PlayPause: Control.PlayPause,\n Repeat: Control.Repeat,\n Next: Control.Next,\n Previous: Control.Previous,\n Shuffle: Control.Shuffle,\n SeekBar: Control.SeekBar,\n Volume: Control.Volume,\n Mute: Control.Mute,\n PlaybackRate: Control.PlaybackRate,\n },\n Playlist: GingerPlaylistCompound,\n};\n"],"names":["GingerContext","createContext","useGingerContext","ctx","useContext","readBufferedFraction","el","buffered","duration","GingerPlayer","className","style","preload","crossOrigin","respectReducedMotion","audioRef","dispatch","state","notifyEnded","url","_a","lastTimeSnapshotRef","useRef","lastActiveUrlRef","reducedMotion","setReducedMotion","useState","useEffect","mql","sync","syncTime","force","next","prev","timeThreshold","changedEnough","jsx","e","code","defaultGingerLocale","rate","mergeLocale","partial","GingerLocaleContext","GingerLocaleProvider","locale","children","value","useGingerLocale","formatMmSs","seconds","s","clampIndex","index","length","shuffleWithAnchor","tracks","anchorIndex","anchor","rest","_","i","j","trackIdentity","track","findIndexByTrackIdentity","target","byRef","t","identity","matches","nodeEnv","_b","insertTrackAt","at","removeTrackAt","moveTrack","fromIndex","toIndex","item","addNextTrack","currentIndex","computeEndedTransition","repeatMode","playbackMode","len","computeNextIndex","computePrevIndex","cycleRepeatMode","mode","resolveArtworkUrl","playlistArtwork","resolveAlbumLine","playlistSubtitle","getCurrentTrack","derivePlaybackUiState","effectiveDuration","d","hint","effectiveRemaining","rem","progressFraction","dur","resolvedArtwork","resolvedAlbumLine","useSeekBarBinding","pb","useGingerPlayback","md","useGingerMedia","useMemo","gingerStateFromContextValues","numericValue","ariaValueText","onSeekInput","useVolumeSlider","onVolumeInput","usePlayPauseBinding","options","playL","pauseL","PlayPause","playLabel","pauseLabel","playAriaLabel","pauseAriaLabel","type","onClick","defaultPlayAria","defaultPauseAria","b","Repeat","ariaLabel","cycleRepeat","label","Next","Previous","Shuffle","isShuffled","toggleShuffle","SeekBar","inputStyle","unstyled","mergedStyle","Volume","Mute","muteLabel","unmuteLabel","muted","toggleMute","m","u","defaultRates","PlaybackRate","rates","playbackRate","setPlaybackRate","a","jsxs","r","createTextDisplay","displayName","select","Comp","props","useGingerState","fallback","empty","node","createTrackFieldDisplay","Title","Artist","Album","Description","Copyright","Genre","Label","Isrc","TrackNumber","Year","format","y","text","Lyrics","preserveWhitespace","raw","whiteStyle","lrcTag","parseLrc","lrc","lines","rawLine","minutes","millis","time","useGingerLyricsSync","currentTime","currentTrack","line","activeIndex","LyricsSynced","activeClassName","lineClassName","active","useGingerChapters","seek","list","chapter","Chapters","formatStart","seekTo","FileUrl","visible","Artwork","sizes","loading","onError","decoding","imgStyle","src","alt","QueueIndex","base","QueueLength","QueuePosition","separator","renderTime","valueSeconds","Elapsed","Duration","Remaining","Progress","fraction","TimeRail","height","showBuffered","progressPct","bufPct","BufferRail","PlaybackState","ErrorMessage","live","GingerPlaylistConfigContext","usePlaylistConfig","GingerPlaylist","rowStyle","renderTrack","playOnSelect","playTrackAt","selectTrackAt","listStyle","GingerPlaylistTrack","liProps","buttonRest","defaultLabel","GingerPlaylistCompound","Subtitle","clampVolume","v","clampPlaybackRate","resetTimingOnly","defaultMedia","createInitialState","params","originalTracks","ordered","gingerReducer","action","playlistMeta","isPaused","volume","idx","insertIndex","ap","snapshot","shuffled","restored","current","newIndex","nextIndex","same","prevIndex","getMediaSession","useMediaSessionBridge","enabled","actions","title","artist","album","artworkUrl","ms","details","defaultProviderStyle","GingerProvider","initialTracks","initialIndex","initialPlaylistMeta","initialShuffle","initialRepeatMode","initialPlaybackMode","initialPaused","initialVolume","initialMuted","initialPlaybackRate","initialStateKey","mediaSession","beforePlay","onPlayBlocked","persistence","hydrateOnMount","resumeOnTrackChange","onTrackChange","onPlay","onPause","onQueueEnd","useReducer","stateRef","latestInitRef","prevInitialStateKeyRef","p","prevPausedRef","play","useCallback","pause","togglePlayPause","timeSeconds","setVolume","setMuted","setRepeatMode","setQueue","autoPlay","enqueueNext","setPlaylistMeta","meta","setPlaybackMode","init","payload","key","saved","id","currentUrl","cancelled","allowed","error","message","msg","transition","mediaSessionActions","providerDir","playbackValue","mediaValue","playbackUi","GingerPlaybackContext","GingerMediaContext","Ginger","Current.Title","Current.Artist","Current.Album","Current.Description","Current.Copyright","Current.Genre","Current.Label","Current.Isrc","Current.TrackNumber","Current.Year","Current.Lyrics","Current.LyricsSynced","Current.Chapters","Current.FileUrl","Current.Artwork","Current.QueueIndex","Current.QueueLength","Current.QueuePosition","Current.Elapsed","Current.Duration","Current.Remaining","Current.Progress","Current.TimeRail","Current.BufferRail","Current.PlaybackState","Current.ErrorMessage","Queue.Title","Queue.Subtitle","Queue.Description","Queue.Copyright","Queue.Artwork","Control.PlayPause","Control.Repeat","Control.Next","Control.Previous","Control.Shuffle","Control.SeekBar","Control.Volume","Control.Mute","Control.PlaybackRate"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const c=require("react/jsx-runtime"),f=require("react"),b=require("./GingerSplitContexts-C7puo0M7.cjs"),we=f.createContext(null);function _r(){const e=f.useContext(we);if(!e)throw new Error("Ginger components must be used within <Ginger.Provider>");return e}function Ne(e){const{buffered:r,duration:n}=e;return!(n>0)||r.length===0?0:Math.min(1,r.end(r.length-1)/n)}function Nr({className:e,style:r,preload:n="metadata",crossOrigin:t,respectReducedMotion:a=!1}){var I;const{audioRef:i,dispatch:u,state:s,notifyEnded:l}=_r(),o=((I=s.tracks[s.currentIndex])==null?void 0:I.fileUrl)??"",m=f.useRef({currentTime:-1,duration:-1,bufferedFraction:-1}),y=f.useRef(""),[x,k]=f.useState(!1);f.useEffect(()=>{if(!a||typeof window>"u")return;const p=window.matchMedia("(prefers-reduced-motion: reduce)"),E=()=>k(p.matches);return E(),p.addEventListener("change",E),()=>p.removeEventListener("change",E)},[a]);const v=(p,E=!1)=>{const P={currentTime:p.currentTime,duration:p.duration,bufferedFraction:Ne(p)},G=m.current,Me=x?.5:.25,O=Math.abs(P.currentTime-G.currentTime)>=Me||Math.abs(P.duration-G.duration)>=.01||Math.abs(P.bufferedFraction-G.bufferedFraction)>=.01;!E&&!O||(m.current=P,u({type:"MEDIA_TIME_UPDATE",payload:P}))};return f.useEffect(()=>{const p=i.current;p&&(p.volume=s.volume,p.muted=s.muted)},[i,s.volume,s.muted]),f.useEffect(()=>{const p=i.current;if(p){if(!o){p.removeAttribute("src"),m.current={currentTime:-1,duration:-1,bufferedFraction:-1},y.current!==""&&u({type:"MEDIA_SOURCE_CLEARED"}),y.current="";return}p.getAttribute("src")!==o&&(p.src=o,p.load(),m.current={currentTime:-1,duration:-1,bufferedFraction:-1}),y.current=o}},[i,u,s.currentIndex,s.tracks,o]),f.useEffect(()=>{const p=i.current;p&&(p.playbackRate=s.playbackRate)},[i,s.playbackRate,o]),c.jsx("audio",{ref:i,className:e,style:r,preload:n,crossOrigin:t,controls:!1,playsInline:!0,onTimeUpdate:p=>{v(p.currentTarget)},onLoadedMetadata:p=>{const E=p.currentTarget;m.current={currentTime:-1,duration:-1,bufferedFraction:-1},u({type:"MEDIA_LOADED_METADATA",payload:{duration:E.duration,bufferedFraction:Ne(E)}})},onSeeking:p=>v(p.currentTarget,!0),onSeeked:p=>v(p.currentTarget,!0),onEnded:()=>l(),onPlay:()=>u({type:"MEDIA_PLAY"}),onPause:()=>u({type:"MEDIA_PAUSE"}),onWaiting:()=>u({type:"MEDIA_WAITING"}),onCanPlay:()=>u({type:"MEDIA_CANPLAY"}),onProgress:p=>v(p.currentTarget,!0),onVolumeChange:p=>{const E=p.currentTarget;u({type:"MEDIA_VOLUME_SYNC",payload:{volume:E.volume,muted:E.muted}})},onError:()=>{var G;const p=i.current,E=(G=p==null?void 0:p.error)==null?void 0:G.code;u({type:"MEDIA_ERROR",payload:{message:E===1?"MEDIA_ERR_ABORTED":E===2?"MEDIA_ERR_NETWORK":E===3?"MEDIA_ERR_DECODE":E===4?"MEDIA_ERR_SRC_NOT_SUPPORTED":"MEDIA_ERR_UNKNOWN"}})}})}const Q={seek:"Seek",volume:"Volume",playbackSpeed:"Playback speed",nextTrack:"Next track",previousTrack:"Previous track",shuffle:"Shuffle",mute:"Mute",unmute:"Unmute",play:"Play",pause:"Pause",repeat:{off:"Repeat off",all:"Repeat all",one:"Repeat one"},playbackRateNormal:"1× normal",playbackRateTimes:e=>`${e}×`};function Lr(e){return e?{...Q,...e,repeat:{...Q.repeat,...e.repeat}}:Q}const De=f.createContext(Q);function wr({locale:e,children:r}){const n=Lr(e);return c.jsx(De.Provider,{value:n,children:r})}function A(){return f.useContext(De)}function H(e){if(!Number.isFinite(e)||e<0)return"0:00";const r=Math.floor(e%60);return`${Math.floor(e/60)}:${r.toString().padStart(2,"0")}`}function S(e,r){return r<=0?0:Math.max(0,Math.min(r-1,e))}function Fe(e,r){if(e.length<=1)return[...e];const n=e[r];if(!n)return[...e];const t=e.filter((a,i)=>i!==r);for(let a=t.length-1;a>0;a--){const i=Math.floor(Math.random()*(a+1));[t[a],t[i]]=[t[i],t[a]]}return[n,...t]}function K(e){return e?e.id!=null&&e.id!==""?`id:${e.id}`:`file:${e.fileUrl}`:""}function Dr(e,r){var u,s;if(!r)return 0;const n=e.findIndex(l=>l===r);if(n!==-1)return n;const t=K(r);if(!t)return 0;const a=[];for(let l=0;l<e.length;l+=1)K(e[l])===t&&a.push(l);if(a.length===0)return 0;if(a.length===1)return a[0];const i=typeof globalThis<"u"&&"process"in globalThis?(s=(u=globalThis.process)==null?void 0:u.env)==null?void 0:s.NODE_ENV:void 0;return i!=null&&i!=="production"&&console.warn("[@lucaismyname/ginger] Ambiguous track identity: multiple queue rows share the same fileUrl without a unique `id`. Resolving to the first match."),a[0]}function Ue(e,r,n){const t=[...e],a=Math.max(0,Math.min(t.length,n??t.length));return t.splice(a,0,r),t}function Fr(e,r){if(r<0||r>=e.length)return[...e];const n=[...e];return n.splice(r,1),n}function Ur(e,r,n){if(r===n||r<0||r>=e.length||n<0||n>=e.length)return[...e];const t=[...e],[a]=t.splice(r,1);return a?(t.splice(n,0,a),t):[...e]}function Vr(e,r,n){return Ue(e,n,Math.max(0,Math.min(e.length,r+1)))}function $r(e){const{tracks:r,currentIndex:n,repeatMode:t,playbackMode:a}=e,i=r.length;return i===0?{kind:"stop",nextIndex:0}:t==="one"?{kind:"replay_same"}:a==="single"?{kind:"stop",nextIndex:S(n,i)}:n<i-1?{kind:"advance",nextIndex:n+1}:t==="all"?{kind:"wrap",nextIndex:0}:{kind:"stop",nextIndex:S(n,i)}}function Ve(e){const{tracks:r,currentIndex:n,repeatMode:t,playbackMode:a}=e,i=r.length;return i===0?0:a==="single"?S(n,i):n<i-1?n+1:t==="all"?0:S(n,i)}function Br(e){const{tracks:r,currentIndex:n,repeatMode:t,playbackMode:a}=e,i=r.length;return i===0?0:a==="single"?S(n,i):n>0?n-1:t==="all"?i-1:0}function Or(e){return e==="off"?"all":e==="all"?"one":"off"}function $e(e,r){return(e==null?void 0:e.artworkUrl)??r??void 0}function Yr(e,r){return(e==null?void 0:e.album)??r??void 0}function j(e){return e.tracks[e.currentIndex]??null}function Ie(e){return e.errorMessage?"error":e.tracks.length===0?"idle":e.isBuffering?"loading":e.isPaused?Number.isFinite(e.duration)&&e.duration>0&&e.currentTime>=e.duration-.05?"ended":"paused":"playing"}function B(e){var t;const r=e.duration;if(Number.isFinite(r)&&r>0)return r;const n=(t=e.tracks[e.currentIndex])==null?void 0:t.durationSeconds;return typeof n=="number"&&Number.isFinite(n)&&n>0?n:0}function Be(e){const n=B(e)-e.currentTime;return Number.isFinite(n)?Math.max(0,n):0}function Pe(e){const r=B(e);return r>0?Math.min(1,Math.max(0,e.currentTime/r)):0}function Oe(e){var n;const r=j(e);return $e(r,(n=e.playlistMeta)==null?void 0:n.artworkUrl)}function Ye(e){var n;const r=j(e);return Yr(r,(n=e.playlistMeta)==null?void 0:n.subtitle)}function Qe(){const e=b.useGingerPlayback(),r=b.useGingerMedia(),n=A(),t=f.useMemo(()=>b.gingerStateFromContextValues(e,r),[e,r]),a=B(t),i=a>0?t.currentTime:0,u=Number.isFinite(i)?i:0,s=a>0?`${H(u)} of ${H(a)}`:H(u),l=o=>{r.seek(Number(o.currentTarget.value))};return{state:t,value:u,min:0,max:a>0?a:1,step:"any",ariaValueText:s,ariaLabel:n.seek,onSeekInput:l,onSeekChange:l}}function He(){const e=b.useGingerPlayback(),r=b.useGingerMedia(),n=A(),t=f.useMemo(()=>b.gingerStateFromContextValues(e,r),[e,r]),a=i=>{r.setVolume(Number(i.currentTarget.value))};return{state:t,value:t.volume,min:0,max:1,step:"any",ariaValueText:`${Math.round(t.volume*100)}%`,ariaLabel:n.volume,onVolumeInput:a,onVolumeChange:a}}function Ke(e){const r=b.useGingerPlayback(),n=A(),t=(e==null?void 0:e.playAriaLabel)??n.play,a=(e==null?void 0:e.pauseAriaLabel)??n.pause;return{isPaused:r.isPaused,toggle:r.togglePlayPause,ariaLabel:r.isPaused?t:a}}function Xe({playLabel:e="Play",pauseLabel:r="Pause",playAriaLabel:n,pauseAriaLabel:t,children:a,type:i="button",onClick:u,...s}){const l=A(),o=typeof e=="string"?e:l.play,m=typeof r=="string"?r:l.pause,y=Ke({playAriaLabel:n??o,pauseAriaLabel:t??m});return c.jsx("button",{...s,type:i,"aria-label":y.ariaLabel,onClick:x=>{y.toggle(),u==null||u(x)},children:a??(y.isPaused?e:r)})}Xe.displayName="Ginger.Control.PlayPause";function qe({type:e="button",ariaLabel:r,onClick:n,children:t,...a}){const{repeatMode:i,cycleRepeat:u}=b.useGingerPlayback(),l=A().repeat[i];return c.jsx("button",{...a,type:e,"aria-label":r??l,onClick:o=>{u(),n==null||n(o)},children:t??l})}qe.displayName="Ginger.Control.Repeat";function ze({type:e="button",children:r="Next",ariaLabel:n,onClick:t,...a}){const{next:i}=b.useGingerPlayback(),u=A();return c.jsx("button",{...a,type:e,"aria-label":n??u.nextTrack,onClick:s=>{i(),t==null||t(s)},children:r??u.nextTrack})}ze.displayName="Ginger.Control.Next";function We({type:e="button",children:r="Previous",ariaLabel:n,onClick:t,...a}){const{prev:i}=b.useGingerPlayback(),u=A();return c.jsx("button",{...a,type:e,"aria-label":n??u.previousTrack,onClick:s=>{i(),t==null||t(s)},children:r})}We.displayName="Ginger.Control.Previous";function Je({type:e="button",children:r="Shuffle",ariaLabel:n,onClick:t,...a}){const{isShuffled:i,toggleShuffle:u}=b.useGingerPlayback(),s=A();return c.jsx("button",{...a,type:e,"aria-pressed":i,"aria-label":n??s.shuffle,onClick:l=>{u(),t==null||t(l)},children:r??s.shuffle})}Je.displayName="Ginger.Control.Shuffle";function Ze({inputStyle:e,style:r,unstyled:n=!1,ariaLabel:t,...a}){const i=Qe(),u=n?{...r,...e}:{width:"100%",...r,...e};return c.jsx("input",{...a,type:"range",min:i.min,max:i.max,step:i.step,value:i.value,"aria-label":t??i.ariaLabel,"aria-valuetext":i.ariaValueText,onInput:i.onSeekInput,onChange:i.onSeekChange,style:u})}Ze.displayName="Ginger.Control.SeekBar";function er({inputStyle:e,style:r,unstyled:n=!1,ariaLabel:t,...a}){const i=He(),u=n?{...r,...e}:{width:"100%",...r,...e};return c.jsx("input",{...a,type:"range",min:i.min,max:i.max,step:i.step,value:i.value,"aria-label":t??i.ariaLabel,"aria-valuetext":i.ariaValueText,onInput:i.onVolumeInput,onChange:i.onVolumeChange,style:u})}er.displayName="Ginger.Control.Volume";function rr({ariaLabel:e,muteLabel:r,unmuteLabel:n,type:t="button",onClick:a,children:i,...u}){const{muted:s,toggleMute:l}=b.useGingerMedia(),o=A(),m=r??o.mute,y=n??o.unmute;return c.jsx("button",{...u,type:t,"aria-pressed":s,"aria-label":e??(s?o.unmute:o.mute),onClick:x=>{l(),a==null||a(x)},children:i??(s?y:m)})}rr.displayName="Ginger.Control.Mute";const Qr=[.5,.75,1,1.25,1.5,2];function nr({rates:e=Qr,style:r,ariaLabel:n,children:t,...a}){const{playbackRate:i,setPlaybackRate:u}=b.useGingerMedia(),s=A(),l=f.useMemo(()=>Array.from(new Set([...e,i])).sort((o,m)=>o-m),[e,i]);return c.jsxs("select",{...a,"aria-label":n??s.playbackSpeed,value:String(i),style:r,onChange:o=>u(Number(o.currentTarget.value)),children:[t??s.playbackSpeed,l.map(o=>c.jsx("option",{value:String(o),children:o===1?s.playbackRateNormal:s.playbackRateTimes(o)},o))]})}nr.displayName="Ginger.Control.PlaybackRate";function F(e,r){function n(t){const a=b.useGingerState(),u=(r(a)??"").trim(),{className:s,style:l,fallback:o,empty:m,children:y}=t;if(!u){const x=m??o??null;return x?c.jsx("span",{className:s,style:l,children:x}):null}return y?c.jsx("span",{className:s,style:l,children:y(u,a)}):c.jsx("span",{className:s,style:l,children:u})}return n.displayName=e,n}function U(e,r){return F(e,n=>r(j(n)))}const Hr=U("Ginger.Current.Title",e=>e==null?void 0:e.title),Kr=U("Ginger.Current.Artist",e=>e==null?void 0:e.artist),Xr=F("Ginger.Current.Album",e=>Ye(e)),qr=U("Ginger.Current.Description",e=>e==null?void 0:e.description),zr=F("Ginger.Current.Copyright",e=>{var n;const r=j(e);return(r==null?void 0:r.copyright)??((n=e.playlistMeta)==null?void 0:n.copyright)}),Wr=U("Ginger.Current.Genre",e=>e==null?void 0:e.genre),Jr=U("Ginger.Current.Label",e=>e==null?void 0:e.label),Zr=U("Ginger.Current.Isrc",e=>e==null?void 0:e.isrc),en=U("Ginger.Current.TrackNumber",e=>(e==null?void 0:e.trackNumber)!=null?String(e.trackNumber):void 0);function tr({className:e,style:r,fallback:n,empty:t,children:a,format:i}){var o;const u=b.useGingerState(),s=(o=j(u))==null?void 0:o.year;if(typeof s!="number"||!Number.isFinite(s)){const m=t??n??null;return m?c.jsx("span",{className:e,style:r,children:m}):null}const l=i?i(s):String(s);return a?c.jsx("span",{className:e,style:r,children:a(l,u)}):c.jsx("span",{className:e,style:r,children:l})}tr.displayName="Ginger.Current.Year";function ar({className:e,style:r,fallback:n,empty:t,children:a,preserveWhitespace:i=!0}){var m;const u=b.useGingerState(),s=((m=j(u))==null?void 0:m.lyrics)??"",l=i?s.replace(/^\s+|\s+$/g,""):s.trim();if(!l){const y=t??n??null;return y?c.jsx("span",{className:e,style:r,children:y}):null}const o=i?{whiteSpace:"pre-wrap"}:void 0;return a?c.jsx("span",{className:e,style:{...o,...r},children:a(l,u)}):c.jsx("span",{className:e,style:{...o,...r},children:l})}ar.displayName="Ginger.Current.Lyrics";const Le=/\[(\d{1,2}):(\d{2})(?:\.(\d{1,3}))?\]/g;function ir(e){const r=[];for(const n of e.split(/\r?\n/)){const t=[...n.matchAll(Le)];if(t.length===0)continue;const a=n.replace(Le,"").trim();for(const i of t){const u=Number(i[1]??0),s=Number(i[2]??0),l=Number((i[3]??"0").padEnd(3,"0")),o=u*60+s+l/1e3;Number.isFinite(o)&&o>=0&&r.push({time:o,text:a})}}return r.sort((n,t)=>n.time-t.time)}function ur(){const{tracks:e,currentIndex:r}=b.useGingerPlayback(),{currentTime:n}=b.useGingerMedia(),t=e[r],a=f.useMemo(()=>t?Array.isArray(t.lyricsTimed)&&t.lyricsTimed.length>0?[...t.lyricsTimed].filter(u=>Number.isFinite(u.time)&&u.time>=0).sort((u,s)=>u.time-s.time):typeof t.lyrics=="string"?ir(t.lyrics):[]:[],[t]),i=f.useMemo(()=>{for(let u=a.length-1;u>=0;u-=1)if(n>=a[u].time)return u;return-1},[n,a]);return{lines:a,activeIndex:i,activeLine:i>=0?a[i]??null:null}}function Ae({className:e,style:r,fallback:n,empty:t,unstyled:a=!1,activeClassName:i,lineClassName:u,children:s}){const l=b.useGingerState(),{lines:o,activeIndex:m}=ur();if(o.length===0){const x=t??n??null;return x?c.jsx("span",{className:e,style:r,children:x}):null}const y=a?{}:{listStyle:"none",margin:0,padding:0,fontFamily:"var(--ginger-font-family, system-ui, sans-serif)",fontSize:"var(--ginger-font-size, 14px)",color:"var(--ginger-primary-color, #111827)"};return c.jsx("ul",{className:e,style:{...y,...r},"aria-label":"Synced lyrics",children:o.map((x,k)=>{const v=k===m;return c.jsx("li",{"aria-current":v?"true":void 0,"data-ginger-active":v||void 0,className:[u,v?i:void 0].filter(Boolean).join(" ")||void 0,style:a?void 0:{padding:"var(--ginger-playlist-row-padding, 4px 8px)",fontWeight:v?600:400,opacity:v?1:.75},children:s?s(x,k,v,l):x.text},`${x.time}-${k}`)})})}Ae.displayName="Ginger.Current.LyricsSynced";function sr(){const{tracks:e,currentIndex:r}=b.useGingerPlayback(),{currentTime:n,seek:t}=b.useGingerMedia(),a=f.useMemo(()=>{var s;return[...((s=e[r])==null?void 0:s.chapters)??[]].filter(l=>l&&Number.isFinite(l.startSeconds)&&l.startSeconds>=0).sort((l,o)=>l.startSeconds-o.startSeconds)},[r,e]),i=f.useMemo(()=>{if(a.length===0)return-1;for(let u=a.length-1;u>=0;u-=1)if(n>=a[u].startSeconds)return u;return-1},[n,a]);return{list:a,activeIndex:i,active:i>=0?a[i]??null:null,seekTo:u=>{const s=a[u];s&&t(s.startSeconds)}}}function Re({className:e,style:r,fallback:n,empty:t,unstyled:a=!1,formatStart:i=H,children:u}){const s=b.useGingerState(),{list:l,activeIndex:o,seekTo:m}=sr();if(l.length===0){const x=t??n??null;return x?c.jsx("span",{className:e,style:r,children:x}):null}const y=a?{}:{listStyle:"none",margin:0,padding:0,fontFamily:"var(--ginger-font-family, system-ui, sans-serif)",fontSize:"var(--ginger-font-size, 14px)",color:"var(--ginger-primary-color, #111827)"};return c.jsx("ul",{className:e,style:{...y,...r},"aria-label":"Chapters",children:l.map((x,k)=>{const v=k===o;return c.jsx("li",{children:c.jsx("button",{type:"button","aria-current":v?"true":void 0,"data-ginger-active":v||void 0,onClick:()=>m(k),style:{width:a?void 0:"100%",textAlign:a?void 0:"left",border:a?void 0:"none",background:a?void 0:v?"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))":"transparent",color:a?void 0:"inherit",font:a?void 0:"inherit",cursor:a?void 0:"pointer",padding:a?void 0:"var(--ginger-playlist-row-padding, 6px 8px)"},children:u?u(x,k,v,s):c.jsxs("span",{children:[c.jsx("span",{style:{opacity:.75,marginRight:"0.35em"},children:i(x.startSeconds)}),x.title]})})},`${x.startSeconds}-${x.title}`)})})}Re.displayName="Ginger.Current.Chapters";function or({visible:e=!1,className:r,style:n,fallback:t,empty:a,children:i}){var l;const u=b.useGingerState();if(!e)return null;const s=((l=j(u))==null?void 0:l.fileUrl)??"";if(!s){const o=a??t??null;return o?c.jsx("span",{className:r,style:n,children:o}):null}return i?c.jsx("span",{className:r,style:n,children:i(s,u)}):c.jsx("span",{className:r,style:n,children:s})}or.displayName="Ginger.Current.FileUrl";function lr({className:e,style:r,fallback:n,empty:t,sizes:a,loading:i,onError:u,decoding:s,unstyled:l=!1,imgStyle:o}){const m=b.useGingerState(),y=j(m),x=Oe(m);if(!x){const v=t??n??null;return v?c.jsx("span",{className:e,style:r,children:v}):null}const k=[y==null?void 0:y.title,y==null?void 0:y.artist].filter(Boolean).join(" — ")||"Artwork";return c.jsx("div",{className:e,style:l?{...r}:{background:"var(--ginger-artwork-bg, transparent)",borderRadius:"var(--ginger-artwork-radius, 0)",overflow:"hidden",...r},children:c.jsx("img",{src:x,alt:k,sizes:a,loading:i,decoding:s,onError:u,style:{display:l?void 0:"block",width:l?void 0:"100%",height:l?void 0:"100%",objectFit:l?void 0:"cover",...o}})})}lr.displayName="Ginger.Current.Artwork";function cr({base:e=0,className:r,style:n,fallback:t,empty:a,children:i}){const u=b.useGingerState();if(u.tracks.length===0){const o=a??t??null;return o?c.jsx("span",{className:r,style:n,children:o}):null}const l=String(u.currentIndex+e);return i?c.jsx("span",{className:r,style:n,children:i(l,u)}):c.jsx("span",{className:r,style:n,children:l})}cr.displayName="Ginger.Current.QueueIndex";function dr({className:e,style:r,fallback:n,empty:t,children:a}){const i=b.useGingerState(),u=String(i.tracks.length);if(i.tracks.length===0){const s=t??n??null;return s?c.jsx("span",{className:e,style:r,children:s}):null}return a?c.jsx("span",{className:e,style:r,children:a(u,i)}):c.jsx("span",{className:e,style:r,children:u})}dr.displayName="Ginger.Current.QueueLength";function fr({base:e=0,separator:r=" / ",className:n,style:t,fallback:a,empty:i,children:u}){const s=b.useGingerState(),l=s.tracks.length;if(l===0){const x=i??a??null;return x?c.jsx("span",{className:n,style:t,children:x}):null}const o=String(s.currentIndex+e),m=String(l),y=`${o}${r}${m}`;return u?c.jsx("span",{className:n,style:t,children:u({index:o,length:m,label:y},s)}):c.jsx("span",{className:n,style:t,children:y})}fr.displayName="Ginger.Current.QueuePosition";function Ge(e,r,n){const{className:t,style:a,fallback:i,empty:u,children:s,format:l=H}=n;if(!(e>=0)||!Number.isFinite(e)){const m=u??i??null;return m?c.jsx("span",{className:t,style:a,children:m}):null}const o=l(e);return s?c.jsx("span",{className:t,style:a,children:s(o,r)}):c.jsx("span",{className:t,style:a,children:o})}function gr(e){const r=b.useGingerState();return Ge(r.currentTime,r,e)}gr.displayName="Ginger.Current.Elapsed";function pr(e){const r=b.useGingerState();return Ge(B(r),r,e)}pr.displayName="Ginger.Current.Duration";function mr(e){const r=b.useGingerState();return Ge(Be(r),r,e)}mr.displayName="Ginger.Current.Remaining";function yr({className:e,style:r,fallback:n,empty:t,children:a}){const i=b.useGingerState(),u=B(i),s=Pe(i);if(!(u>0)){const l=t??n??null;return l?c.jsx("span",{className:e,style:r,children:l}):null}return a?c.jsx("span",{className:e,style:r,children:a({fraction:s,currentTime:i.currentTime,duration:u},i)}):c.jsx("span",{className:e,style:r,children:`${Math.round(s*100)}%`})}yr.displayName="Ginger.Current.Progress";function br({className:e,style:r,height:n=4,showBuffered:t=!1,unstyled:a=!1}){const i=b.useGingerState(),u=`${Math.round(Pe(i)*100)}%`,s=`${Math.round(Math.min(1,Math.max(0,i.bufferedFraction))*100)}%`;return c.jsxs("div",{className:e,style:a?{...r}:{width:"100%",height:n,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",position:"relative",...r},"aria-hidden":!0,children:[t?c.jsx("div",{style:{position:a?void 0:"absolute",left:a?void 0:0,top:a?void 0:0,height:a?void 0:"100%",width:s,background:a?void 0:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}}):null,c.jsx("div",{style:{position:a?void 0:"relative",width:u,height:a?void 0:"100%",background:a?void 0:"var(--ginger-primary-color, #111827)"}})]})}br.displayName="Ginger.Current.TimeRail";function xr({className:e,style:r,height:n=4,unstyled:t=!1}){const a=b.useGingerState(),i=`${Math.round(Math.min(1,Math.max(0,a.bufferedFraction))*100)}%`;return c.jsx("div",{className:e,style:t?{...r}:{width:"100%",height:n,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",...r},"aria-hidden":!0,children:c.jsx("div",{style:{width:i,height:t?void 0:"100%",background:t?void 0:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}})})}xr.displayName="Ginger.Current.BufferRail";function hr({className:e,style:r,fallback:n,empty:t,children:a}){const i=b.useGingerState(),u=Ie(i);return a?c.jsx("span",{className:e,style:r,children:a(u,i)}):c.jsx("span",{className:e,style:r,children:u})}hr.displayName="Ginger.Current.PlaybackState";function vr({className:e,style:r,fallback:n,empty:t,live:a="polite",children:i}){const u=b.useGingerState(),s=u.errorMessage??"";if(!s){const l=t??n??null;return l?c.jsx("span",{className:e,style:r,children:l}):null}return i?c.jsx("span",{className:e,style:r,"aria-live":a,children:i(s,u)}):c.jsx("span",{className:e,style:r,"aria-live":a,children:s})}vr.displayName="Ginger.Current.ErrorMessage";const Se=f.createContext(null);function rn(){const e=f.useContext(Se);if(!e)throw new Error("Ginger.Playlist.Track must be used inside <Ginger.Playlist>");return e}function kr({children:e,unstyled:r=!1,rowStyle:n,renderTrack:t,playOnSelect:a=!0,style:i,...u}){const{tracks:s,currentIndex:l,playTrackAt:o,selectTrackAt:m}=b.useGingerPlayback(),y=r?{...i}:{listStyle:"none",margin:0,padding:0,fontFamily:"var(--ginger-font-family, system-ui, sans-serif)",fontSize:"var(--ginger-font-size, 14px)",color:"var(--ginger-primary-color, #111827)",...i};return e!==void 0?c.jsx(Se.Provider,{value:{playOnSelect:a},children:c.jsx("ul",{style:y,...u,children:e})}):c.jsx(Se.Provider,{value:{playOnSelect:a},children:c.jsx("ul",{style:y,...u,children:s.map((k,v)=>{const I=v===l;return c.jsx("li",{children:c.jsx("button",{type:"button",onClick:()=>{a?o(v):m(v)},style:{width:r?void 0:"100%",textAlign:r?void 0:"left",border:r?void 0:"none",background:r?void 0:I?"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))":"transparent",color:r?void 0:"inherit",font:r?void 0:"inherit",cursor:r?void 0:"pointer",padding:r?void 0:"var(--ginger-playlist-row-padding, 6px 8px)",...n},children:t?t(k,v,I):c.jsxs("span",{children:[k.title,k.artist?` — ${k.artist}`:""]})})},`${v}-${K(k)}`)})})})}kr.displayName="Ginger.Playlist";function Mr({index:e,unstyled:r=!1,className:n,style:t,children:a,liProps:i,onClick:u,...s}){const{playOnSelect:l}=rn(),{tracks:o,currentIndex:m,playTrackAt:y,selectTrackAt:x}=b.useGingerPlayback(),k=e===m,v=o[e],I=v!=null?c.jsxs("span",{children:[v.title,v.artist?` — ${v.artist}`:""]}):null;return c.jsx("li",{...i,children:c.jsx("button",{type:"button","aria-current":k?"true":void 0,"data-ginger-active":k||void 0,className:n,style:{width:r?void 0:"100%",textAlign:r?void 0:"left",border:r?void 0:"none",background:r?void 0:k?"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))":"transparent",color:r?void 0:"inherit",font:r?void 0:"inherit",cursor:r?void 0:"pointer",padding:r?void 0:"var(--ginger-playlist-row-padding, 6px 8px)",...t},...s,onClick:p=>{u==null||u(p),!p.defaultPrevented&&(l?y(e):x(e))},children:a??I})})}Mr.displayName="Ginger.Playlist.Track";const nn=Object.assign(kr,{Track:Mr}),tn=F("Ginger.Queue.Title",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.title}),an=F("Ginger.Queue.Subtitle",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.subtitle}),un=F("Ginger.Queue.Description",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.description}),sn=F("Ginger.Queue.Copyright",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.copyright});function Tr({className:e,style:r,fallback:n,empty:t,unstyled:a=!1,imgStyle:i}){var o,m;const u=b.useGingerState(),s=(o=u.playlistMeta)==null?void 0:o.artworkUrl;if(!s){const y=t??n??null;return y?c.jsx("span",{className:e,style:r,children:y}):null}const l=((m=u.playlistMeta)==null?void 0:m.title)??"Playlist artwork";return c.jsx("span",{className:e,style:a?{...r}:{display:"inline-block",background:"var(--ginger-artwork-bg, #f3f4f6)",borderRadius:"var(--ginger-artwork-radius, 6px)",overflow:"hidden",...r},children:c.jsx("img",{src:s,alt:l,style:{display:a?void 0:"block",width:a?void 0:"100%",height:a?void 0:"100%",objectFit:a?void 0:"cover",...i}})})}Tr.displayName="Ginger.Queue.Artwork";function X(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):1}function ke(e){return Number.isFinite(e)?Math.min(4,Math.max(.25,e)):1}const w={currentTime:0,duration:0,bufferedFraction:0,isBuffering:!1,errorMessage:null},on={...w,volume:1,muted:!1,playbackRate:1};function Er(e){const r=[...e.tracks];let n=S(e.currentIndex??0,r.length),t=null,a=r;return e.isShuffled&&r.length>1&&(t=[...r],a=Fe(r,n),n=0),{tracks:a,currentIndex:n,playbackMode:e.playbackMode??"playlist",isPaused:e.isPaused??!0,isShuffled:!!(e.isShuffled&&a.length>1),repeatMode:e.repeatMode??"off",originalTracks:t,playlistMeta:e.playlistMeta??null,...on,volume:X(e.volume??1),muted:e.muted??!1,playbackRate:ke(e.playbackRate??1)}}function ln(e,r){switch(r.type){case"INIT":{const{tracks:n,currentIndex:t,playlistMeta:a,isPaused:i,isShuffled:u,repeatMode:s,playbackMode:l,volume:o,muted:m,playbackRate:y}=r.payload;return Er({tracks:n,currentIndex:t,playlistMeta:a??null,isPaused:i??!0,isShuffled:u??!1,repeatMode:s??"off",playbackMode:l??"playlist",volume:o,muted:m,playbackRate:y})}case"SET_QUEUE":{const{tracks:n,currentIndex:t}=r.payload,a=[...n],i=S(t??e.currentIndex,a.length);return{...e,tracks:a,currentIndex:i,isShuffled:!1,originalTracks:null,...w}}case"INSERT_TRACK":{const n=r.payload.index??e.tracks.length,t=Ue(e.tracks,r.payload.track,n);if(r.payload.autoPlay){const i=S(n,t.length);return{...e,tracks:t,currentIndex:i,isShuffled:!1,originalTracks:null,isPaused:!1,...w}}const a=n<=e.currentIndex?e.currentIndex+1:e.currentIndex;return{...e,tracks:t,isShuffled:!1,originalTracks:null,currentIndex:S(a,t.length)}}case"REMOVE_TRACK":{const n=r.payload.index,t=Fr(e.tracks,n),a=n<e.currentIndex?e.currentIndex-1:n===e.currentIndex?Math.min(e.currentIndex,Math.max(0,t.length-1)):e.currentIndex;return{...e,tracks:t,isShuffled:!1,originalTracks:null,currentIndex:S(a,t.length),...n===e.currentIndex?w:{}}}case"MOVE_TRACK":{const{fromIndex:n,toIndex:t}=r.payload,a=Ur(e.tracks,n,t);let i=e.currentIndex;return e.currentIndex===n?i=t:n<e.currentIndex&&t>=e.currentIndex?i-=1:n>e.currentIndex&&t<=e.currentIndex&&(i+=1),{...e,tracks:a,isShuffled:!1,originalTracks:null,currentIndex:S(i,a.length)}}case"ADD_NEXT":{const n=Vr(e.tracks,e.currentIndex,r.payload.track);return{...e,tracks:n,isShuffled:!1,originalTracks:null}}case"SET_INDEX":{const n=S(r.payload.index,e.tracks.length),t=r.payload.autoPlay,a=t===!0?!1:t===!1?!0:e.isPaused;return{...e,currentIndex:n,...w,isPaused:a}}case"PLAY":return{...e,isPaused:!1};case"PAUSE":return{...e,isPaused:!0};case"TOGGLE_PAUSE":return{...e,isPaused:!e.isPaused};case"SET_REPEAT":return{...e,repeatMode:r.payload};case"CYCLE_REPEAT":return{...e,repeatMode:Or(e.repeatMode)};case"TOGGLE_SHUFFLE":{if(e.tracks.length<=1)return{...e,isShuffled:!1,originalTracks:null};if(!e.isShuffled){const i=[...e.tracks],u=Fe(i,e.currentIndex);return{...e,isShuffled:!0,originalTracks:i,tracks:u,currentIndex:0}}const n=e.originalTracks?[...e.originalTracks]:[...e.tracks],t=e.tracks[e.currentIndex],a=Dr(n,t);return{...e,isShuffled:!1,originalTracks:null,tracks:n,currentIndex:S(a,n.length)}}case"NEXT":{const n=Ve(e),t=n===e.currentIndex;return{...e,currentIndex:n,...t?{}:w,isPaused:t?e.isPaused:!1}}case"PREV":{const n=Br(e),t=n===e.currentIndex;return{...e,currentIndex:n,...t?{}:w,isPaused:t?e.isPaused:!1}}case"MEDIA_TIME_UPDATE":return{...e,currentTime:r.payload.currentTime,duration:Number.isFinite(r.payload.duration)?r.payload.duration:e.duration,bufferedFraction:r.payload.bufferedFraction,isBuffering:!1};case"MEDIA_LOADED_METADATA":return{...e,duration:Number.isFinite(r.payload.duration)?r.payload.duration:e.duration,bufferedFraction:r.payload.bufferedFraction,errorMessage:null};case"SET_PLAYLIST_META":return{...e,playlistMeta:r.payload};case"SET_PLAYBACK_MODE":return{...e,playbackMode:r.payload};case"MEDIA_ERROR":return{...e,errorMessage:r.payload.message,isPaused:!0,isBuffering:!1};case"MEDIA_WAITING":return{...e,isBuffering:!0};case"MEDIA_CANPLAY":return{...e,isBuffering:!1,errorMessage:null};case"MEDIA_PLAY":return{...e,isPaused:!1,isBuffering:!1};case"MEDIA_PAUSE":return{...e,isPaused:!0};case"RESET_MEDIA_TIMES":return{...e,currentTime:0,duration:0,bufferedFraction:0};case"MEDIA_SOURCE_CLEARED":return{...e,...w};case"SET_VOLUME":return{...e,volume:X(r.payload)};case"SET_MUTED":return{...e,muted:r.payload};case"TOGGLE_MUTE":return{...e,muted:!e.muted};case"SET_PLAYBACK_RATE":return{...e,playbackRate:ke(r.payload)};case"MEDIA_VOLUME_SYNC":{const{volume:n,muted:t}=r.payload,a=X(n);return a===e.volume&&t===e.muted?e:{...e,volume:a,muted:t}}default:return e}}function Ee(){return typeof navigator>"u"||!("mediaSession"in navigator)?null:navigator.mediaSession}function cn(e,r,n){var l;const t=r.tracks[r.currentIndex],a=t==null?void 0:t.title,i=t==null?void 0:t.artist,u=t==null?void 0:t.album,s=$e(t,(l=r.playlistMeta)==null?void 0:l.artworkUrl);f.useEffect(()=>{const o=Ee();!e||!o||(o.metadata=new MediaMetadata({title:a??"Unknown track",artist:i,album:u,artwork:s?[{src:s}]:void 0}))},[e,a,i,u,s]),f.useEffect(()=>{const o=Ee();!e||!o||(o.playbackState=r.isPaused?"paused":"playing")},[e,r.isPaused]),f.useEffect(()=>{const o=Ee();if(!(!e||!o)){try{o.setActionHandler("play",n.play),o.setActionHandler("pause",n.pause),o.setActionHandler("nexttrack",n.next),o.setActionHandler("previoustrack",n.prev),o.setActionHandler("seekto",m=>{typeof m.seekTime=="number"&&Number.isFinite(m.seekTime)&&n.seek(m.seekTime)})}catch{}return()=>{try{o.setActionHandler("play",null),o.setActionHandler("pause",null),o.setActionHandler("nexttrack",null),o.setActionHandler("previoustrack",null),o.setActionHandler("seekto",null)}catch{}}}},[e,n])}const dn={"--ginger-primary-color":"#111827","--ginger-muted-color":"#6b7280","--ginger-font-size":"14px","--ginger-font-family":"system-ui, sans-serif","--ginger-playlist-row-padding":"6px 8px","--ginger-artwork-radius":"6px","--ginger-artwork-bg":"#f3f4f6","--ginger-playlist-active-bg":"rgba(17, 24, 39, 0.06)","--ginger-buffer-color":"rgba(107, 114, 128, 0.35)","--ginger-focus-ring":"0 0 0 2px rgba(59, 130, 246, 0.45)"};function fn({children:e,initialTracks:r=[],initialIndex:n=0,initialPlaylistMeta:t=null,initialShuffle:a=!1,initialRepeatMode:i="off",initialPlaybackMode:u="playlist",initialPaused:s=!0,initialVolume:l=1,initialMuted:o=!1,initialPlaybackRate:m=1,initialStateKey:y,locale:x,mediaSession:k=!1,beforePlay:v,onPlayBlocked:I,persistence:p,hydrateOnMount:E=!1,resumeOnTrackChange:P=!1,unstyled:G=!1,className:Me,style:O,onTrackChange:q,onPlay:z,onPause:W,onQueueEnd:J,onError:Z}){var _e;const D=f.useRef(null),[d,h]=f.useReducer(ln,void 0,()=>Er({tracks:r,currentIndex:n,playlistMeta:t,isPaused:s,isShuffled:a,repeatMode:i,playbackMode:u,volume:l,muted:o,playbackRate:m})),Ce=f.useRef(d),Te=f.useRef({tracks:r,currentIndex:n,playlistMeta:t,isPaused:s,isShuffled:a,repeatMode:i,playbackMode:u,volume:l,muted:o,playbackRate:m});Te.current={tracks:r,currentIndex:n,playlistMeta:t,isPaused:s,isShuffled:a,repeatMode:i,playbackMode:u,volume:l,muted:o,playbackRate:m};const Y=f.useRef(void 0);f.useEffect(()=>{if(y===void 0){Y.current=void 0;return}if(Y.current===void 0){Y.current=y;return}if(Y.current===y)return;Y.current=y;const g=Te.current;h({type:"INIT",payload:{tracks:g.tracks,currentIndex:g.currentIndex,playlistMeta:g.playlistMeta,isPaused:g.isPaused,isShuffled:g.isShuffled,repeatMode:g.repeatMode,playbackMode:g.playbackMode,volume:g.volume,muted:g.muted,playbackRate:g.playbackRate}})},[y,h]),f.useEffect(()=>{Ce.current=d},[d]);const je=d.tracks[d.currentIndex]??null;f.useEffect(()=>{q==null||q(je,d.currentIndex)},[je,d.currentIndex,q]),f.useEffect(()=>{d.errorMessage&&(Z==null||Z(d.errorMessage))},[d.errorMessage,Z]);const ee=f.useRef(void 0);f.useEffect(()=>{if(ee.current===void 0){ee.current=d.isPaused;return}ee.current!==d.isPaused&&(d.isPaused?W==null||W():z==null||z()),ee.current=d.isPaused},[d.isPaused,W,z]);const _=f.useCallback(()=>{h({type:"PLAY"})},[]),N=f.useCallback(()=>{var g;h({type:"PAUSE"}),(g=D.current)==null||g.pause()},[]),re=f.useCallback(()=>{d.isPaused?_():N()},[N,_,d.isPaused]),L=f.useCallback(g=>{const M=D.current;M&&Number.isFinite(g)&&(M.currentTime=Math.max(0,g))},[]),ne=f.useCallback(g=>{h({type:"SET_VOLUME",payload:X(g)})},[]),te=f.useCallback(g=>{h({type:"SET_MUTED",payload:g})},[]),ae=f.useCallback(()=>{h({type:"TOGGLE_MUTE"})},[]),ie=f.useCallback(g=>{h({type:"SET_PLAYBACK_RATE",payload:ke(g)})},[]),V=f.useCallback(()=>{h({type:"NEXT"})},[]),$=f.useCallback(()=>{h({type:"PREV"})},[]),ue=f.useCallback(g=>{h({type:"SET_REPEAT",payload:g})},[]),se=f.useCallback(()=>{h({type:"CYCLE_REPEAT"})},[]),oe=f.useCallback(()=>{h({type:"TOGGLE_SHUFFLE"})},[]),le=f.useCallback((g,M)=>{h({type:"SET_QUEUE",payload:{tracks:g,currentIndex:M}})},[]),ce=f.useCallback((g,M,T)=>{h({type:"INSERT_TRACK",payload:{track:g,index:M,autoPlay:T}})},[]),de=f.useCallback(g=>{h({type:"REMOVE_TRACK",payload:{index:g}})},[]),fe=f.useCallback((g,M)=>{h({type:"MOVE_TRACK",payload:{fromIndex:g,toIndex:M}})},[]),ge=f.useCallback(g=>{h({type:"ADD_NEXT",payload:{track:g}})},[]),pe=f.useCallback(g=>{h({type:"SET_INDEX",payload:{index:g,autoPlay:!0}})},[]),me=f.useCallback(g=>{h({type:"SET_INDEX",payload:{index:g,autoPlay:!1}})},[]),ye=f.useCallback(g=>{h({type:"SET_PLAYLIST_META",payload:g})},[]),be=f.useCallback(g=>{h({type:"SET_PLAYBACK_MODE",payload:g})},[]),xe=f.useCallback(g=>{h({type:"INIT",payload:g})},[]);f.useEffect(()=>{if(!p||!E)return;const g=p.get("ginger:volume"),M=p.get("ginger:muted"),T=p.get("ginger:playbackRate"),C=p.get("ginger:repeatMode"),ve=p.get("ginger:currentIndex"),R=Te.current;h({type:"INIT",payload:{tracks:R.tracks,playlistMeta:R.playlistMeta,isPaused:R.isPaused,isShuffled:R.isShuffled,playbackMode:R.playbackMode,currentIndex:typeof ve=="number"?ve:R.currentIndex,repeatMode:C==="off"||C==="all"||C==="one"?C:R.repeatMode,volume:typeof g=="number"?g:R.volume,muted:typeof M=="boolean"?M:R.muted,playbackRate:typeof T=="number"?T:R.playbackRate}})},[E,p]),f.useEffect(()=>{p&&(p.set("ginger:volume",d.volume),p.set("ginger:muted",d.muted),p.set("ginger:playbackRate",d.playbackRate),p.set("ginger:repeatMode",d.repeatMode),p.set("ginger:currentIndex",d.currentIndex))},[p,d.volume,d.muted,d.playbackRate,d.repeatMode,d.currentIndex]),f.useEffect(()=>{if(!p||!P)return;const g=d.tracks[d.currentIndex];if(!g)return;const M=`ginger:resume:${K(g)}`,T=p.get(M);typeof T=="number"&&Number.isFinite(T)&&L(T)},[p,P,d.currentIndex,d.tracks,L]),f.useEffect(()=>{if(!p||!P)return;const g=d.tracks[d.currentIndex];if(!g||!(d.currentTime>=0))return;const M=`ginger:resume:${K(g)}`,T=setTimeout(()=>p.set(M,d.currentTime),250);return()=>clearTimeout(T)},[p,P,d.currentIndex,d.tracks,d.currentTime]);const Sr=(_e=d.tracks[d.currentIndex])==null?void 0:_e.fileUrl;f.useEffect(()=>{const g=D.current;if(!g)return;if(d.isPaused){g.pause();return}let M=!1;return(async()=>{if(v){let T=!1;try{T=await v()}catch(C){const ve=C instanceof Error?C.message:"beforePlay rejected";h({type:"MEDIA_ERROR",payload:{message:ve}});return}if(!T){M||(h({type:"PAUSE"}),I==null||I());return}}M||g.play().catch(T=>{const C=T instanceof Error?T.message:typeof T=="string"?T:"Playback failed (e.g. autoplay blocked or unavailable source)";h({type:"MEDIA_ERROR",payload:{message:C}})})})(),()=>{M=!0}},[v,Sr,I,d.isPaused]);const he=f.useCallback(()=>{const g=$r(Ce.current);if(g.kind==="replay_same"){const T=D.current;T&&(T.currentTime=0),h({type:"PLAY"});return}if(g.kind==="stop"){h({type:"PAUSE"}),J==null||J();return}const M=g.nextIndex;h({type:"SET_INDEX",payload:{index:M,autoPlay:!0}})},[J]),Ir=f.useMemo(()=>({play:_,pause:N,next:V,prev:$,seek:L}),[_,N,V,$,L]);cn(!!k,d,Ir);const Pr=x!=null&&x.seek&&/[\u0590-\u08FF]/.test(x.seek)?"rtl":"ltr",Ar=f.useMemo(()=>({state:d,dispatch:h,audioRef:D,notifyEnded:he,init:xe,play:_,pause:N,togglePlayPause:re,seek:L,setVolume:ne,setMuted:te,toggleMute:ae,setPlaybackRate:ie,next:V,prev:$,setRepeatMode:ue,cycleRepeat:se,toggleShuffle:oe,setQueue:le,insertTrackAt:ce,removeTrackAt:de,moveTrack:fe,enqueueNext:ge,playTrackAt:pe,selectTrackAt:me,setPlaylistMeta:ye,setPlaybackMode:be}),[se,h,xe,V,he,N,_,pe,ce,de,fe,ge,me,$,L,te,ie,le,ue,ye,be,ne,d,ae,re,oe]),Rr=f.useMemo(()=>({tracks:d.tracks,currentIndex:d.currentIndex,isPaused:d.isPaused,isShuffled:d.isShuffled,repeatMode:d.repeatMode,originalTracks:d.originalTracks,playlistMeta:d.playlistMeta,init:xe,play:_,pause:N,togglePlayPause:re,next:V,prev:$,setRepeatMode:ue,cycleRepeat:se,toggleShuffle:oe,playbackMode:d.playbackMode,setQueue:le,insertTrackAt:ce,removeTrackAt:de,moveTrack:fe,enqueueNext:ge,playTrackAt:pe,selectTrackAt:me,setPlaylistMeta:ye,setPlaybackMode:be,dispatch:h}),[d.tracks,d.currentIndex,d.isPaused,d.isShuffled,d.repeatMode,d.playbackMode,d.originalTracks,d.playlistMeta,xe,_,N,re,V,$,ue,se,oe,le,ce,de,fe,ge,pe,me,ye,be,h]),Gr=f.useMemo(()=>({currentTime:d.currentTime,duration:d.duration,bufferedFraction:d.bufferedFraction,isBuffering:d.isBuffering,errorMessage:d.errorMessage,volume:d.volume,muted:d.muted,playbackRate:d.playbackRate,seek:L,setVolume:ne,setMuted:te,toggleMute:ae,setPlaybackRate:ie,audioRef:D,notifyEnded:he,dispatch:h}),[d.currentTime,d.duration,d.bufferedFraction,d.isBuffering,d.errorMessage,d.volume,d.muted,d.playbackRate,L,ne,te,ae,ie,D,he,h]),Cr=Ie(d),jr=f.useMemo(()=>G?O:{...dn,...O},[O,G]);return c.jsx(wr,{locale:x,children:c.jsx(b.GingerPlaybackContext.Provider,{value:Rr,children:c.jsx(b.GingerMediaContext.Provider,{value:Gr,children:c.jsx(we.Provider,{value:Ar,children:c.jsx("div",{className:Me,style:jr,"data-ginger-playback":Cr,dir:Pr,children:e})})})})})}const gn={Provider:fn,Player:Nr,Current:{Title:Hr,Artist:Kr,Album:Xr,Description:qr,Copyright:zr,Genre:Wr,Label:Jr,Isrc:Zr,TrackNumber:en,Year:tr,Lyrics:ar,LyricsSynced:Ae,Chapters:Re,FileUrl:or,Artwork:lr,QueueIndex:cr,QueueLength:dr,QueuePosition:fr,Elapsed:gr,Duration:pr,Remaining:mr,Progress:yr,TimeRail:br,BufferRail:xr,PlaybackState:hr,ErrorMessage:vr},Queue:{Title:tn,Subtitle:an,Description:un,Copyright:sn,Artwork:Tr},Control:{PlayPause:Xe,Repeat:qe,Next:ze,Previous:We,Shuffle:Je,SeekBar:Ze,Volume:er,Mute:rr,PlaybackRate:nr},Playlist:nn};exports.Chapters=Re;exports.Ginger=gn;exports.LyricsSynced=Ae;exports.clampPlaybackRate=ke;exports.clampVolume=X;exports.computeNextIndex=Ve;exports.defaultGingerLocale=Q;exports.derivePlaybackUiState=Ie;exports.effectiveDuration=B;exports.effectiveRemaining=Be;exports.getCurrentTrack=j;exports.parseLrc=ir;exports.progressFraction=Pe;exports.resolvedAlbumLine=Ye;exports.resolvedArtwork=Oe;exports.useGingerChapters=sr;exports.useGingerLocale=A;exports.useGingerLyricsSync=ur;exports.usePlayPauseBinding=Ke;exports.useSeekBarBinding=Qe;exports.useVolumeSlider=He;
|
|
2
|
+
//# sourceMappingURL=ginger-yY4Y5liv.cjs.map
|