@lucaismyname/ginger 0.0.43 → 0.0.45

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"ginger-B2DgE-2a.js","sources":["../src/context/GingerContext.tsx","../src/audio/GingerPlayer.tsx","../src/context/GingerLocaleContext.tsx","../src/internal/formatTime.ts","../src/hooks/useControlBindings.ts","../src/components/icons/Wrapper.tsx","../src/components/icons/Pause.tsx","../src/components/icons/Play.tsx","../src/components/icons/RepeatGlyph.tsx","../src/components/icons/ShuffleIcon.tsx","../src/components/icons/SkipBack.tsx","../src/components/icons/SkipForward.tsx","../src/components/icons/Volume2.tsx","../src/components/icons/VolumeX.tsx","../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 data-ginger-component=\"Player\"\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 chaptersList: \"Chapters\",\n syncedLyricsList: \"Synced lyrics\",\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 { 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 type { ReactNode, SVGProps } from \"react\";\n\nexport function Wrapper(\n props: SVGProps<SVGSVGElement> & {\n className?: string;\n width?: number;\n height?: number;\n viewBox?: string;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n strokeLinecap?: string;\n strokeLinejoin?: string;\n children?: ReactNode;\n },\n) {\n const {\n className,\n width,\n height,\n viewBox,\n fill,\n stroke,\n strokeWidth,\n strokeLinecap,\n strokeLinejoin,\n children,\n ...rest\n } = props;\n return (\n <svg\n data-ginger-component=\"Wrapper\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width={width ?? 24}\n height={height ?? 24}\n viewBox={viewBox ?? \"0 0 24 24\"}\n fill=\"none\"\n stroke={stroke ?? \"currentColor\"}\n strokeWidth={strokeWidth ?? 2}\n strokeLinecap={strokeLinecap ?? \"round\"}\n strokeLinejoin={strokeLinejoin ?? \"round\"}\n className={className}\n aria-hidden\n role=\"presentation\"\n {...rest}\n >\n {children}\n </svg>\n );\n}\n","/** Path style aligned with Lucide `pause` (stroke). */\nimport { Wrapper } from \"./Wrapper\";\n\nexport function Pause() {\n return (\n <Wrapper>\n <path data-ginger-component=\"Pause\" d=\"M6 4h4v16H6zM14 4h4v16h-4z\" />\n </Wrapper>\n );\n}\n","/** Path style aligned with Lucide `play` (stroke). */\nimport { Wrapper } from \"./Wrapper\";\nexport function Play() {\n return (\n <Wrapper>\n <path data-ginger-component=\"Play\" d=\"M5 3L19 12 5 21 5 3z\" />\n </Wrapper>\n );\n}\n","/**\n * Path data from lucide-static (ISC, Lucide Icons). `off` uses the repeat glyph plus a strike line\n * (Lucide does not ship a dedicated repeat-off asset in lucide-static).\n */\nimport type { RepeatMode } from \"../../types\";\nimport { Wrapper } from \"./Wrapper\";\n\nfunction RepeatAllPaths() {\n return (\n <>\n <path d=\"m17 2 4 4-4 4\" />\n <path d=\"M3 11v-1a4 4 0 0 1 4-4h14\" />\n <path d=\"m7 22-4-4 4-4\" />\n <path d=\"M21 13v1a4 4 0 0 1-4 4H3\" />\n </>\n );\n}\n\nexport function RepeatGlyph({ mode }: { mode: RepeatMode }) {\n if (mode === \"one\") {\n return (\n <Wrapper>\n <RepeatAllPaths />\n <path data-ginger-component=\"RepeatGlyph\" d=\"M11 10h1v4\" />\n </Wrapper>\n );\n }\n if (mode === \"all\") {\n return (\n <Wrapper>\n <RepeatAllPaths />\n </Wrapper>\n );\n }\n return (\n <Wrapper>\n <RepeatAllPaths />\n <line data-ginger-component=\"RepeatGlyph\" x1=\"3\" x2=\"21\" y1=\"3\" y2=\"21\" />\n </Wrapper>\n );\n}\n","/** Path data from lucide-static (ISC, Lucide Icons). */\nimport { Wrapper } from \"./Wrapper\";\n\nexport function ShuffleIcon() {\n return (\n <Wrapper>\n <path d=\"m18 14 4 4-4 4\" />\n <path d=\"m18 2 4 4-4 4\" />\n <path\n data-ginger-component=\"ShuffleIcon\"\n d=\"M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22\"\n />\n <path d=\"M2 6h1.972a4 4 0 0 1 3.6 2.2\" />\n <path d=\"M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45\" />\n </Wrapper>\n );\n}\n","/** Path data from lucide-static (ISC, Lucide Icons). */\nimport { Wrapper } from \"./Wrapper\";\n\nexport function SkipBack() {\n return (\n <Wrapper>\n <path\n data-ginger-component=\"SkipBack\"\n d=\"M17.971 4.285A2 2 0 0 1 21 6v12a2 2 0 0 1-3.029 1.715l-9.997-5.998a2 2 0 0 1-.003-3.432z\"\n />\n <path d=\"M3 20V4\" />\n </Wrapper>\n );\n}\n","/** Path data from lucide-static (ISC, Lucide Icons). */\nimport { Wrapper } from \"./Wrapper\";\n\nexport function SkipForward() {\n return (\n <Wrapper>\n <path d=\"M21 4v16\" />\n <path\n data-ginger-component=\"SkipForward\"\n d=\"M6.029 4.285A2 2 0 0 0 3 6v12a2 2 0 0 0 3.029 1.715l9.997-5.998a2 2 0 0 0 .003-3.432z\"\n />\n </Wrapper>\n );\n}\n","/** Path data from lucide-static (ISC, Lucide Icons). */\nimport { Wrapper } from \"./Wrapper\";\n\nexport function Volume2() {\n return (\n <Wrapper>\n <path\n data-ginger-component=\"Volume2\"\n d=\"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\"\n />\n <path d=\"M16 9a5 5 0 0 1 0 6\" />\n <path d=\"M19.364 18.364a9 9 0 0 0 0-12.728\" />\n </Wrapper>\n );\n}\n","/** Path data from lucide-static (ISC, Lucide Icons). */\nimport { Wrapper } from \"./Wrapper\";\n\nexport function VolumeX() {\n return (\n <Wrapper>\n <path\n data-ginger-component=\"VolumeX\"\n d=\"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\"\n />\n <line x1=\"22\" x2=\"16\" y1=\"9\" y2=\"15\" />\n <line x1=\"16\" x2=\"22\" y1=\"9\" y2=\"15\" />\n </Wrapper>\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\";\nimport {\n Pause,\n Play,\n RepeatGlyph,\n ShuffleIcon,\n SkipBack,\n SkipForward,\n Volume2,\n VolumeX,\n} from \"../icons\";\n\nexport type PlayPauseProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /** When `children` is omitted, defaults are Lucide-style icons; string labels feed `playAriaLabel` / `pauseAriaLabel` fallbacks. */\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 data-ginger-component=\"PlayPause\"\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 ? <Play /> : <Pause />)}\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 data-ginger-component=\"Repeat\"\n {...rest}\n type={type}\n aria-label={ariaLabel ?? label}\n onClick={(e) => {\n cycleRepeat();\n onClick?.(e);\n }}\n >\n {children ?? <RepeatGlyph mode={repeatMode} />}\n </button>\n );\n}\n\nRepeat.displayName = \"Ginger.Control.Repeat\";\n\nexport type NextProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n};\nexport function Next({ type = \"button\", children, ariaLabel, onClick, ...rest }: NextProps) {\n const { next } = useGingerPlayback();\n const locale = useGingerLocale();\n return (\n <button\n data-ginger-component=\"Next\"\n {...rest}\n type={type}\n aria-label={ariaLabel ?? locale.nextTrack}\n onClick={(e) => {\n next();\n onClick?.(e);\n }}\n >\n {children ?? <SkipForward />}\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,\n ariaLabel,\n onClick,\n ...rest\n}: PreviousProps) {\n const { prev } = useGingerPlayback();\n const locale = useGingerLocale();\n return (\n <button\n data-ginger-component=\"Previous\"\n {...rest}\n type={type}\n aria-label={ariaLabel ?? locale.previousTrack}\n onClick={(e) => {\n prev();\n onClick?.(e);\n }}\n >\n {children ?? <SkipBack />}\n </button>\n );\n}\nPrevious.displayName = \"Ginger.Control.Previous\";\n\nexport type ShuffleProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n ariaLabel?: string;\n};\nexport function Shuffle({ type = \"button\", children, ariaLabel, onClick, ...rest }: ShuffleProps) {\n const { isShuffled, toggleShuffle } = useGingerPlayback();\n const locale = useGingerLocale();\n return (\n <button\n data-ginger-component=\"Shuffle\"\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 ?? <ShuffleIcon />}\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 data-ginger-component=\"SeekBar\"\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 data-ginger-component=\"Volume\"\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 return (\n <button\n data-ginger-component=\"Mute\"\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 ? (unmuteLabel ?? <VolumeX />) : (muteLabel ?? <Volume2 />))}\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 data-ginger-component=\"PlaybackRate\"\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 ??\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 data-ginger-component=\"Year\" 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 data-ginger-component=\"Year\" className={className} style={style}>\n {children(text, state)}\n </span>\n );\n return (\n <span data-ginger-component=\"Year\" 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 /** When true, skips default `whiteSpace: pre-wrap` when `preserveWhitespace` is true (use `className` / `style` instead). */\n unstyled?: boolean;\n};\n\nexport function Lyrics({\n className,\n style,\n fallback,\n empty,\n children,\n preserveWhitespace = true,\n unstyled = false,\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 data-ginger-component=\"Lyrics\" className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const whiteStyle: CSSProperties | undefined =\n !unstyled && preserveWhitespace ? { whiteSpace: \"pre-wrap\" } : 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 { useGingerLocale } from \"../../context/GingerLocaleContext\";\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 locale = useGingerLocale();\n const { lines, activeIndex } = useGingerLyricsSync();\n\n if (lines.length === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span data-ginger-component=\"LyricsSynced\" 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\n className={className}\n style={{ ...listStyle, ...style }}\n aria-label={locale.syncedLyricsList}\n >\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 { useGingerLocale } from \"../../context/GingerLocaleContext\";\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 locale = useGingerLocale();\n const { list, activeIndex, seekTo } = useGingerChapters();\n\n if (list.length === 0) {\n const node = empty ?? fallback ?? null;\n return node ? (\n <span data-ginger-component=\"Chapters\" 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={locale.chaptersList}>\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 ) : unstyled ? (\n <>\n {formatStart(chapter.startSeconds)} {chapter.title}\n </>\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 data-ginger-component=\"FileUrl\" 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 data-ginger-component=\"Artwork\"\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 data-ginger-component=\"QueueIndex\" 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 data-ginger-component=\"QueueIndex\" className={className} style={style}>\n {children(value, state)}\n </span>\n );\n return (\n <span data-ginger-component=\"QueueIndex\" 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 data-ginger-component=\"QueueLength\" className={className} style={style}>\n {children(value, state)}\n </span>\n );\n return (\n <span data-ginger-component=\"QueueLength\" 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 data-ginger-component=\"QueuePosition\" className={className} style={style}>\n {children({ index, length, label }, state)}\n </span>\n );\n return (\n <span data-ginger-component=\"QueuePosition\" 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 data-ginger-component=\"TimeText\" className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const text = format(valueSeconds);\n if (children)\n return (\n <span data-ginger-component=\"TimeText\" className={className} style={style}>\n {children(text, state)}\n </span>\n );\n return (\n <span data-ginger-component=\"TimeText\" 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 data-ginger-component=\"Progress\" className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n if (children)\n return (\n <span data-ginger-component=\"Progress\" className={className} style={style}>\n {children({ fraction, currentTime: state.currentTime, duration }, state)}\n </span>\n );\n return (\n <span data-ginger-component=\"Progress\" 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 data-ginger-component=\"TimeRail\"\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 data-ginger-component=\"TimeRail\"\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 data-ginger-component=\"TimeRail\"\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 data-ginger-component=\"BufferRail\"\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 data-ginger-component=\"BufferRail\"\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 data-ginger-component=\"PlaybackState\" className={className} style={style}>\n {children(value, state)}\n </span>\n );\n return (\n <span data-ginger-component=\"PlaybackState\" 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 data-ginger-component=\"ErrorMessage\" className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n if (children) {\n return (\n <span\n data-ginger-component=\"ErrorMessage\"\n className={className}\n style={style}\n aria-live={live}\n >\n {children(value, state)}\n </span>\n );\n }\n return (\n <span data-ginger-component=\"ErrorMessage\" 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 data-ginger-component=\"Playlist\" style={listStyle} {...rest}>\n {children}\n </ul>\n </GingerPlaylistConfigContext.Provider>\n );\n }\n\n return (\n <GingerPlaylistConfigContext.Provider value={{ playOnSelect }}>\n <ul data-ginger-component=\"Playlist\" 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 data-ginger-component=\"PlaylistTrack\">\n {track.title}\n {track.artist ? ` — ${track.artist}` : \"\"}\n </span>\n ) : null;\n\n return (\n <li {...liProps} data-ginger-component=\"PlaylistTrack\">\n <button\n type=\"button\"\n data-ginger-component=\"PlaylistTrackButton\"\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 data-ginger-component=\"Artwork\" className={className} style={style}>\n {node}\n </span>\n ) : null;\n }\n const alt = state.playlistMeta?.title ?? \"Playlist artwork\";\n return (\n <span\n data-ginger-component=\"Artwork\"\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 // Mirror insert into originalTracks so shuffle order is preserved\n const originalTracks =\n state.isShuffled && state.originalTracks\n ? insertTrackAt(state.originalTracks, action.payload.track, state.originalTracks.length)\n : state.originalTracks;\n return {\n ...state,\n tracks,\n originalTracks,\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 // Mirror removal in originalTracks by track identity so shuffle order is preserved\n const originalTracks =\n state.isShuffled && state.originalTracks\n ? (() => {\n const removedTrack = state.tracks[index];\n const origIdx = findIndexByTrackIdentity(state.originalTracks, removedTrack);\n return removeTrackAt(state.originalTracks, origIdx);\n })()\n : state.originalTracks;\n const nextIsShuffled = state.isShuffled && tracks.length > 1;\n return {\n ...state,\n tracks,\n isShuffled: nextIsShuffled,\n originalTracks: nextIsShuffled ? 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 // Mirror into originalTracks: insert after the current track's position in original order\n const originalTracks =\n state.isShuffled && state.originalTracks\n ? (() => {\n const currentTrack = state.tracks[state.currentIndex];\n const origCurrentIdx = findIndexByTrackIdentity(state.originalTracks, currentTrack);\n return addNextTrack(state.originalTracks, origCurrentIdx, action.payload.track);\n })()\n : state.originalTracks;\n return {\n ...state,\n tracks,\n originalTracks,\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, useRef } from \"react\";\nimport { resolveArtworkUrl } from \"../core/transitions\";\nimport type { GingerMediaSessionOptions, 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 options: GingerMediaSessionOptions = {},\n): void {\n const stateRef = useRef(state);\n stateRef.current = state;\n\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 const seekForwardSeconds = options.seekForwardSeconds;\n const seekBackwardSeconds = options.seekBackwardSeconds;\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\n if (typeof seekForwardSeconds === \"number\" && seekForwardSeconds > 0) {\n ms.setActionHandler(\"seekforward\", () => {\n const s = stateRef.current;\n const next = s.currentTime + seekForwardSeconds;\n const d = s.duration;\n const cap = Number.isFinite(d) && d > 0 ? d : next;\n actions.seek(Math.min(next, cap));\n });\n } else {\n ms.setActionHandler(\"seekforward\", null);\n }\n\n if (typeof seekBackwardSeconds === \"number\" && seekBackwardSeconds > 0) {\n ms.setActionHandler(\"seekbackward\", () => {\n const s = stateRef.current;\n actions.seek(Math.max(0, s.currentTime - seekBackwardSeconds));\n });\n } else {\n ms.setActionHandler(\"seekbackward\", null);\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 ms.setActionHandler(\"seekforward\", null);\n ms.setActionHandler(\"seekbackward\", null);\n } catch {\n // Ignore platforms that do not support clearing handlers.\n }\n };\n }, [enabled, actions, seekForwardSeconds, seekBackwardSeconds]);\n\n useEffect(() => {\n const ms = getMediaSession();\n if (!enabled || !ms || !options.positionState) return;\n const duration = state.duration;\n const position = state.currentTime;\n const rate = state.playbackRate;\n try {\n if (!Number.isFinite(duration) || duration <= 0) {\n ms.setPositionState?.();\n return;\n }\n ms.setPositionState?.({\n duration,\n playbackRate: Number.isFinite(rate) && rate > 0 ? rate : 1,\n position: Math.min(Math.max(0, position), duration),\n });\n } catch {\n // setPositionState is optional / flaky across browsers.\n }\n return () => {\n try {\n ms.setPositionState?.();\n } catch {\n // ignore\n }\n };\n }, [enabled, options.positionState, state.currentTime, state.duration, state.playbackRate]);\n}\n","import {\n type CSSProperties,\n Children,\n type ReactElement,\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} 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 asChild = false,\n className,\n style,\n dir: dirProp,\n prevRestartThresholdSeconds = 3,\n onTrackChange,\n onPlay,\n onPause,\n onQueueEnd,\n onError,\n onVolumeChange,\n onPlaybackRateChange,\n onSeek,\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 prevVolumeRef = useRef<number | undefined>(undefined);\n const prevMutedRef = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n if (prevVolumeRef.current === undefined || prevMutedRef.current === undefined) {\n prevVolumeRef.current = state.volume;\n prevMutedRef.current = state.muted;\n return;\n }\n if (prevVolumeRef.current !== state.volume || prevMutedRef.current !== state.muted) {\n onVolumeChange?.(state.volume, state.muted);\n }\n prevVolumeRef.current = state.volume;\n prevMutedRef.current = state.muted;\n }, [state.volume, state.muted, onVolumeChange]);\n\n const prevPlaybackRateRef = useRef<number | undefined>(undefined);\n useEffect(() => {\n if (prevPlaybackRateRef.current === undefined) {\n prevPlaybackRateRef.current = state.playbackRate;\n return;\n }\n if (prevPlaybackRateRef.current !== state.playbackRate) {\n onPlaybackRateChange?.(state.playbackRate);\n }\n prevPlaybackRateRef.current = state.playbackRate;\n }, [state.playbackRate, onPlaybackRateChange]);\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(\n (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 onSeek?.(Math.max(0, timeSeconds));\n },\n [onSeek],\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 const el = audioRef.current;\n const threshold = prevRestartThresholdSeconds ?? 3;\n if (el && threshold > 0 && el.currentTime > threshold) {\n el.currentTime = 0;\n onSeek?.(0);\n } else {\n dispatch({ type: \"PREV\" });\n }\n }, [prevRestartThresholdSeconds, onSeek]);\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 try {\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 } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[@lucaismyname/ginger] persistence.get() threw during hydration:\", e);\n }\n }\n }, [hydrateOnMount, persistence]);\n\n useEffect(() => {\n if (!persistence) return;\n try {\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 } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[@lucaismyname/ginger] persistence.set() threw:\", e);\n }\n }\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 try {\n const saved = persistence.get(key);\n if (typeof saved === \"number\" && Number.isFinite(saved)) {\n seek(saved);\n }\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[@lucaismyname/ginger] persistence.get() threw during resume:\", e);\n }\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(() => {\n try {\n persistence.set(key, state.currentTime);\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[@lucaismyname/ginger] persistence.set() threw during resume save:\", e);\n }\n }\n }, 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 // Guard against replay loops when a stale \"play\" state lands after queue-end.\n if (el.ended && computeEndedTransition(stateRef.current).kind === \"stop\") {\n dispatch({ type: \"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 audioRef.current?.pause();\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 const mediaSessionEnabled = typeof mediaSession === \"object\" ? true : Boolean(mediaSession);\n const mediaSessionBridgeOptions = useMemo(\n () => (typeof mediaSession === \"object\" ? mediaSession : {}),\n [mediaSession],\n );\n useMediaSessionBridge(mediaSessionEnabled, state, mediaSessionActions, mediaSessionBridgeOptions);\n\n const providerDir =\n dirProp ?? (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 const shellProps = useMemo(\n () => ({\n className,\n style: mergedStyle,\n \"data-ginger-playback\": playbackUi,\n dir: providerDir,\n }),\n [className, mergedStyle, playbackUi, providerDir],\n );\n\n const shell = useMemo(() => {\n if (!asChild) {\n return (\n <div\n className={shellProps.className}\n style={shellProps.style}\n data-ginger-playback={shellProps[\"data-ginger-playback\"]}\n dir={shellProps.dir}\n >\n {children}\n </div>\n );\n }\n const only = Children.only(children);\n if (!isValidElement(only)) {\n throw new Error(\"Ginger.Provider asChild expects a single React element child.\");\n }\n const child = only as ReactElement<{ className?: string; style?: CSSProperties }>;\n const childStyle = child.props.style;\n return cloneElement(child as ReactElement<Record<string, unknown>>, {\n className: mergeClassNames(child.props.className, shellProps.className),\n style:\n childStyle && typeof childStyle === \"object\"\n ? { ...childStyle, ...shellProps.style }\n : shellProps.style,\n \"data-ginger-playback\": shellProps[\"data-ginger-playback\"],\n dir: shellProps.dir,\n });\n }, [asChild, children, shellProps]);\n\n return (\n <GingerLocaleProvider locale={locale}>\n <GingerPlaybackContext.Provider value={playbackValue}>\n <GingerMediaContext.Provider value={mediaValue}>\n <GingerContext.Provider value={value}>{shell}</GingerContext.Provider>\n </GingerMediaContext.Provider>\n </GingerPlaybackContext.Provider>\n </GingerLocaleProvider>\n );\n}\n\nfunction mergeClassNames(a?: string, b?: string): string | undefined {\n const merged = [a, b].filter(Boolean).join(\" \");\n return merged === \"\" ? undefined : merged;\n}\n","import { GingerPlayer } from \"./audio/GingerPlayer\";\nimport * as Control from \"./components/controls/Controls\";\nimport * as Current from \"./components/current\";\nimport * as Icon from \"./components/icons\";\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 Icon: {\n Play: Icon.Play,\n Pause: Icon.Pause,\n SkipForward: Icon.SkipForward,\n SkipBack: Icon.SkipBack,\n Shuffle: Icon.ShuffleIcon,\n Volume2: Icon.Volume2,\n VolumeX: Icon.VolumeX,\n RepeatGlyph: Icon.RepeatGlyph,\n Wrapper: Icon.Wrapper,\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","useSeekBarBinding","pb","useGingerPlayback","md","useGingerMedia","useMemo","gingerStateFromContextValues","effectiveDuration","numericValue","ariaValueText","onSeekInput","useVolumeSlider","onVolumeInput","usePlayPauseBinding","options","playL","pauseL","Wrapper","props","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","rest","Pause","Play","RepeatAllPaths","jsxs","Fragment","RepeatGlyph","mode","ShuffleIcon","SkipBack","SkipForward","Volume2","VolumeX","PlayPause","playLabel","pauseLabel","playAriaLabel","pauseAriaLabel","type","onClick","defaultPlayAria","defaultPauseAria","b","Repeat","ariaLabel","repeatMode","cycleRepeat","label","Next","Previous","Shuffle","isShuffled","toggleShuffle","SeekBar","inputStyle","unstyled","mergedStyle","Volume","Mute","muteLabel","unmuteLabel","muted","toggleMute","defaultRates","PlaybackRate","rates","playbackRate","setPlaybackRate","a","r","createTextDisplay","displayName","select","Comp","useGingerState","fallback","empty","node","createTrackFieldDisplay","getCurrentTrack","Title","t","Artist","Album","resolvedAlbumLine","Description","Copyright","Genre","Label","Isrc","TrackNumber","Year","format","y","text","Lyrics","preserveWhitespace","raw","whiteStyle","lrcTag","parseLrc","lrc","lines","rawLine","matches","m","minutes","millis","time","useGingerLyricsSync","tracks","currentIndex","currentTime","currentTrack","line","activeIndex","i","LyricsSynced","activeClassName","lineClassName","index","active","useGingerChapters","seek","list","item","chapter","Chapters","formatStart","seekTo","FileUrl","visible","Artwork","sizes","loading","onError","decoding","imgStyle","track","src","resolvedArtwork","alt","QueueIndex","base","QueueLength","QueuePosition","separator","len","length","renderTime","valueSeconds","Elapsed","Duration","Remaining","effectiveRemaining","Progress","fraction","progressFraction","TimeRail","showBuffered","progressPct","bufPct","BufferRail","PlaybackState","derivePlaybackUiState","ErrorMessage","live","GingerPlaylistConfigContext","usePlaylistConfig","GingerPlaylist","rowStyle","renderTrack","playOnSelect","playTrackAt","selectTrackAt","listStyle","trackIdentity","GingerPlaylistTrack","liProps","buttonRest","defaultLabel","GingerPlaylistCompound","Subtitle","_b","clampVolume","v","clampPlaybackRate","resetTimingOnly","defaultMedia","createInitialState","params","clampIndex","originalTracks","ordered","shuffleWithAnchor","gingerReducer","action","playlistMeta","isPaused","playbackMode","volume","idx","insertIndex","insertTrackAt","removeTrackAt","removedTrack","origIdx","findIndexByTrackIdentity","nextIsShuffled","fromIndex","toIndex","moveTrack","addNextTrack","origCurrentIdx","ap","cycleRepeatMode","snapshot","shuffled","restored","current","newIndex","nextIndex","computeNextIndex","same","prevIndex","computePrevIndex","getMediaSession","useMediaSessionBridge","enabled","actions","stateRef","title","artist","album","artworkUrl","resolveArtworkUrl","ms","seekForwardSeconds","seekBackwardSeconds","details","d","cap","position","defaultProviderStyle","GingerProvider","initialTracks","initialIndex","initialPlaylistMeta","initialShuffle","initialRepeatMode","initialPlaybackMode","initialPaused","initialVolume","initialMuted","initialPlaybackRate","initialStateKey","mediaSession","beforePlay","onPlayBlocked","persistence","hydrateOnMount","resumeOnTrackChange","asChild","dirProp","prevRestartThresholdSeconds","onTrackChange","onPlay","onPause","onQueueEnd","onVolumeChange","onPlaybackRateChange","onSeek","useReducer","latestInitRef","prevInitialStateKeyRef","prevPausedRef","prevVolumeRef","prevMutedRef","prevPlaybackRateRef","play","useCallback","pause","togglePlayPause","timeSeconds","setVolume","setMuted","threshold","setRepeatMode","setQueue","autoPlay","enqueueNext","setPlaylistMeta","meta","setPlaybackMode","init","payload","p","key","saved","id","currentUrl","computeEndedTransition","cancelled","allowed","error","message","msg","transition","mediaSessionActions","mediaSessionEnabled","mediaSessionBridgeOptions","providerDir","playbackValue","mediaValue","playbackUi","shellProps","shell","only","Children","isValidElement","child","childStyle","cloneElement","mergeClassNames","GingerPlaybackContext","GingerMediaContext","merged","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","Icon.Play","Icon.Pause","Icon.SkipForward","Icon.SkipBack","Icon.ShuffleIcon","Icon.Volume2","Icon.VolumeX","Icon.RepeatGlyph","Icon.Wrapper"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";const o=require("react/jsx-runtime"),l=require("react"),k=require("./GingerSplitContexts-C7puo0M7.cjs"),S=require("./selectors-CEGlYoFu.cjs"),M=require("./transitions-Dx08t68T.cjs"),rr=l.createContext(null);function Qr(){const e=l.useContext(rr);if(!e)throw new Error("Ginger components must be used within <Ginger.Provider>");return e}function Ze(e){const{buffered:r,duration:n}=e;return!(n>0)||r.length===0?0:Math.min(1,r.end(r.length-1)/n)}function zr({className:e,style:r,preload:n="metadata",crossOrigin:i,respectReducedMotion:t=!1}){var T;const{audioRef:a,dispatch:s,state:c,notifyEnded:d}=Qr(),g=((T=c.tracks[c.currentIndex])==null?void 0:T.fileUrl)??"",y=l.useRef({currentTime:-1,duration:-1,bufferedFraction:-1}),x=l.useRef(""),[v,f]=l.useState(!1);l.useEffect(()=>{if(!t||typeof window>"u")return;const m=window.matchMedia("(prefers-reduced-motion: reduce)"),P=()=>f(m.matches);return P(),m.addEventListener("change",P),()=>m.removeEventListener("change",P)},[t]);const h=(m,P=!1)=>{const A={currentTime:m.currentTime,duration:m.duration,bufferedFraction:Ze(m)},G=y.current,X=v?.5:.25,K=Math.abs(A.currentTime-G.currentTime)>=X||Math.abs(A.duration-G.duration)>=.01||Math.abs(A.bufferedFraction-G.bufferedFraction)>=.01;!P&&!K||(y.current=A,s({type:"MEDIA_TIME_UPDATE",payload:A}))};return l.useEffect(()=>{const m=a.current;m&&(m.volume=c.volume,m.muted=c.muted)},[a,c.volume,c.muted]),l.useEffect(()=>{const m=a.current;if(m){if(!g){m.removeAttribute("src"),y.current={currentTime:-1,duration:-1,bufferedFraction:-1},x.current!==""&&s({type:"MEDIA_SOURCE_CLEARED"}),x.current="";return}m.getAttribute("src")!==g&&(m.src=g,m.load(),y.current={currentTime:-1,duration:-1,bufferedFraction:-1}),x.current=g}},[a,s,c.currentIndex,c.tracks,g]),l.useEffect(()=>{const m=a.current;m&&(m.playbackRate=c.playbackRate)},[a,c.playbackRate,g]),o.jsx("audio",{"data-ginger-component":"Player",ref:a,className:e,style:r,preload:n,crossOrigin:i,controls:!1,playsInline:!0,onTimeUpdate:m=>{h(m.currentTarget)},onLoadedMetadata:m=>{const P=m.currentTarget;y.current={currentTime:-1,duration:-1,bufferedFraction:-1},s({type:"MEDIA_LOADED_METADATA",payload:{duration:P.duration,bufferedFraction:Ze(P)}})},onSeeking:m=>h(m.currentTarget,!0),onSeeked:m=>h(m.currentTarget,!0),onEnded:()=>d(),onPlay:()=>s({type:"MEDIA_PLAY"}),onPause:()=>s({type:"MEDIA_PAUSE"}),onWaiting:()=>s({type:"MEDIA_WAITING"}),onCanPlay:()=>s({type:"MEDIA_CANPLAY"}),onProgress:m=>h(m.currentTarget,!0),onVolumeChange:m=>{const P=m.currentTarget;s({type:"MEDIA_VOLUME_SYNC",payload:{volume:P.volume,muted:P.muted}})},onError:()=>{var G;const m=a.current,P=(G=m==null?void 0:m.error)==null?void 0:G.code;s({type:"MEDIA_ERROR",payload:{message:P===1?"MEDIA_ERR_ABORTED":P===2?"MEDIA_ERR_NETWORK":P===3?"MEDIA_ERR_DECODE":P===4?"MEDIA_ERR_SRC_NOT_SUPPORTED":"MEDIA_ERR_UNKNOWN"}})}})}const Q={seek:"Seek",volume:"Volume",playbackSpeed:"Playback speed",chaptersList:"Chapters",syncedLyricsList:"Synced lyrics",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 Wr(e){return e?{...Q,...e,repeat:{...Q.repeat,...e.repeat}}:Q}const tr=l.createContext(Q);function Xr({locale:e,children:r}){const n=Wr(e);return o.jsx(tr.Provider,{value:n,children:r})}function j(){return l.useContext(tr)}function z(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 nr(){const e=k.useGingerPlayback(),r=k.useGingerMedia(),n=j(),i=l.useMemo(()=>k.gingerStateFromContextValues(e,r),[e,r]),t=S.effectiveDuration(i),a=t>0?i.currentTime:0,s=Number.isFinite(a)?a:0,c=t>0?`${z(s)} of ${z(t)}`:z(s),d=g=>{r.seek(Number(g.currentTarget.value))};return{state:i,value:s,min:0,max:t>0?t:1,step:"any",ariaValueText:c,ariaLabel:n.seek,onSeekInput:d,onSeekChange:d}}function ar(){const e=k.useGingerPlayback(),r=k.useGingerMedia(),n=j(),i=l.useMemo(()=>k.gingerStateFromContextValues(e,r),[e,r]),t=a=>{r.setVolume(Number(a.currentTarget.value))};return{state:i,value:i.volume,min:0,max:1,step:"any",ariaValueText:`${Math.round(i.volume*100)}%`,ariaLabel:n.volume,onVolumeInput:t,onVolumeChange:t}}function ir(e){const r=k.useGingerPlayback(),n=j(),i=(e==null?void 0:e.playAriaLabel)??n.play,t=(e==null?void 0:e.pauseAriaLabel)??n.pause;return{isPaused:r.isPaused,toggle:r.togglePlayPause,ariaLabel:r.isPaused?i:t}}function C(e){const{className:r,width:n,height:i,viewBox:t,fill:a,stroke:s,strokeWidth:c,strokeLinecap:d,strokeLinejoin:g,children:y,...x}=e;return o.jsx("svg",{"data-ginger-component":"Wrapper",xmlns:"http://www.w3.org/2000/svg",width:n??24,height:i??24,viewBox:t??"0 0 24 24",fill:"none",stroke:s??"currentColor",strokeWidth:c??2,strokeLinecap:d??"round",strokeLinejoin:g??"round",className:r,"aria-hidden":!0,role:"presentation",...x,children:y})}function Ne(){return o.jsx(C,{children:o.jsx("path",{"data-ginger-component":"Pause",d:"M6 4h4v16H6zM14 4h4v16h-4z"})})}function _e(){return o.jsx(C,{children:o.jsx("path",{"data-ginger-component":"Play",d:"M5 3L19 12 5 21 5 3z"})})}function we(){return o.jsxs(o.Fragment,{children:[o.jsx("path",{d:"m17 2 4 4-4 4"}),o.jsx("path",{d:"M3 11v-1a4 4 0 0 1 4-4h14"}),o.jsx("path",{d:"m7 22-4-4 4-4"}),o.jsx("path",{d:"M21 13v1a4 4 0 0 1-4 4H3"})]})}function De({mode:e}){return e==="one"?o.jsxs(C,{children:[o.jsx(we,{}),o.jsx("path",{"data-ginger-component":"RepeatGlyph",d:"M11 10h1v4"})]}):e==="all"?o.jsx(C,{children:o.jsx(we,{})}):o.jsxs(C,{children:[o.jsx(we,{}),o.jsx("line",{"data-ginger-component":"RepeatGlyph",x1:"3",x2:"21",y1:"3",y2:"21"})]})}function Fe(){return o.jsxs(C,{children:[o.jsx("path",{d:"m18 14 4 4-4 4"}),o.jsx("path",{d:"m18 2 4 4-4 4"}),o.jsx("path",{"data-ginger-component":"ShuffleIcon",d:"M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22"}),o.jsx("path",{d:"M2 6h1.972a4 4 0 0 1 3.6 2.2"}),o.jsx("path",{d:"M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45"})]})}function Ue(){return o.jsxs(C,{children:[o.jsx("path",{"data-ginger-component":"SkipBack",d:"M17.971 4.285A2 2 0 0 1 21 6v12a2 2 0 0 1-3.029 1.715l-9.997-5.998a2 2 0 0 1-.003-3.432z"}),o.jsx("path",{d:"M3 20V4"})]})}function Be(){return o.jsxs(C,{children:[o.jsx("path",{d:"M21 4v16"}),o.jsx("path",{"data-ginger-component":"SkipForward",d:"M6.029 4.285A2 2 0 0 0 3 6v12a2 2 0 0 0 3.029 1.715l9.997-5.998a2 2 0 0 0 .003-3.432z"})]})}function Ve(){return o.jsxs(C,{children:[o.jsx("path",{"data-ginger-component":"Volume2",d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z"}),o.jsx("path",{d:"M16 9a5 5 0 0 1 0 6"}),o.jsx("path",{d:"M19.364 18.364a9 9 0 0 0 0-12.728"})]})}function Oe(){return o.jsxs(C,{children:[o.jsx("path",{"data-ginger-component":"VolumeX",d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z"}),o.jsx("line",{x1:"22",x2:"16",y1:"9",y2:"15"}),o.jsx("line",{x1:"16",x2:"22",y1:"9",y2:"15"})]})}function or({playLabel:e="Play",pauseLabel:r="Pause",playAriaLabel:n,pauseAriaLabel:i,children:t,type:a="button",onClick:s,...c}){const d=j(),g=typeof e=="string"?e:d.play,y=typeof r=="string"?r:d.pause,x=ir({playAriaLabel:n??g,pauseAriaLabel:i??y});return o.jsx("button",{"data-ginger-component":"PlayPause",...c,type:a,"aria-label":x.ariaLabel,onClick:v=>{x.toggle(),s==null||s(v)},children:t??(x.isPaused?o.jsx(_e,{}):o.jsx(Ne,{}))})}or.displayName="Ginger.Control.PlayPause";function sr({type:e="button",ariaLabel:r,onClick:n,children:i,...t}){const{repeatMode:a,cycleRepeat:s}=k.useGingerPlayback(),d=j().repeat[a];return o.jsx("button",{"data-ginger-component":"Repeat",...t,type:e,"aria-label":r??d,onClick:g=>{s(),n==null||n(g)},children:i??o.jsx(De,{mode:a})})}sr.displayName="Ginger.Control.Repeat";function cr({type:e="button",children:r,ariaLabel:n,onClick:i,...t}){const{next:a}=k.useGingerPlayback(),s=j();return o.jsx("button",{"data-ginger-component":"Next",...t,type:e,"aria-label":n??s.nextTrack,onClick:c=>{a(),i==null||i(c)},children:r??o.jsx(Be,{})})}cr.displayName="Ginger.Control.Next";function ur({type:e="button",children:r,ariaLabel:n,onClick:i,...t}){const{prev:a}=k.useGingerPlayback(),s=j();return o.jsx("button",{"data-ginger-component":"Previous",...t,type:e,"aria-label":n??s.previousTrack,onClick:c=>{a(),i==null||i(c)},children:r??o.jsx(Ue,{})})}ur.displayName="Ginger.Control.Previous";function lr({type:e="button",children:r,ariaLabel:n,onClick:i,...t}){const{isShuffled:a,toggleShuffle:s}=k.useGingerPlayback(),c=j();return o.jsx("button",{"data-ginger-component":"Shuffle",...t,type:e,"aria-pressed":a,"aria-label":n??c.shuffle,onClick:d=>{s(),i==null||i(d)},children:r??o.jsx(Fe,{})})}lr.displayName="Ginger.Control.Shuffle";function dr({inputStyle:e,style:r,unstyled:n=!1,ariaLabel:i,...t}){const a=nr(),s=n?{...r,...e}:{width:"100%",...r,...e};return o.jsx("input",{"data-ginger-component":"SeekBar",...t,type:"range",min:a.min,max:a.max,step:a.step,value:a.value,"aria-label":i??a.ariaLabel,"aria-valuetext":a.ariaValueText,onInput:a.onSeekInput,onChange:a.onSeekChange,style:s})}dr.displayName="Ginger.Control.SeekBar";function gr({inputStyle:e,style:r,unstyled:n=!1,ariaLabel:i,...t}){const a=ar(),s=n?{...r,...e}:{width:"100%",...r,...e};return o.jsx("input",{"data-ginger-component":"Volume",...t,type:"range",min:a.min,max:a.max,step:a.step,value:a.value,"aria-label":i??a.ariaLabel,"aria-valuetext":a.ariaValueText,onInput:a.onVolumeInput,onChange:a.onVolumeChange,style:s})}gr.displayName="Ginger.Control.Volume";function pr({ariaLabel:e,muteLabel:r,unmuteLabel:n,type:i="button",onClick:t,children:a,...s}){const{muted:c,toggleMute:d}=k.useGingerMedia(),g=j();return o.jsx("button",{"data-ginger-component":"Mute",...s,type:i,"aria-pressed":c,"aria-label":e??(c?g.unmute:g.mute),onClick:y=>{d(),t==null||t(y)},children:a??(c?n??o.jsx(Oe,{}):r??o.jsx(Ve,{}))})}pr.displayName="Ginger.Control.Mute";const Kr=[.5,.75,1,1.25,1.5,2];function fr({rates:e=Kr,style:r,ariaLabel:n,children:i,...t}){const{playbackRate:a,setPlaybackRate:s}=k.useGingerMedia(),c=j(),d=l.useMemo(()=>Array.from(new Set([...e,a])).sort((g,y)=>g-y),[e,a]);return o.jsx("select",{"data-ginger-component":"PlaybackRate",...t,"aria-label":n??c.playbackSpeed,value:String(a),style:r,onChange:g=>s(Number(g.currentTarget.value)),children:i??d.map(g=>o.jsx("option",{value:String(g),children:g===1?c.playbackRateNormal:c.playbackRateTimes(g)},g))})}fr.displayName="Ginger.Control.PlaybackRate";function V(e,r){function n(i){const t=k.useGingerState(),s=(r(t)??"").trim(),{className:c,style:d,fallback:g,empty:y,children:x}=i;if(!s){const v=y??g??null;return v?o.jsx("span",{className:c,style:d,children:v}):null}return x?o.jsx("span",{className:c,style:d,children:x(s,t)}):o.jsx("span",{className:c,style:d,children:s})}return n.displayName=e,n}function O(e,r){return V(e,n=>r(S.getCurrentTrack(n)))}const qr=O("Ginger.Current.Title",e=>e==null?void 0:e.title),Jr=O("Ginger.Current.Artist",e=>e==null?void 0:e.artist),Zr=V("Ginger.Current.Album",e=>S.resolvedAlbumLine(e)),et=O("Ginger.Current.Description",e=>e==null?void 0:e.description),rt=V("Ginger.Current.Copyright",e=>{var n;const r=S.getCurrentTrack(e);return(r==null?void 0:r.copyright)??((n=e.playlistMeta)==null?void 0:n.copyright)}),tt=O("Ginger.Current.Genre",e=>e==null?void 0:e.genre),nt=O("Ginger.Current.Label",e=>e==null?void 0:e.label),at=O("Ginger.Current.Isrc",e=>e==null?void 0:e.isrc),it=O("Ginger.Current.TrackNumber",e=>(e==null?void 0:e.trackNumber)!=null?String(e.trackNumber):void 0);function mr({className:e,style:r,fallback:n,empty:i,children:t,format:a}){var g;const s=k.useGingerState(),c=(g=S.getCurrentTrack(s))==null?void 0:g.year;if(typeof c!="number"||!Number.isFinite(c)){const y=i??n??null;return y?o.jsx("span",{"data-ginger-component":"Year",className:e,style:r,children:y}):null}const d=a?a(c):String(c);return t?o.jsx("span",{"data-ginger-component":"Year",className:e,style:r,children:t(d,s)}):o.jsx("span",{"data-ginger-component":"Year",className:e,style:r,children:d})}mr.displayName="Ginger.Current.Year";function yr({className:e,style:r,fallback:n,empty:i,children:t,preserveWhitespace:a=!0,unstyled:s=!1}){var x;const c=k.useGingerState(),d=((x=S.getCurrentTrack(c))==null?void 0:x.lyrics)??"",g=a?d.replace(/^\s+|\s+$/g,""):d.trim();if(!g){const v=i??n??null;return v?o.jsx("span",{"data-ginger-component":"Lyrics",className:e,style:r,children:v}):null}const y=!s&&a?{whiteSpace:"pre-wrap"}:void 0;return t?o.jsx("span",{className:e,style:{...y,...r},children:t(g,c)}):o.jsx("span",{className:e,style:{...y,...r},children:g})}yr.displayName="Ginger.Current.Lyrics";const er=/\[(\d{1,2}):(\d{2})(?:\.(\d{1,3}))?\]/g;function xr(e){const r=[];for(const n of e.split(/\r?\n/)){const i=[...n.matchAll(er)];if(i.length===0)continue;const t=n.replace(er,"").trim();for(const a of i){const s=Number(a[1]??0),c=Number(a[2]??0),d=Number((a[3]??"0").padEnd(3,"0")),g=s*60+c+d/1e3;Number.isFinite(g)&&g>=0&&r.push({time:g,text:t})}}return r.sort((n,i)=>n.time-i.time)}function hr(){const{tracks:e,currentIndex:r}=k.useGingerPlayback(),{currentTime:n}=k.useGingerMedia(),i=e[r],t=l.useMemo(()=>i?Array.isArray(i.lyricsTimed)&&i.lyricsTimed.length>0?[...i.lyricsTimed].filter(s=>Number.isFinite(s.time)&&s.time>=0).sort((s,c)=>s.time-c.time):typeof i.lyrics=="string"?xr(i.lyrics):[]:[],[i]),a=l.useMemo(()=>{for(let s=t.length-1;s>=0;s-=1)if(n>=t[s].time)return s;return-1},[n,t]);return{lines:t,activeIndex:a,activeLine:a>=0?t[a]??null:null}}function $e({className:e,style:r,fallback:n,empty:i,unstyled:t=!1,activeClassName:a,lineClassName:s,children:c}){const d=k.useGingerState(),g=j(),{lines:y,activeIndex:x}=hr();if(y.length===0){const f=i??n??null;return f?o.jsx("span",{"data-ginger-component":"LyricsSynced",className:e,style:r,children:f}):null}const v=t?{}:{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 o.jsx("ul",{className:e,style:{...v,...r},"aria-label":g.syncedLyricsList,children:y.map((f,h)=>{const T=h===x;return o.jsx("li",{"aria-current":T?"true":void 0,"data-ginger-active":T||void 0,className:[s,T?a:void 0].filter(Boolean).join(" ")||void 0,style:t?void 0:{padding:"var(--ginger-playlist-row-padding, 4px 8px)",fontWeight:T?600:400,opacity:T?1:.75},children:c?c(f,h,T,d):f.text},`${f.time}-${h}`)})})}$e.displayName="Ginger.Current.LyricsSynced";function kr(){const{tracks:e,currentIndex:r}=k.useGingerPlayback(),{currentTime:n,seek:i}=k.useGingerMedia(),t=l.useMemo(()=>{var c;return[...((c=e[r])==null?void 0:c.chapters)??[]].filter(d=>d&&Number.isFinite(d.startSeconds)&&d.startSeconds>=0).sort((d,g)=>d.startSeconds-g.startSeconds)},[r,e]),a=l.useMemo(()=>{if(t.length===0)return-1;for(let s=t.length-1;s>=0;s-=1)if(n>=t[s].startSeconds)return s;return-1},[n,t]);return{list:t,activeIndex:a,active:a>=0?t[a]??null:null,seekTo:s=>{const c=t[s];c&&i(c.startSeconds)}}}function He({className:e,style:r,fallback:n,empty:i,unstyled:t=!1,formatStart:a=z,children:s}){const c=k.useGingerState(),d=j(),{list:g,activeIndex:y,seekTo:x}=kr();if(g.length===0){const f=i??n??null;return f?o.jsx("span",{"data-ginger-component":"Chapters",className:e,style:r,children:f}):null}const v=t?{}:{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 o.jsx("ul",{className:e,style:{...v,...r},"aria-label":d.chaptersList,children:g.map((f,h)=>{const T=h===y;return o.jsx("li",{children:o.jsx("button",{type:"button","aria-current":T?"true":void 0,"data-ginger-active":T||void 0,onClick:()=>x(h),style:{width:t?void 0:"100%",textAlign:t?void 0:"left",border:t?void 0:"none",background:t?void 0:T?"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))":"transparent",color:t?void 0:"inherit",font:t?void 0:"inherit",cursor:t?void 0:"pointer",padding:t?void 0:"var(--ginger-playlist-row-padding, 6px 8px)"},children:s?s(f,h,T,c):t?o.jsxs(o.Fragment,{children:[a(f.startSeconds)," ",f.title]}):o.jsxs("span",{children:[o.jsx("span",{style:{opacity:.75,marginRight:"0.35em"},children:a(f.startSeconds)}),f.title]})})},`${f.startSeconds}-${f.title}`)})})}He.displayName="Ginger.Current.Chapters";function br({visible:e=!1,className:r,style:n,fallback:i,empty:t,children:a}){var d;const s=k.useGingerState();if(!e)return null;const c=((d=S.getCurrentTrack(s))==null?void 0:d.fileUrl)??"";if(!c){const g=t??i??null;return g?o.jsx("span",{className:r,style:n,children:g}):null}return a?o.jsx("span",{"data-ginger-component":"FileUrl",className:r,style:n,children:a(c,s)}):o.jsx("span",{className:r,style:n,children:c})}br.displayName="Ginger.Current.FileUrl";function vr({className:e,style:r,fallback:n,empty:i,sizes:t,loading:a,onError:s,decoding:c,unstyled:d=!1,imgStyle:g}){const y=k.useGingerState(),x=S.getCurrentTrack(y),v=S.resolvedArtwork(y);if(!v){const h=i??n??null;return h?o.jsx("span",{className:e,style:r,children:h}):null}const f=[x==null?void 0:x.title,x==null?void 0:x.artist].filter(Boolean).join(" — ")||"Artwork";return o.jsx("div",{"data-ginger-component":"Artwork",className:e,style:d?{...r}:{background:"var(--ginger-artwork-bg, transparent)",borderRadius:"var(--ginger-artwork-radius, 0)",overflow:"hidden",...r},children:o.jsx("img",{src:v,alt:f,sizes:t,loading:a,decoding:c,onError:s,style:{display:d?void 0:"block",width:d?void 0:"100%",height:d?void 0:"100%",objectFit:d?void 0:"cover",...g}})})}vr.displayName="Ginger.Current.Artwork";function Tr({base:e=0,className:r,style:n,fallback:i,empty:t,children:a}){const s=k.useGingerState();if(s.tracks.length===0){const g=t??i??null;return g?o.jsx("span",{"data-ginger-component":"QueueIndex",className:r,style:n,children:g}):null}const d=String(s.currentIndex+e);return a?o.jsx("span",{"data-ginger-component":"QueueIndex",className:r,style:n,children:a(d,s)}):o.jsx("span",{"data-ginger-component":"QueueIndex",className:r,style:n,children:d})}Tr.displayName="Ginger.Current.QueueIndex";function Mr({className:e,style:r,fallback:n,empty:i,children:t}){const a=k.useGingerState(),s=String(a.tracks.length);if(a.tracks.length===0){const c=i??n??null;return c?o.jsx("span",{className:e,style:r,children:c}):null}return t?o.jsx("span",{"data-ginger-component":"QueueLength",className:e,style:r,children:t(s,a)}):o.jsx("span",{"data-ginger-component":"QueueLength",className:e,style:r,children:s})}Mr.displayName="Ginger.Current.QueueLength";function Er({base:e=0,separator:r=" / ",className:n,style:i,fallback:t,empty:a,children:s}){const c=k.useGingerState(),d=c.tracks.length;if(d===0){const v=a??t??null;return v?o.jsx("span",{className:n,style:i,children:v}):null}const g=String(c.currentIndex+e),y=String(d),x=`${g}${r}${y}`;return s?o.jsx("span",{"data-ginger-component":"QueuePosition",className:n,style:i,children:s({index:g,length:y,label:x},c)}):o.jsx("span",{"data-ginger-component":"QueuePosition",className:n,style:i,children:x})}Er.displayName="Ginger.Current.QueuePosition";function Ye(e,r,n){const{className:i,style:t,fallback:a,empty:s,children:c,format:d=z}=n;if(!(e>=0)||!Number.isFinite(e)){const y=s??a??null;return y?o.jsx("span",{"data-ginger-component":"TimeText",className:i,style:t,children:y}):null}const g=d(e);return c?o.jsx("span",{"data-ginger-component":"TimeText",className:i,style:t,children:c(g,r)}):o.jsx("span",{"data-ginger-component":"TimeText",className:i,style:t,children:g})}function Ir(e){const r=k.useGingerState();return Ye(r.currentTime,r,e)}Ir.displayName="Ginger.Current.Elapsed";function Pr(e){const r=k.useGingerState();return Ye(S.effectiveDuration(r),r,e)}Pr.displayName="Ginger.Current.Duration";function Sr(e){const r=k.useGingerState();return Ye(S.effectiveRemaining(r),r,e)}Sr.displayName="Ginger.Current.Remaining";function Ar({className:e,style:r,fallback:n,empty:i,children:t}){const a=k.useGingerState(),s=S.effectiveDuration(a),c=S.progressFraction(a);if(!(s>0)){const d=i??n??null;return d?o.jsx("span",{"data-ginger-component":"Progress",className:e,style:r,children:d}):null}return t?o.jsx("span",{"data-ginger-component":"Progress",className:e,style:r,children:t({fraction:c,currentTime:a.currentTime,duration:s},a)}):o.jsx("span",{"data-ginger-component":"Progress",className:e,style:r,children:`${Math.round(c*100)}%`})}Ar.displayName="Ginger.Current.Progress";function Rr({className:e,style:r,height:n=4,showBuffered:i=!1,unstyled:t=!1}){const a=k.useGingerState(),s=`${Math.round(S.progressFraction(a)*100)}%`,c=`${Math.round(Math.min(1,Math.max(0,a.bufferedFraction))*100)}%`;return o.jsxs("div",{"data-ginger-component":"TimeRail",className:e,style:t?{...r}:{width:"100%",height:n,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",position:"relative",...r},"aria-hidden":!0,children:[i?o.jsx("div",{"data-ginger-component":"TimeRail",style:{position:t?void 0:"absolute",left:t?void 0:0,top:t?void 0:0,height:t?void 0:"100%",width:c,background:t?void 0:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}}):null,o.jsx("div",{"data-ginger-component":"TimeRail",style:{position:t?void 0:"relative",width:s,height:t?void 0:"100%",background:t?void 0:"var(--ginger-primary-color, #111827)"}})]})}Rr.displayName="Ginger.Current.TimeRail";function jr({className:e,style:r,height:n=4,unstyled:i=!1}){const t=k.useGingerState(),a=`${Math.round(Math.min(1,Math.max(0,t.bufferedFraction))*100)}%`;return o.jsx("div",{"data-ginger-component":"BufferRail",className:e,style:i?{...r}:{width:"100%",height:n,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",...r},"aria-hidden":!0,children:o.jsx("div",{"data-ginger-component":"BufferRail",style:{width:a,height:i?void 0:"100%",background:i?void 0:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}})})}jr.displayName="Ginger.Current.BufferRail";function Gr({className:e,style:r,fallback:n,empty:i,children:t}){const a=k.useGingerState(),s=S.derivePlaybackUiState(a);return t?o.jsx("span",{"data-ginger-component":"PlaybackState",className:e,style:r,children:t(s,a)}):o.jsx("span",{"data-ginger-component":"PlaybackState",className:e,style:r,children:s})}Gr.displayName="Ginger.Current.PlaybackState";function Cr({className:e,style:r,fallback:n,empty:i,live:t="polite",children:a}){const s=k.useGingerState(),c=s.errorMessage??"";if(!c){const d=i??n??null;return d?o.jsx("span",{"data-ginger-component":"ErrorMessage",className:e,style:r,children:d}):null}return a?o.jsx("span",{"data-ginger-component":"ErrorMessage",className:e,style:r,"aria-live":t,children:a(c,s)}):o.jsx("span",{"data-ginger-component":"ErrorMessage",className:e,style:r,"aria-live":t,children:c})}Cr.displayName="Ginger.Current.ErrorMessage";const Le=l.createContext(null);function ot(){const e=l.useContext(Le);if(!e)throw new Error("Ginger.Playlist.Track must be used inside <Ginger.Playlist>");return e}function wr({children:e,unstyled:r=!1,rowStyle:n,renderTrack:i,playOnSelect:t=!0,style:a,...s}){const{tracks:c,currentIndex:d,playTrackAt:g,selectTrackAt:y}=k.useGingerPlayback(),x=r?{...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)",...a};return e!==void 0?o.jsx(Le.Provider,{value:{playOnSelect:t},children:o.jsx("ul",{"data-ginger-component":"Playlist",style:x,...s,children:e})}):o.jsx(Le.Provider,{value:{playOnSelect:t},children:o.jsx("ul",{"data-ginger-component":"Playlist",style:x,...s,children:c.map((f,h)=>{const T=h===d;return o.jsx("li",{children:o.jsx("button",{type:"button",onClick:()=>{t?g(h):y(h)},style:{width:r?void 0:"100%",textAlign:r?void 0:"left",border:r?void 0:"none",background:r?void 0:T?"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:i?i(f,h,T):o.jsxs("span",{children:[f.title,f.artist?` — ${f.artist}`:""]})})},`${h}-${M.trackIdentity(f)}`)})})})}wr.displayName="Ginger.Playlist";function Lr({index:e,unstyled:r=!1,className:n,style:i,children:t,liProps:a,onClick:s,...c}){const{playOnSelect:d}=ot(),{tracks:g,currentIndex:y,playTrackAt:x,selectTrackAt:v}=k.useGingerPlayback(),f=e===y,h=g[e],T=h!=null?o.jsxs("span",{"data-ginger-component":"PlaylistTrack",children:[h.title,h.artist?` — ${h.artist}`:""]}):null;return o.jsx("li",{...a,"data-ginger-component":"PlaylistTrack",children:o.jsx("button",{type:"button","data-ginger-component":"PlaylistTrackButton","aria-current":f?"true":void 0,"data-ginger-active":f||void 0,className:n,style:{width:r?void 0:"100%",textAlign:r?void 0:"left",border:r?void 0:"none",background:r?void 0:f?"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)",...i},...c,onClick:m=>{s==null||s(m),!m.defaultPrevented&&(d?x(e):v(e))},children:t??T})})}Lr.displayName="Ginger.Playlist.Track";const st=Object.assign(wr,{Track:Lr}),ct=V("Ginger.Queue.Title",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.title}),ut=V("Ginger.Queue.Subtitle",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.subtitle}),lt=V("Ginger.Queue.Description",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.description}),dt=V("Ginger.Queue.Copyright",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.copyright});function Nr({className:e,style:r,fallback:n,empty:i,unstyled:t=!1,imgStyle:a}){var g,y;const s=k.useGingerState(),c=(g=s.playlistMeta)==null?void 0:g.artworkUrl;if(!c){const x=i??n??null;return x?o.jsx("span",{"data-ginger-component":"Artwork",className:e,style:r,children:x}):null}const d=((y=s.playlistMeta)==null?void 0:y.title)??"Playlist artwork";return o.jsx("span",{"data-ginger-component":"Artwork",className:e,style:t?{...r}:{display:"inline-block",background:"var(--ginger-artwork-bg, #f3f4f6)",borderRadius:"var(--ginger-artwork-radius, 6px)",overflow:"hidden",...r},children:o.jsx("img",{src:c,alt:d,style:{display:t?void 0:"block",width:t?void 0:"100%",height:t?void 0:"100%",objectFit:t?void 0:"cover",...a}})})}Nr.displayName="Ginger.Queue.Artwork";function W(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):1}function Re(e){return Number.isFinite(e)?Math.min(4,Math.max(.25,e)):1}const B={currentTime:0,duration:0,bufferedFraction:0,isBuffering:!1,errorMessage:null},gt={...B,volume:1,muted:!1,playbackRate:1};function Qe(e){const r=[...e.tracks];let n=M.clampIndex(e.currentIndex??0,r.length),i=null,t=r;return e.isShuffled&&r.length>1&&(i=[...r],t=M.shuffleWithAnchor(r,n),n=0),{tracks:t,currentIndex:n,playbackMode:e.playbackMode??"playlist",isPaused:e.isPaused??!0,isShuffled:!!(e.isShuffled&&t.length>1),repeatMode:e.repeatMode??"off",originalTracks:i,playlistMeta:e.playlistMeta??null,...gt,volume:W(e.volume??1),muted:e.muted??!1,playbackRate:Re(e.playbackRate??1)}}function _r(e,r){switch(r.type){case"INIT":{const{tracks:n,currentIndex:i,playlistMeta:t,isPaused:a,isShuffled:s,repeatMode:c,playbackMode:d,volume:g,muted:y,playbackRate:x}=r.payload;return Qe({tracks:n,currentIndex:i,playlistMeta:t??null,isPaused:a??!0,isShuffled:s??!1,repeatMode:c??"off",playbackMode:d??"playlist",volume:g,muted:y,playbackRate:x})}case"SET_QUEUE":{const{tracks:n,currentIndex:i}=r.payload,t=[...n],a=M.clampIndex(i??e.currentIndex,t.length);return{...e,tracks:t,currentIndex:a,isShuffled:!1,originalTracks:null,...B}}case"INSERT_TRACK":{const n=r.payload.index??e.tracks.length,i=M.insertTrackAt(e.tracks,r.payload.track,n);if(r.payload.autoPlay){const s=M.clampIndex(n,i.length);return{...e,tracks:i,currentIndex:s,isShuffled:!1,originalTracks:null,isPaused:!1,...B}}const t=n<=e.currentIndex?e.currentIndex+1:e.currentIndex,a=e.isShuffled&&e.originalTracks?M.insertTrackAt(e.originalTracks,r.payload.track,e.originalTracks.length):e.originalTracks;return{...e,tracks:i,originalTracks:a,currentIndex:M.clampIndex(t,i.length)}}case"REMOVE_TRACK":{const n=r.payload.index,i=M.removeTrackAt(e.tracks,n),t=n<e.currentIndex?e.currentIndex-1:n===e.currentIndex?Math.min(e.currentIndex,Math.max(0,i.length-1)):e.currentIndex,a=e.isShuffled&&e.originalTracks?(()=>{const c=e.tracks[n],d=M.findIndexByTrackIdentity(e.originalTracks,c);return M.removeTrackAt(e.originalTracks,d)})():e.originalTracks,s=e.isShuffled&&i.length>1;return{...e,tracks:i,isShuffled:s,originalTracks:s?a:null,currentIndex:M.clampIndex(t,i.length),...n===e.currentIndex?B:{}}}case"MOVE_TRACK":{const{fromIndex:n,toIndex:i}=r.payload,t=M.moveTrack(e.tracks,n,i);let a=e.currentIndex;return e.currentIndex===n?a=i:n<e.currentIndex&&i>=e.currentIndex?a-=1:n>e.currentIndex&&i<=e.currentIndex&&(a+=1),{...e,tracks:t,isShuffled:!1,originalTracks:null,currentIndex:M.clampIndex(a,t.length)}}case"ADD_NEXT":{const n=M.addNextTrack(e.tracks,e.currentIndex,r.payload.track),i=e.isShuffled&&e.originalTracks?(()=>{const t=e.tracks[e.currentIndex],a=M.findIndexByTrackIdentity(e.originalTracks,t);return M.addNextTrack(e.originalTracks,a,r.payload.track)})():e.originalTracks;return{...e,tracks:n,originalTracks:i}}case"SET_INDEX":{const n=M.clampIndex(r.payload.index,e.tracks.length),i=r.payload.autoPlay,t=i===!0?!1:i===!1?!0:e.isPaused;return{...e,currentIndex:n,...B,isPaused:t}}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:M.cycleRepeatMode(e.repeatMode)};case"TOGGLE_SHUFFLE":{if(e.tracks.length<=1)return{...e,isShuffled:!1,originalTracks:null};if(!e.isShuffled){const a=[...e.tracks],s=M.shuffleWithAnchor(a,e.currentIndex);return{...e,isShuffled:!0,originalTracks:a,tracks:s,currentIndex:0}}const n=e.originalTracks?[...e.originalTracks]:[...e.tracks],i=e.tracks[e.currentIndex],t=M.findIndexByTrackIdentity(n,i);return{...e,isShuffled:!1,originalTracks:null,tracks:n,currentIndex:M.clampIndex(t,n.length)}}case"NEXT":{const n=M.computeNextIndex(e),i=n===e.currentIndex;return{...e,currentIndex:n,...i?{}:B,isPaused:i?e.isPaused:!1}}case"PREV":{const n=M.computePrevIndex(e),i=n===e.currentIndex;return{...e,currentIndex:n,...i?{}:B,isPaused:i?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,...B};case"SET_VOLUME":return{...e,volume:W(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:Re(r.payload)};case"MEDIA_VOLUME_SYNC":{const{volume:n,muted:i}=r.payload,t=W(n);return t===e.volume&&i===e.muted?e:{...e,volume:t,muted:i}}default:return e}}function Ae(){return typeof navigator>"u"||!("mediaSession"in navigator)?null:navigator.mediaSession}function pt(e,r,n,i={}){var v;const t=l.useRef(r);t.current=r;const a=r.tracks[r.currentIndex],s=a==null?void 0:a.title,c=a==null?void 0:a.artist,d=a==null?void 0:a.album,g=M.resolveArtworkUrl(a,(v=r.playlistMeta)==null?void 0:v.artworkUrl);l.useEffect(()=>{const f=Ae();!e||!f||(f.metadata=new MediaMetadata({title:s??"Unknown track",artist:c,album:d,artwork:g?[{src:g}]:void 0}))},[e,s,c,d,g]),l.useEffect(()=>{const f=Ae();!e||!f||(f.playbackState=r.isPaused?"paused":"playing")},[e,r.isPaused]);const y=i.seekForwardSeconds,x=i.seekBackwardSeconds;l.useEffect(()=>{const f=Ae();if(!(!e||!f)){try{f.setActionHandler("play",n.play),f.setActionHandler("pause",n.pause),f.setActionHandler("nexttrack",n.next),f.setActionHandler("previoustrack",n.prev),f.setActionHandler("seekto",h=>{typeof h.seekTime=="number"&&Number.isFinite(h.seekTime)&&n.seek(h.seekTime)}),typeof y=="number"&&y>0?f.setActionHandler("seekforward",()=>{const h=t.current,T=h.currentTime+y,m=h.duration,P=Number.isFinite(m)&&m>0?m:T;n.seek(Math.min(T,P))}):f.setActionHandler("seekforward",null),typeof x=="number"&&x>0?f.setActionHandler("seekbackward",()=>{const h=t.current;n.seek(Math.max(0,h.currentTime-x))}):f.setActionHandler("seekbackward",null)}catch{}return()=>{try{f.setActionHandler("play",null),f.setActionHandler("pause",null),f.setActionHandler("nexttrack",null),f.setActionHandler("previoustrack",null),f.setActionHandler("seekto",null),f.setActionHandler("seekforward",null),f.setActionHandler("seekbackward",null)}catch{}}}},[e,n,y,x]),l.useEffect(()=>{var P,A;const f=Ae();if(!e||!f||!i.positionState)return;const h=r.duration,T=r.currentTime,m=r.playbackRate;try{if(!Number.isFinite(h)||h<=0){(P=f.setPositionState)==null||P.call(f);return}(A=f.setPositionState)==null||A.call(f,{duration:h,playbackRate:Number.isFinite(m)&&m>0?m:1,position:Math.min(Math.max(0,T),h)})}catch{}return()=>{var G;try{(G=f.setPositionState)==null||G.call(f)}catch{}}},[e,i.positionState,r.currentTime,r.duration,r.playbackRate])}const ft={"--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 mt({children:e,initialTracks:r=[],initialIndex:n=0,initialPlaylistMeta:i=null,initialShuffle:t=!1,initialRepeatMode:a="off",initialPlaybackMode:s="playlist",initialPaused:c=!0,initialVolume:d=1,initialMuted:g=!1,initialPlaybackRate:y=1,initialStateKey:x,locale:v,mediaSession:f=!1,beforePlay:h,onPlayBlocked:T,persistence:m,hydrateOnMount:P=!1,resumeOnTrackChange:A=!1,unstyled:G=!1,asChild:X=!1,className:K,style:je,dir:Dr,prevRestartThresholdSeconds:ze=3,onTrackChange:q,onPlay:J,onPause:Z,onQueueEnd:ee,onError:re,onVolumeChange:te,onPlaybackRateChange:ne,onSeek:_}){var Je;const N=l.useRef(null),[u,b]=l.useReducer(_r,void 0,()=>Qe({tracks:r,currentIndex:n,playlistMeta:i,isPaused:c,isShuffled:t,repeatMode:a,playbackMode:s,volume:d,muted:g,playbackRate:y})),Ge=l.useRef(u),Ce=l.useRef({tracks:r,currentIndex:n,playlistMeta:i,isPaused:c,isShuffled:t,repeatMode:a,playbackMode:s,volume:d,muted:g,playbackRate:y});Ce.current={tracks:r,currentIndex:n,playlistMeta:i,isPaused:c,isShuffled:t,repeatMode:a,playbackMode:s,volume:d,muted:g,playbackRate:y};const Y=l.useRef(void 0);l.useEffect(()=>{if(x===void 0){Y.current=void 0;return}if(Y.current===void 0){Y.current=x;return}if(Y.current===x)return;Y.current=x;const p=Ce.current;b({type:"INIT",payload:{tracks:p.tracks,currentIndex:p.currentIndex,playlistMeta:p.playlistMeta,isPaused:p.isPaused,isShuffled:p.isShuffled,repeatMode:p.repeatMode,playbackMode:p.playbackMode,volume:p.volume,muted:p.muted,playbackRate:p.playbackRate}})},[x,b]),l.useEffect(()=>{Ge.current=u},[u]);const We=u.tracks[u.currentIndex]??null;l.useEffect(()=>{q==null||q(We,u.currentIndex)},[We,u.currentIndex,q]),l.useEffect(()=>{u.errorMessage&&(re==null||re(u.errorMessage))},[u.errorMessage,re]);const ae=l.useRef(void 0);l.useEffect(()=>{if(ae.current===void 0){ae.current=u.isPaused;return}ae.current!==u.isPaused&&(u.isPaused?Z==null||Z():J==null||J()),ae.current=u.isPaused},[u.isPaused,Z,J]);const ie=l.useRef(void 0),oe=l.useRef(void 0);l.useEffect(()=>{if(ie.current===void 0||oe.current===void 0){ie.current=u.volume,oe.current=u.muted;return}(ie.current!==u.volume||oe.current!==u.muted)&&(te==null||te(u.volume,u.muted)),ie.current=u.volume,oe.current=u.muted},[u.volume,u.muted,te]);const se=l.useRef(void 0);l.useEffect(()=>{if(se.current===void 0){se.current=u.playbackRate;return}se.current!==u.playbackRate&&(ne==null||ne(u.playbackRate)),se.current=u.playbackRate},[u.playbackRate,ne]);const D=l.useCallback(()=>{b({type:"PLAY"})},[]),F=l.useCallback(()=>{var p;b({type:"PAUSE"}),(p=N.current)==null||p.pause()},[]),ce=l.useCallback(()=>{u.isPaused?D():F()},[F,D,u.isPaused]),U=l.useCallback(p=>{const E=N.current;E&&Number.isFinite(p)&&(E.currentTime=Math.max(0,p),_==null||_(Math.max(0,p)))},[_]),ue=l.useCallback(p=>{b({type:"SET_VOLUME",payload:W(p)})},[]),le=l.useCallback(p=>{b({type:"SET_MUTED",payload:p})},[]),de=l.useCallback(()=>{b({type:"TOGGLE_MUTE"})},[]),ge=l.useCallback(p=>{b({type:"SET_PLAYBACK_RATE",payload:Re(p)})},[]),$=l.useCallback(()=>{b({type:"NEXT"})},[]),H=l.useCallback(()=>{const p=N.current,E=ze??3;p&&E>0&&p.currentTime>E?(p.currentTime=0,_==null||_(0)):b({type:"PREV"})},[ze,_]),pe=l.useCallback(p=>{b({type:"SET_REPEAT",payload:p})},[]),fe=l.useCallback(()=>{b({type:"CYCLE_REPEAT"})},[]),me=l.useCallback(()=>{b({type:"TOGGLE_SHUFFLE"})},[]),ye=l.useCallback((p,E)=>{b({type:"SET_QUEUE",payload:{tracks:p,currentIndex:E}})},[]),xe=l.useCallback((p,E,I)=>{b({type:"INSERT_TRACK",payload:{track:p,index:E,autoPlay:I}})},[]),he=l.useCallback(p=>{b({type:"REMOVE_TRACK",payload:{index:p}})},[]),ke=l.useCallback((p,E)=>{b({type:"MOVE_TRACK",payload:{fromIndex:p,toIndex:E}})},[]),be=l.useCallback(p=>{b({type:"ADD_NEXT",payload:{track:p}})},[]),ve=l.useCallback(p=>{b({type:"SET_INDEX",payload:{index:p,autoPlay:!0}})},[]),Te=l.useCallback(p=>{b({type:"SET_INDEX",payload:{index:p,autoPlay:!1}})},[]),Me=l.useCallback(p=>{b({type:"SET_PLAYLIST_META",payload:p})},[]),Ee=l.useCallback(p=>{b({type:"SET_PLAYBACK_MODE",payload:p})},[]),Ie=l.useCallback(p=>{b({type:"INIT",payload:p})},[]);l.useEffect(()=>{if(!(!m||!P))try{const p=m.get("ginger:volume"),E=m.get("ginger:muted"),I=m.get("ginger:playbackRate"),R=m.get("ginger:repeatMode"),Se=m.get("ginger:currentIndex"),L=Ce.current;b({type:"INIT",payload:{tracks:L.tracks,playlistMeta:L.playlistMeta,isPaused:L.isPaused,isShuffled:L.isShuffled,playbackMode:L.playbackMode,currentIndex:typeof Se=="number"?Se:L.currentIndex,repeatMode:R==="off"||R==="all"||R==="one"?R:L.repeatMode,volume:typeof p=="number"?p:L.volume,muted:typeof E=="boolean"?E:L.muted,playbackRate:typeof I=="number"?I:L.playbackRate}})}catch(p){process.env.NODE_ENV!=="production"&&console.warn("[@lucaismyname/ginger] persistence.get() threw during hydration:",p)}},[P,m]),l.useEffect(()=>{if(m)try{m.set("ginger:volume",u.volume),m.set("ginger:muted",u.muted),m.set("ginger:playbackRate",u.playbackRate),m.set("ginger:repeatMode",u.repeatMode),m.set("ginger:currentIndex",u.currentIndex)}catch(p){process.env.NODE_ENV!=="production"&&console.warn("[@lucaismyname/ginger] persistence.set() threw:",p)}},[m,u.volume,u.muted,u.playbackRate,u.repeatMode,u.currentIndex]),l.useEffect(()=>{if(!m||!A)return;const p=u.tracks[u.currentIndex];if(!p)return;const E=`ginger:resume:${M.trackIdentity(p)}`;try{const I=m.get(E);typeof I=="number"&&Number.isFinite(I)&&U(I)}catch(I){process.env.NODE_ENV!=="production"&&console.warn("[@lucaismyname/ginger] persistence.get() threw during resume:",I)}},[m,A,u.currentIndex,u.tracks,U]),l.useEffect(()=>{if(!m||!A)return;const p=u.tracks[u.currentIndex];if(!p||!(u.currentTime>=0))return;const E=`ginger:resume:${M.trackIdentity(p)}`,I=setTimeout(()=>{try{m.set(E,u.currentTime)}catch(R){process.env.NODE_ENV!=="production"&&console.warn("[@lucaismyname/ginger] persistence.set() threw during resume save:",R)}},250);return()=>clearTimeout(I)},[m,A,u.currentIndex,u.tracks,u.currentTime]);const Fr=(Je=u.tracks[u.currentIndex])==null?void 0:Je.fileUrl;l.useEffect(()=>{const p=N.current;if(!p)return;if(u.isPaused){p.pause();return}if(p.ended&&M.computeEndedTransition(Ge.current).kind==="stop"){b({type:"PAUSE"});return}let E=!1;return(async()=>{if(h){let I=!1;try{I=await h()}catch(R){const Se=R instanceof Error?R.message:"beforePlay rejected";b({type:"MEDIA_ERROR",payload:{message:Se}});return}if(!I){E||(b({type:"PAUSE"}),T==null||T());return}}E||p.play().catch(I=>{const R=I instanceof Error?I.message:typeof I=="string"?I:"Playback failed (e.g. autoplay blocked or unavailable source)";b({type:"MEDIA_ERROR",payload:{message:R}})})})(),()=>{E=!0}},[h,Fr,T,u.isPaused]);const Pe=l.useCallback(()=>{var I;const p=M.computeEndedTransition(Ge.current);if(p.kind==="replay_same"){const R=N.current;R&&(R.currentTime=0),b({type:"PLAY"});return}if(p.kind==="stop"){(I=N.current)==null||I.pause(),b({type:"PAUSE"}),ee==null||ee();return}const E=p.nextIndex;b({type:"SET_INDEX",payload:{index:E,autoPlay:!0}})},[ee]),Ur=l.useMemo(()=>({play:D,pause:F,next:$,prev:H,seek:U}),[D,F,$,H,U]),Br=typeof f=="object"?!0:!!f,Vr=l.useMemo(()=>typeof f=="object"?f:{},[f]);pt(Br,u,Ur,Vr);const Xe=Dr??(v!=null&&v.seek&&/[\u0590-\u08FF]/.test(v.seek)?"rtl":"ltr"),Or=l.useMemo(()=>({state:u,dispatch:b,audioRef:N,notifyEnded:Pe,init:Ie,play:D,pause:F,togglePlayPause:ce,seek:U,setVolume:ue,setMuted:le,toggleMute:de,setPlaybackRate:ge,next:$,prev:H,setRepeatMode:pe,cycleRepeat:fe,toggleShuffle:me,setQueue:ye,insertTrackAt:xe,removeTrackAt:he,moveTrack:ke,enqueueNext:be,playTrackAt:ve,selectTrackAt:Te,setPlaylistMeta:Me,setPlaybackMode:Ee}),[fe,b,Ie,$,Pe,F,D,ve,xe,he,ke,be,Te,H,U,le,ge,ye,pe,Me,Ee,ue,u,de,ce,me]),$r=l.useMemo(()=>({tracks:u.tracks,currentIndex:u.currentIndex,isPaused:u.isPaused,isShuffled:u.isShuffled,repeatMode:u.repeatMode,originalTracks:u.originalTracks,playlistMeta:u.playlistMeta,init:Ie,play:D,pause:F,togglePlayPause:ce,next:$,prev:H,setRepeatMode:pe,cycleRepeat:fe,toggleShuffle:me,playbackMode:u.playbackMode,setQueue:ye,insertTrackAt:xe,removeTrackAt:he,moveTrack:ke,enqueueNext:be,playTrackAt:ve,selectTrackAt:Te,setPlaylistMeta:Me,setPlaybackMode:Ee,dispatch:b}),[u.tracks,u.currentIndex,u.isPaused,u.isShuffled,u.repeatMode,u.playbackMode,u.originalTracks,u.playlistMeta,Ie,D,F,ce,$,H,pe,fe,me,ye,xe,he,ke,be,ve,Te,Me,Ee,b]),Hr=l.useMemo(()=>({currentTime:u.currentTime,duration:u.duration,bufferedFraction:u.bufferedFraction,isBuffering:u.isBuffering,errorMessage:u.errorMessage,volume:u.volume,muted:u.muted,playbackRate:u.playbackRate,seek:U,setVolume:ue,setMuted:le,toggleMute:de,setPlaybackRate:ge,audioRef:N,notifyEnded:Pe,dispatch:b}),[u.currentTime,u.duration,u.bufferedFraction,u.isBuffering,u.errorMessage,u.volume,u.muted,u.playbackRate,U,ue,le,de,ge,N,Pe,b]),Ke=S.derivePlaybackUiState(u),qe=l.useMemo(()=>G?je:{...ft,...je},[je,G]),w=l.useMemo(()=>({className:K,style:qe,"data-ginger-playback":Ke,dir:Xe}),[K,qe,Ke,Xe]),Yr=l.useMemo(()=>{if(!X)return o.jsx("div",{className:w.className,style:w.style,"data-ginger-playback":w["data-ginger-playback"],dir:w.dir,children:e});const p=l.Children.only(e);if(!l.isValidElement(p))throw new Error("Ginger.Provider asChild expects a single React element child.");const E=p,I=E.props.style;return l.cloneElement(E,{className:yt(E.props.className,w.className),style:I&&typeof I=="object"?{...I,...w.style}:w.style,"data-ginger-playback":w["data-ginger-playback"],dir:w.dir})},[X,e,w]);return o.jsx(Xr,{locale:v,children:o.jsx(k.GingerPlaybackContext.Provider,{value:$r,children:o.jsx(k.GingerMediaContext.Provider,{value:Hr,children:o.jsx(rr.Provider,{value:Or,children:Yr})})})})}function yt(e,r){const n=[e,r].filter(Boolean).join(" ");return n===""?void 0:n}const xt={Provider:mt,Player:zr,Current:{Title:qr,Artist:Jr,Album:Zr,Description:et,Copyright:rt,Genre:tt,Label:nt,Isrc:at,TrackNumber:it,Year:mr,Lyrics:yr,LyricsSynced:$e,Chapters:He,FileUrl:br,Artwork:vr,QueueIndex:Tr,QueueLength:Mr,QueuePosition:Er,Elapsed:Ir,Duration:Pr,Remaining:Sr,Progress:Ar,TimeRail:Rr,BufferRail:jr,PlaybackState:Gr,ErrorMessage:Cr},Queue:{Title:ct,Subtitle:ut,Description:lt,Copyright:dt,Artwork:Nr},Control:{PlayPause:or,Repeat:sr,Next:cr,Previous:ur,Shuffle:lr,SeekBar:dr,Volume:gr,Mute:pr,PlaybackRate:fr},Icon:{Play:_e,Pause:Ne,SkipForward:Be,SkipBack:Ue,Shuffle:Fe,Volume2:Ve,VolumeX:Oe,RepeatGlyph:De,Wrapper:C},Playlist:st};exports.Chapters=He;exports.Ginger=xt;exports.LyricsSynced=$e;exports.Pause=Ne;exports.Play=_e;exports.RepeatGlyph=De;exports.ShuffleIcon=Fe;exports.SkipBack=Ue;exports.SkipForward=Be;exports.Volume2=Ve;exports.VolumeX=Oe;exports.Wrapper=C;exports.clampPlaybackRate=Re;exports.clampVolume=W;exports.createInitialState=Qe;exports.defaultGingerLocale=Q;exports.gingerReducer=_r;exports.parseLrc=xr;exports.useGingerChapters=kr;exports.useGingerLocale=j;exports.useGingerLyricsSync=hr;exports.usePlayPauseBinding=ir;exports.useSeekBarBinding=nr;exports.useVolumeSlider=ar;
2
- //# sourceMappingURL=ginger-Dv3iO_xQ.cjs.map