@lucaismyname/ginger 0.0.29 → 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -8
- package/dist/analyzer/liveAudioGraph.d.ts +14 -1
- package/dist/analyzer/liveAudioGraph.d.ts.map +1 -1
- package/dist/analyzer/useGingerLiveAnalyzer.d.ts +6 -0
- package/dist/analyzer/useGingerLiveAnalyzer.d.ts.map +1 -1
- package/dist/client.cjs +1 -1
- package/dist/client.js +36 -29
- package/dist/client.js.map +1 -1
- package/dist/components/playlist/GingerPlaylist.d.ts.map +1 -1
- package/dist/context/GingerProvider.d.ts +1 -1
- package/dist/context/GingerProvider.d.ts.map +1 -1
- package/dist/core/playbackReducer.d.ts.map +1 -1
- package/dist/equalizer/index.cjs +2 -0
- package/dist/equalizer/index.cjs.map +1 -0
- package/dist/equalizer/index.d.ts +3 -0
- package/dist/equalizer/index.d.ts.map +1 -0
- package/dist/equalizer/index.js +51 -0
- package/dist/equalizer/index.js.map +1 -0
- package/dist/equalizer/useGingerEqualizer.d.ts +41 -0
- package/dist/equalizer/useGingerEqualizer.d.ts.map +1 -0
- package/dist/ginger-L2ZFgzH4.js +2223 -0
- package/dist/ginger-L2ZFgzH4.js.map +1 -0
- package/dist/ginger-NEcOSSJD.cjs +2 -0
- package/dist/ginger-NEcOSSJD.cjs.map +1 -0
- package/dist/hooks/useGingerChapterProgress.d.ts +14 -0
- package/dist/hooks/useGingerChapterProgress.d.ts.map +1 -0
- package/dist/hooks/useGingerKeyboardShortcuts.d.ts +6 -0
- package/dist/hooks/useGingerKeyboardShortcuts.d.ts.map +1 -1
- package/dist/hooks/useGingerPlaybackHistory.d.ts +26 -0
- package/dist/hooks/useGingerPlaybackHistory.d.ts.map +1 -0
- package/dist/hooks/useGingerSleepTimer.d.ts.map +1 -1
- package/dist/hooks/useGingerVolumeFade.d.ts +22 -0
- package/dist/hooks/useGingerVolumeFade.d.ts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +18 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -29
- package/dist/index.js.map +1 -1
- package/dist/liveAudioGraph-CmEsdLgZ.js +150 -0
- package/dist/liveAudioGraph-CmEsdLgZ.js.map +1 -0
- package/dist/liveAudioGraph-D1BXMv_u.cjs +2 -0
- package/dist/liveAudioGraph-D1BXMv_u.cjs.map +1 -0
- package/dist/selectors-BalBCc7X.js +127 -0
- package/dist/selectors-BalBCc7X.js.map +1 -0
- package/dist/selectors-YXnP8Y8g.cjs +2 -0
- package/dist/selectors-YXnP8Y8g.cjs.map +1 -0
- package/dist/store.d.ts +46 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/testing/index.cjs +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/mockWebAudio.d.ts +15 -1
- package/dist/testing/mockWebAudio.d.ts.map +1 -1
- package/dist/types.d.ts +30 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/useGingerChapterProgress-BOqUimE7.cjs +2 -0
- package/dist/useGingerChapterProgress-BOqUimE7.cjs.map +1 -0
- package/dist/useGingerChapterProgress-DLYdGytK.js +321 -0
- package/dist/useGingerChapterProgress-DLYdGytK.js.map +1 -0
- package/package.json +7 -2
- package/dist/ginger-B26HM2Ja.cjs +0 -2
- package/dist/ginger-B26HM2Ja.cjs.map +0 -1
- package/dist/ginger-DlNYfHbV.js +0 -2278
- package/dist/ginger-DlNYfHbV.js.map +0 -1
- package/dist/useNextTrackPrefetch-Y_fs2JEx.js +0 -265
- package/dist/useNextTrackPrefetch-Y_fs2JEx.js.map +0 -1
- package/dist/useNextTrackPrefetch-wSILz6TL.cjs +0 -2
- package/dist/useNextTrackPrefetch-wSILz6TL.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGingerChapterProgress-DLYdGytK.js","sources":["../src/analyzer/useGingerLiveAnalyzer.ts","../src/hooks/useGingerKeyboardShortcuts.ts","../src/hooks/useGingerSleepTimer.ts","../src/hooks/useGingerDebugLog.ts","../src/hooks/useSeekDrag.ts","../src/hooks/useNextTrackPrefetch.ts","../src/store.ts","../src/hooks/useGingerPlaybackHistory.ts","../src/hooks/useGingerVolumeFade.ts","../src/hooks/useGingerChapterProgress.ts"],"sourcesContent":["import { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { useGinger } from \"../hooks/useGinger\";\nimport { type LiveAnalyserOptions, attachLiveAnalyser, detachLiveAnalyser } from \"./liveAudioGraph\";\n\nexport type UseGingerLiveAnalyzerOptions = {\n /** When false, the analyser is detached and no frames are read. Default true. */\n enabled?: boolean;\n fftSize?: number;\n smoothingTimeConstant?: number;\n minDecibels?: number;\n maxDecibels?: number;\n};\n\nexport type UseGingerLiveAnalyzerResult = {\n /** Byte frequency data (0–255); length equals `frequencyBinCount`. Updated each animation frame while enabled. */\n frequencyData: Uint8Array;\n /** Byte time-domain data (0–255); length equals `fftSize`. */\n timeDomainData: Uint8Array;\n frequencyBinCount: number;\n sampleRate: number;\n isSuspended: boolean;\n error: string | null;\n resume: () => Promise<void>;\n /**\n * Monotonically increasing counter incremented each animation frame.\n * Use as a `useMemo` / `useEffect` dependency to respond to new audio data, since\n * `frequencyData` and `timeDomainData` are mutated in-place (their reference never changes).\n */\n frame: number;\n};\n\nconst emptyFreq = new Uint8Array(0);\nconst emptyTime = new Uint8Array(0);\n\nexport function useGingerLiveAnalyzer(\n options: UseGingerLiveAnalyzerOptions = {},\n): UseGingerLiveAnalyzerResult {\n const {\n enabled = true,\n fftSize = 2048,\n smoothingTimeConstant = 0.8,\n minDecibels = -100,\n maxDecibels = -30,\n } = options;\n\n const { audioRef, state } = useGinger();\n const opts = useMemo<LiveAnalyserOptions>(\n () => ({\n fftSize,\n smoothingTimeConstant,\n minDecibels,\n maxDecibels,\n }),\n [fftSize, smoothingTimeConstant, minDecibels, maxDecibels],\n );\n\n const [frame, setFrame] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const [isSuspended, setIsSuspended] = useState(false);\n const [meta, setMeta] = useState({ frequencyBinCount: 0, sampleRate: 0 });\n\n const freqRef = useRef<Uint8Array>(emptyFreq);\n const timeRef = useRef<Uint8Array>(emptyTime);\n\n const resume = useCallback(async () => {\n const ctx = contextHolderRef.current;\n if (ctx && ctx.state === \"suspended\") {\n await ctx.resume();\n }\n }, []);\n\n const contextHolderRef = useRef<AudioContext | null>(null);\n const analyserHolderRef = useRef<AnalyserNode | null>(null);\n\n useLayoutEffect(() => {\n if (!enabled || typeof window === \"undefined\") {\n return;\n }\n\n let cancelled = false;\n let consumerId: number | null = null;\n let element: HTMLAudioElement | null = null;\n let rafId = 0;\n\n const onStateChange = () => {\n const ctx = contextHolderRef.current;\n if (ctx) setIsSuspended(ctx.state === \"suspended\");\n };\n\n const runLoop = () => {\n if (cancelled) return;\n const a = analyserHolderRef.current;\n const fq = freqRef.current;\n const td = timeRef.current;\n if (a && fq.length > 0 && td.length > 0) {\n a.getByteFrequencyData(fq as Uint8Array<ArrayBuffer>);\n a.getByteTimeDomainData(td as Uint8Array<ArrayBuffer>);\n setFrame((n) => n + 1);\n }\n rafId = requestAnimationFrame(runLoop);\n };\n\n type AttachOutcome = \"ok\" | \"no-element\" | \"error\";\n\n const attach = (): AttachOutcome => {\n const el = audioRef.current;\n if (!el || cancelled) return \"no-element\";\n try {\n const { id, context, analyser } = attachLiveAnalyser(el, opts);\n consumerId = id;\n element = el;\n contextHolderRef.current = context;\n analyserHolderRef.current = analyser;\n setIsSuspended(context.state === \"suspended\");\n setError(null);\n\n context.addEventListener(\"statechange\", onStateChange);\n\n const n = analyser.frequencyBinCount;\n const fft = analyser.fftSize;\n freqRef.current = new Uint8Array(n);\n timeRef.current = new Uint8Array(fft);\n setMeta({ frequencyBinCount: n, sampleRate: context.sampleRate });\n\n rafId = requestAnimationFrame(runLoop);\n return \"ok\";\n } catch (e) {\n const msg = e instanceof Error ? e.message : \"Failed to attach live analyser\";\n setError(msg);\n contextHolderRef.current = null;\n analyserHolderRef.current = null;\n freqRef.current = emptyFreq;\n timeRef.current = emptyTime;\n setMeta({ frequencyBinCount: 0, sampleRate: 0 });\n return \"error\";\n }\n };\n\n const first = attach();\n if (first !== \"ok\") {\n let retryRaf = 0;\n const maxAttempts = 120;\n let attempts = 0;\n\n const retryLoop = () => {\n if (cancelled) return;\n const out = attach();\n if (out === \"ok\" || out === \"error\") return;\n attempts += 1;\n if (attempts >= maxAttempts) return;\n retryRaf = requestAnimationFrame(retryLoop);\n };\n\n if (first === \"no-element\") {\n retryRaf = requestAnimationFrame(retryLoop);\n }\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(retryRaf);\n cancelAnimationFrame(rafId);\n if (consumerId != null && element) {\n detachLiveAnalyser(element, consumerId);\n }\n contextHolderRef.current?.removeEventListener(\"statechange\", onStateChange);\n contextHolderRef.current = null;\n analyserHolderRef.current = null;\n freqRef.current = emptyFreq;\n timeRef.current = emptyTime;\n };\n }\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(rafId);\n if (consumerId != null && element) {\n detachLiveAnalyser(element, consumerId);\n }\n contextHolderRef.current?.removeEventListener(\"statechange\", onStateChange);\n contextHolderRef.current = null;\n analyserHolderRef.current = null;\n freqRef.current = emptyFreq;\n timeRef.current = emptyTime;\n setMeta({ frequencyBinCount: 0, sampleRate: 0 });\n };\n }, [enabled, audioRef, opts, state.currentIndex]);\n\n return {\n frequencyData: freqRef.current,\n timeDomainData: timeRef.current,\n frequencyBinCount: meta.frequencyBinCount,\n sampleRate: meta.sampleRate,\n isSuspended,\n error,\n resume,\n frame,\n };\n}\n","import { useEffect } from \"react\";\nimport { useGingerMedia, useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type GingerKeyboardShortcutBindings = {\n playPause?: string;\n next?: string;\n previous?: string;\n mute?: string;\n /** Key to seek forward by `seekSeconds`. Default: undefined (disabled). */\n seekForward?: string;\n /** Key to seek backward by `seekSeconds`. Default: undefined (disabled). */\n seekBackward?: string;\n /** Seconds to seek per `seekForward` / `seekBackward` keypress. Default: 5. */\n seekSeconds?: number;\n};\n\nexport function useGingerKeyboardShortcuts(\n enabled = true,\n bindings: GingerKeyboardShortcutBindings = {},\n): void {\n const { togglePlayPause, next, prev } = useGingerPlayback();\n const { toggleMute, seek, currentTime, duration } = useGingerMedia();\n\n const {\n mute: muteBinding,\n seekForward: seekForwardBinding,\n seekBackward: seekBackwardBinding,\n } = bindings;\n\n useEffect(() => {\n if (!enabled || typeof window === \"undefined\") return;\n const playPause = (bindings.playPause ?? \" \").toLowerCase();\n const nextKey = (bindings.next ?? \"ArrowRight\").toLowerCase();\n const prevKey = (bindings.previous ?? \"ArrowLeft\").toLowerCase();\n const muteKey = muteBinding?.toLowerCase();\n const seekFwdKey = seekForwardBinding?.toLowerCase();\n const seekBwdKey = seekBackwardBinding?.toLowerCase();\n const seekSecs = bindings.seekSeconds ?? 5;\n\n const onKeyDown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n if (\n target &&\n ([\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(target.tagName) || target.isContentEditable)\n )\n return;\n const key = event.key.toLowerCase();\n if (key === playPause) {\n event.preventDefault();\n togglePlayPause();\n } else if (key === nextKey) {\n event.preventDefault();\n next();\n } else if (key === prevKey) {\n event.preventDefault();\n prev();\n } else if (muteKey && key === muteKey) {\n event.preventDefault();\n toggleMute();\n } else if (seekFwdKey && key === seekFwdKey) {\n event.preventDefault();\n const dur = duration > 0 ? duration : Number.POSITIVE_INFINITY;\n seek(Math.min(dur, currentTime + seekSecs));\n } else if (seekBwdKey && key === seekBwdKey) {\n event.preventDefault();\n seek(Math.max(0, currentTime - seekSecs));\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [\n bindings.next,\n bindings.playPause,\n bindings.previous,\n bindings.seekSeconds,\n currentTime,\n duration,\n enabled,\n muteBinding,\n next,\n prev,\n seek,\n seekBackwardBinding,\n seekForwardBinding,\n toggleMute,\n togglePlayPause,\n ]);\n}\n","import { useEffect, useRef } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type GingerSleepTimerOptions = {\n durationMs?: number;\n stopAfterTracks?: number;\n respectPause?: boolean;\n enabled?: boolean;\n onFire?: () => void;\n};\n\nexport function useGingerSleepTimer(options: GingerSleepTimerOptions): void {\n const { durationMs, stopAfterTracks, respectPause = true, enabled = true, onFire } = options;\n const { currentIndex, pause, isPaused } = useGingerPlayback();\n const remainingTracksRef = useRef(stopAfterTracks ?? 0);\n const prevIndexRef = useRef(currentIndex);\n\n // Remaining milliseconds for the duration-based timer; carried across pause/resume cycles.\n const remainingMsRef = useRef(durationMs ?? 0);\n // Timestamp when the current timer segment started (set when playback resumes).\n const segmentStartRef = useRef<number | null>(null);\n\n useEffect(() => {\n remainingTracksRef.current = stopAfterTracks ?? 0;\n }, [stopAfterTracks]);\n\n // Keep remainingMsRef in sync when durationMs changes while the timer is inactive.\n const prevDurationMsRef = useRef(durationMs);\n useEffect(() => {\n if (prevDurationMsRef.current !== durationMs) {\n remainingMsRef.current = durationMs ?? 0;\n prevDurationMsRef.current = durationMs;\n }\n }, [durationMs]);\n\n useEffect(() => {\n if (!enabled || !durationMs || durationMs <= 0) {\n // Reset remaining when disabled or no duration\n remainingMsRef.current = durationMs ?? 0;\n segmentStartRef.current = null;\n return;\n }\n\n if (respectPause && isPaused) {\n // Snapshot how much time is left before pausing\n if (segmentStartRef.current !== null) {\n const elapsed = Date.now() - segmentStartRef.current;\n remainingMsRef.current = Math.max(0, remainingMsRef.current - elapsed);\n segmentStartRef.current = null;\n }\n return;\n }\n\n // Playing: start (or continue) the countdown from remainingMsRef\n segmentStartRef.current = Date.now();\n const id = setTimeout(() => {\n remainingMsRef.current = 0;\n segmentStartRef.current = null;\n pause();\n onFire?.();\n }, remainingMsRef.current);\n\n return () => {\n clearTimeout(id);\n // Snapshot remaining when effect cleans up (e.g. isPaused or deps changed)\n if (segmentStartRef.current !== null) {\n const elapsed = Date.now() - segmentStartRef.current;\n remainingMsRef.current = Math.max(0, remainingMsRef.current - elapsed);\n segmentStartRef.current = null;\n }\n };\n }, [durationMs, enabled, isPaused, onFire, pause, respectPause]);\n\n useEffect(() => {\n if (!enabled || !stopAfterTracks || stopAfterTracks <= 0) return;\n const prev = prevIndexRef.current;\n prevIndexRef.current = currentIndex;\n if (currentIndex === prev) return;\n remainingTracksRef.current -= 1;\n if (remainingTracksRef.current <= 0) {\n pause();\n onFire?.();\n }\n }, [currentIndex, enabled, onFire, pause, stopAfterTracks]);\n}\n","import { useEffect, useRef } from \"react\";\nimport { useGingerState } from \"../context/GingerSplitContexts\";\n\nexport function useGingerDebugLog(enabled = false): void {\n const state = useGingerState();\n const prevRef = useRef(state);\n\n useEffect(() => {\n if (!enabled || typeof console === \"undefined\") return;\n const prev = prevRef.current;\n if (prev !== state) {\n console.debug(\"[ginger]\", {\n from: {\n currentIndex: prev.currentIndex,\n isPaused: prev.isPaused,\n currentTime: prev.currentTime,\n repeatMode: prev.repeatMode,\n },\n to: {\n currentIndex: state.currentIndex,\n isPaused: state.isPaused,\n currentTime: state.currentTime,\n repeatMode: state.repeatMode,\n },\n });\n }\n prevRef.current = state;\n }, [enabled, state]);\n}\n","import { useCallback, useState } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport {\n gingerStateFromContextValues,\n useGingerMedia,\n useGingerPlayback,\n} from \"../context/GingerSplitContexts\";\nimport { progressFraction } from \"../internal/selectors\";\n\nexport type SeekDragState = {\n /** Raw drag fraction — only updated during an active drag gesture. */\n fraction: number;\n /** Blended fraction: follows live playback when idle, drag position when dragging. */\n displayFraction: number;\n isDragging: boolean;\n onPointerDown: (event: ReactPointerEvent<HTMLElement>) => void;\n};\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nexport function useSeekDrag(duration: number): SeekDragState {\n const media = useGingerMedia();\n const playback = useGingerPlayback();\n const { seek } = media;\n const [fraction, setFraction] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n\n const liveFraction = progressFraction(gingerStateFromContextValues(playback, media));\n const displayFraction = isDragging ? fraction : liveFraction;\n\n const onPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n if (!(duration > 0)) return;\n const target = event.currentTarget;\n const rect = target.getBoundingClientRect();\n const update = (clientX: number) => {\n const ratio = clamp01((clientX - rect.left) / rect.width);\n setFraction(ratio);\n seek(ratio * duration);\n };\n setIsDragging(true);\n target.setPointerCapture(event.pointerId);\n update(event.clientX);\n const onMove = (moveEvent: PointerEvent) => update(moveEvent.clientX);\n const onUp = (upEvent: PointerEvent) => {\n update(upEvent.clientX);\n setIsDragging(false);\n target.releasePointerCapture(event.pointerId);\n target.removeEventListener(\"pointermove\", onMove);\n target.removeEventListener(\"pointerup\", onUp);\n target.removeEventListener(\"pointercancel\", onUp);\n };\n target.addEventListener(\"pointermove\", onMove);\n target.addEventListener(\"pointerup\", onUp);\n target.addEventListener(\"pointercancel\", onUp);\n },\n [duration, seek],\n );\n\n return { fraction, displayFraction, isDragging, onPointerDown };\n}\n","import { useEffect } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\nimport { computeNextIndex } from \"../core/transitions\";\n\nexport type UseNextTrackPrefetchOptions = {\n /** When false, no prefetch runs. Default true. */\n enabled?: boolean;\n /**\n * Match `crossOrigin` on `Ginger.Player` when `fileUrl` is cross-origin so the browser\n * can reuse cached media consistently.\n */\n crossOrigin?: \"\" | \"anonymous\" | \"use-credentials\" | undefined;\n};\n\n/**\n * Warms the browser cache for the **logical** next track (same rules as the Next control:\n * `computeNextIndex` from queue, repeat, and playback mode) using a detached `HTMLAudioElement`\n * with `preload=\"auto\"`. Safe to call alongside `Ginger.Player`; it does not replace main playback.\n */\nexport function useNextTrackPrefetch(options: UseNextTrackPrefetchOptions = {}): void {\n const { enabled = true, crossOrigin } = options;\n const { tracks, currentIndex, repeatMode, playbackMode } = useGingerPlayback();\n\n useEffect(() => {\n if (!enabled || typeof document === \"undefined\") return;\n const nextIndex = computeNextIndex({ tracks, currentIndex, repeatMode, playbackMode });\n if (nextIndex === currentIndex) return;\n const nextUrl = tracks[nextIndex]?.fileUrl ?? \"\";\n if (!nextUrl) return;\n\n const audio = document.createElement(\"audio\");\n audio.preload = \"auto\";\n if (crossOrigin) audio.crossOrigin = crossOrigin;\n audio.src = nextUrl;\n audio.load();\n\n return () => {\n audio.removeAttribute(\"src\");\n audio.load();\n };\n }, [enabled, crossOrigin, tracks, currentIndex, repeatMode, playbackMode]);\n}\n","import { clampPlaybackRate, clampVolume, createInitialState, gingerReducer } from \"./core/playbackReducer\";\nimport type { GingerAction, GingerInitPayload, GingerState, PlaylistMeta, RepeatMode, Track } from \"./types\";\n\nexport type GingerStoreOptions = {\n tracks?: Track[];\n currentIndex?: number;\n playlistMeta?: PlaylistMeta | null;\n isPaused?: boolean;\n isShuffled?: boolean;\n repeatMode?: RepeatMode;\n playbackMode?: GingerState[\"playbackMode\"];\n volume?: number;\n muted?: boolean;\n playbackRate?: number;\n};\n\nexport type GingerStore = {\n /** Returns the current state snapshot. */\n getState: () => GingerState;\n /** Dispatch an action to update state. Synchronously updates state and notifies listeners. */\n dispatch: (action: GingerAction) => void;\n /**\n * Subscribe to state changes. The listener is called after every `dispatch` that produces\n * a new state object. Returns an unsubscribe function.\n */\n subscribe: (listener: (state: GingerState) => void) => () => void;\n /** Convenience: re-initialise with a new set of init options (equivalent to `dispatch({ type: \"INIT\", ... })`). */\n init: (payload: GingerInitPayload) => void;\n /** Clamp helpers re-exported for convenience. */\n clampVolume: typeof clampVolume;\n clampPlaybackRate: typeof clampPlaybackRate;\n};\n\n/**\n * Framework-agnostic store wrapping `gingerReducer`.\n * Usable outside React — e.g. in Svelte, Vue, Node.js testing, or server-side rendering contexts.\n *\n * @example\n * ```ts\n * import { createGingerStore } from \"@lucaismyname/ginger\";\n *\n * const store = createGingerStore({ tracks: myTracks });\n * const unsub = store.subscribe((state) => console.log(state.currentIndex));\n * store.dispatch({ type: \"NEXT\" });\n * unsub();\n * ```\n */\nexport function createGingerStore(options: GingerStoreOptions = {}): GingerStore {\n let state = createInitialState({\n tracks: options.tracks ?? [],\n currentIndex: options.currentIndex,\n playlistMeta: options.playlistMeta,\n isPaused: options.isPaused,\n isShuffled: options.isShuffled,\n repeatMode: options.repeatMode,\n playbackMode: options.playbackMode,\n volume: options.volume,\n muted: options.muted,\n playbackRate: options.playbackRate,\n });\n\n const listeners = new Set<(state: GingerState) => void>();\n\n const dispatch = (action: GingerAction): void => {\n const next = gingerReducer(state, action);\n if (next !== state) {\n state = next;\n for (const listener of listeners) {\n listener(state);\n }\n }\n };\n\n const subscribe = (listener: (state: GingerState) => void): (() => void) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n\n const init = (payload: GingerInitPayload): void => {\n dispatch({ type: \"INIT\", payload });\n };\n\n return {\n getState: () => state,\n dispatch,\n subscribe,\n init,\n clampVolume,\n clampPlaybackRate,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\nimport type { Track } from \"../types\";\n\nexport type GingerPlaybackHistoryEntry = {\n track: Track;\n /** The track's index in the queue at the time it was played. */\n index: number;\n /** Unix timestamp (ms) when the track started playing. */\n playedAt: number;\n};\n\nexport type UseGingerPlaybackHistoryOptions = {\n /** Maximum number of entries to keep. Oldest entries are dropped first. Default: 50. */\n maxLength?: number;\n};\n\nexport type UseGingerPlaybackHistoryResult = {\n /** Chronological list of played tracks; most recent entry is last. */\n history: GingerPlaybackHistoryEntry[];\n clearHistory: () => void;\n};\n\n/**\n * Records a history of played tracks in chronological order.\n * Useful for \"what was playing before\" in shuffle mode or for analytics.\n *\n * The history is stored in component state and does not survive remounts.\n * In shuffle mode, `index` reflects the position in the current shuffled queue.\n */\nexport function useGingerPlaybackHistory(\n options: UseGingerPlaybackHistoryOptions = {},\n): UseGingerPlaybackHistoryResult {\n const { maxLength = 50 } = options;\n const { tracks, currentIndex } = useGingerPlayback();\n\n const [history, setHistory] = useState<GingerPlaybackHistoryEntry[]>([]);\n const prevIndexRef = useRef<number | null>(null);\n const prevTracksRef = useRef(tracks);\n prevTracksRef.current = tracks;\n\n useEffect(() => {\n const track = tracks[currentIndex];\n if (!track) return;\n\n if (prevIndexRef.current === currentIndex) return;\n prevIndexRef.current = currentIndex;\n\n const entry: GingerPlaybackHistoryEntry = {\n track,\n index: currentIndex,\n playedAt: Date.now(),\n };\n\n setHistory((prev) => {\n const next = [...prev, entry];\n return next.length > maxLength ? next.slice(next.length - maxLength) : next;\n });\n }, [currentIndex, tracks, maxLength]);\n\n const clearHistory = useCallback(() => setHistory([]), []);\n\n return { history, clearHistory };\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport { useGingerMedia } from \"../context/GingerSplitContexts\";\n\nexport type UseGingerVolumeFadeOptions = {\n /** Target volume to fade to (0–1). */\n targetVolume: number;\n /** Duration of the fade in milliseconds. */\n durationMs: number;\n /** Called when the fade completes normally (not when cancelled). */\n onComplete?: () => void;\n};\n\nexport type UseGingerVolumeFadeResult = {\n /** Start a volume fade. Cancels any in-progress fade. */\n fadeVolumeTo: (options: UseGingerVolumeFadeOptions) => void;\n /** Cancel the current fade and hold at the current volume. */\n cancelFade: () => void;\n /** True while a fade is in progress. */\n isFading: boolean;\n};\n\n/**\n * Smoothly interpolates volume over a given duration using `requestAnimationFrame`.\n * Useful for fade-in on track start, fade-out before sleep timer fires, or crossfade prep.\n */\nexport function useGingerVolumeFade(): UseGingerVolumeFadeResult {\n const { setVolume, volume } = useGingerMedia();\n const [isFading, setIsFading] = useState(false);\n\n const rafRef = useRef<number>(0);\n const cancelledRef = useRef(false);\n\n const cancelFade = useCallback(() => {\n cancelAnimationFrame(rafRef.current);\n cancelledRef.current = true;\n setIsFading(false);\n }, []);\n\n const fadeVolumeTo = useCallback(\n ({ targetVolume, durationMs, onComplete }: UseGingerVolumeFadeOptions) => {\n cancelAnimationFrame(rafRef.current);\n cancelledRef.current = false;\n\n const clamp = (v: number) => Math.min(1, Math.max(0, v));\n const target = clamp(targetVolume);\n const startTime = performance.now();\n\n // Capture start volume at the moment the fade begins\n let startVolume = volume;\n\n setIsFading(true);\n\n const tick = (now: number) => {\n if (cancelledRef.current) return;\n const elapsed = now - startTime;\n const progress = Math.min(1, elapsed / Math.max(1, durationMs));\n const current = startVolume + (target - startVolume) * progress;\n setVolume(clamp(current));\n\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(tick);\n } else {\n setIsFading(false);\n onComplete?.();\n }\n };\n\n // Use a small delay so `volume` from closure is the current value\n rafRef.current = requestAnimationFrame((now) => {\n startVolume = volume;\n tick(now);\n });\n },\n [setVolume, volume],\n );\n\n return { fadeVolumeTo, cancelFade, isFading };\n}\n","import { useMemo } from \"react\";\nimport { useGingerMedia, useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type GingerChapterProgress = {\n /** Fraction (0–1) of the way through the active chapter. 0 when no chapter is active. */\n progress: number;\n /** Seconds elapsed since the start of the active chapter. */\n elapsed: number;\n /** Seconds remaining until the end of the active chapter (or until end of track if last chapter). */\n remaining: number;\n};\n\n/**\n * Returns detailed progress information for the currently active chapter.\n * Complements `useGingerChapters` with per-chapter playback fractions.\n */\nexport function useGingerChapterProgress(): GingerChapterProgress {\n const { tracks, currentIndex } = useGingerPlayback();\n const { currentTime, duration } = useGingerMedia();\n\n const chapters = useMemo(() => {\n const raw = tracks[currentIndex]?.chapters ?? [];\n return [...raw]\n .filter((c) => c && Number.isFinite(c.startSeconds) && c.startSeconds >= 0)\n .sort((a, b) => a.startSeconds - b.startSeconds);\n }, [tracks, currentIndex]);\n\n return useMemo<GingerChapterProgress>(() => {\n if (chapters.length === 0) return { progress: 0, elapsed: 0, remaining: 0 };\n\n // Find active chapter (last one whose start is <= currentTime)\n let activeIdx = -1;\n for (let i = chapters.length - 1; i >= 0; i--) {\n if (currentTime >= chapters[i]!.startSeconds) {\n activeIdx = i;\n break;\n }\n }\n\n if (activeIdx === -1) return { progress: 0, elapsed: 0, remaining: 0 };\n\n const chapter = chapters[activeIdx]!;\n const nextChapter = chapters[activeIdx + 1];\n const chapterEnd = nextChapter?.startSeconds ?? (duration > 0 ? duration : currentTime);\n const chapterDuration = Math.max(0, chapterEnd - chapter.startSeconds);\n const elapsed = Math.max(0, currentTime - chapter.startSeconds);\n const remaining = Math.max(0, chapterEnd - currentTime);\n const progress = chapterDuration > 0 ? Math.min(1, elapsed / chapterDuration) : 0;\n\n return { progress, elapsed, remaining };\n }, [chapters, currentTime, duration]);\n}\n"],"names":["emptyFreq","emptyTime","useGingerLiveAnalyzer","options","enabled","fftSize","smoothingTimeConstant","minDecibels","maxDecibels","audioRef","state","useGinger","opts","useMemo","frame","setFrame","useState","error","setError","isSuspended","setIsSuspended","meta","setMeta","freqRef","useRef","timeRef","resume","useCallback","ctx","contextHolderRef","analyserHolderRef","useLayoutEffect","cancelled","consumerId","element","rafId","onStateChange","runLoop","a","fq","td","n","attach","el","id","context","analyser","attachLiveAnalyser","fft","e","msg","first","retryRaf","maxAttempts","attempts","retryLoop","out","detachLiveAnalyser","_a","useGingerKeyboardShortcuts","bindings","togglePlayPause","next","prev","useGingerPlayback","toggleMute","seek","currentTime","duration","useGingerMedia","muteBinding","seekForwardBinding","seekBackwardBinding","useEffect","playPause","nextKey","prevKey","muteKey","seekFwdKey","seekBwdKey","seekSecs","onKeyDown","event","target","key","dur","useGingerSleepTimer","durationMs","stopAfterTracks","respectPause","onFire","currentIndex","pause","isPaused","remainingTracksRef","prevIndexRef","remainingMsRef","segmentStartRef","prevDurationMsRef","elapsed","useGingerDebugLog","useGingerState","prevRef","clamp01","value","useSeekDrag","media","playback","fraction","setFraction","isDragging","setIsDragging","liveFraction","progressFraction","gingerStateFromContextValues","displayFraction","onPointerDown","rect","update","clientX","ratio","onMove","moveEvent","onUp","upEvent","useNextTrackPrefetch","crossOrigin","tracks","repeatMode","playbackMode","nextIndex","computeNextIndex","nextUrl","audio","createGingerStore","createInitialState","listeners","dispatch","action","gingerReducer","listener","payload","clampVolume","clampPlaybackRate","useGingerPlaybackHistory","maxLength","history","setHistory","prevTracksRef","track","entry","clearHistory","useGingerVolumeFade","setVolume","volume","isFading","setIsFading","rafRef","cancelledRef","cancelFade","targetVolume","onComplete","clamp","v","startTime","startVolume","tick","now","progress","current","useGingerChapterProgress","chapters","c","b","activeIdx","i","chapter","nextChapter","chapterEnd","chapterDuration","remaining"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lucaismyname/ginger",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "A
|
|
3
|
+
"version": "0.0.31",
|
|
4
|
+
"description": "A headless & batteries-included React audio-player primitive",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"files": [
|
|
@@ -37,6 +37,11 @@
|
|
|
37
37
|
"types": "./dist/experimental-gapless/index.d.ts",
|
|
38
38
|
"import": "./dist/experimental-gapless/index.js",
|
|
39
39
|
"require": "./dist/experimental-gapless/index.cjs"
|
|
40
|
+
},
|
|
41
|
+
"./equalizer": {
|
|
42
|
+
"types": "./dist/equalizer/index.d.ts",
|
|
43
|
+
"import": "./dist/equalizer/index.js",
|
|
44
|
+
"require": "./dist/equalizer/index.cjs"
|
|
40
45
|
}
|
|
41
46
|
},
|
|
42
47
|
"scripts": {
|
package/dist/ginger-B26HM2Ja.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const o=require("react/jsx-runtime"),f=require("react"),h=require("./GingerSplitContexts-C7puo0M7.cjs"),qe=f.createContext(null);function Hr(){const e=f.useContext(qe);if(!e)throw new Error("Ginger components must be used within <Ginger.Provider>");return e}function Xe(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:a,respectReducedMotion:t=!1}){var S;const{audioRef:i,dispatch:s,state:u,notifyEnded:l}=Hr(),c=((S=u.tracks[u.currentIndex])==null?void 0:S.fileUrl)??"",m=f.useRef({currentTime:-1,duration:-1,bufferedFraction:-1}),y=f.useRef(""),[k,b]=f.useState(!1);f.useEffect(()=>{if(!t||typeof window>"u")return;const p=window.matchMedia("(prefers-reduced-motion: reduce)"),P=()=>b(p.matches);return P(),p.addEventListener("change",P),()=>p.removeEventListener("change",P)},[t]);const v=(p,P=!1)=>{const R={currentTime:p.currentTime,duration:p.duration,bufferedFraction:Xe(p)},C=m.current,K=k?.5:.25,q=Math.abs(R.currentTime-C.currentTime)>=K||Math.abs(R.duration-C.duration)>=.01||Math.abs(R.bufferedFraction-C.bufferedFraction)>=.01;!P&&!q||(m.current=R,s({type:"MEDIA_TIME_UPDATE",payload:R}))};return f.useEffect(()=>{const p=i.current;p&&(p.volume=u.volume,p.muted=u.muted)},[i,u.volume,u.muted]),f.useEffect(()=>{const p=i.current;if(p){if(!c){p.removeAttribute("src"),m.current={currentTime:-1,duration:-1,bufferedFraction:-1},y.current!==""&&s({type:"MEDIA_SOURCE_CLEARED"}),y.current="";return}p.getAttribute("src")!==c&&(p.src=c,p.load(),m.current={currentTime:-1,duration:-1,bufferedFraction:-1}),y.current=c}},[i,s,u.currentIndex,u.tracks,c]),f.useEffect(()=>{const p=i.current;p&&(p.playbackRate=u.playbackRate)},[i,u.playbackRate,c]),o.jsx("audio",{"data-ginger-component":"Player",ref:i,className:e,style:r,preload:n,crossOrigin:a,controls:!1,playsInline:!0,onTimeUpdate:p=>{v(p.currentTarget)},onLoadedMetadata:p=>{const P=p.currentTarget;m.current={currentTime:-1,duration:-1,bufferedFraction:-1},s({type:"MEDIA_LOADED_METADATA",payload:{duration:P.duration,bufferedFraction:Xe(P)}})},onSeeking:p=>v(p.currentTarget,!0),onSeeked:p=>v(p.currentTarget,!0),onEnded:()=>l(),onPlay:()=>s({type:"MEDIA_PLAY"}),onPause:()=>s({type:"MEDIA_PAUSE"}),onWaiting:()=>s({type:"MEDIA_WAITING"}),onCanPlay:()=>s({type:"MEDIA_CANPLAY"}),onProgress:p=>v(p.currentTarget,!0),onVolumeChange:p=>{const P=p.currentTarget;s({type:"MEDIA_VOLUME_SYNC",payload:{volume:P.volume,muted:P.muted}})},onError:()=>{var C;const p=i.current,P=(C=p==null?void 0:p.error)==null?void 0:C.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 H={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?{...H,...e,repeat:{...H.repeat,...e.repeat}}:H}const Je=f.createContext(H);function Xr({locale:e,children:r}){const n=Wr(e);return o.jsx(Je.Provider,{value:n,children:r})}function I(){return f.useContext(Je)}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 E(e,r){return r<=0?0:Math.max(0,Math.min(r-1,e))}function Ze(e,r){if(e.length<=1)return[...e];const n=e[r];if(!n)return[...e];const a=e.filter((t,i)=>i!==r);for(let t=a.length-1;t>0;t--){const i=Math.floor(Math.random()*(t+1));[a[t],a[i]]=[a[i],a[t]]}return[n,...a]}function W(e){return e?e.id!=null&&e.id!==""?`id:${e.id}`:`file:${e.fileUrl}`:""}function Kr(e,r){var s,u;if(!r)return 0;const n=e.findIndex(l=>l===r);if(n!==-1)return n;const a=W(r);if(!a)return 0;const t=[];for(let l=0;l<e.length;l+=1)W(e[l])===a&&t.push(l);if(t.length===0)return 0;if(t.length===1)return t[0];const i=typeof globalThis<"u"&&"process"in globalThis?(u=(s=globalThis.process)==null?void 0:s.env)==null?void 0:u.NODE_ENV:void 0;return i!=null&&i!=="production"&&console.warn("[@lucaismyname/ginger] Ambiguous track identity: multiple queue rows share the same fileUrl without a unique `id`. Resolving to the first match."),t[0]}function er(e,r,n){const a=[...e],t=Math.max(0,Math.min(a.length,n??a.length));return a.splice(t,0,r),a}function qr(e,r){if(r<0||r>=e.length)return[...e];const n=[...e];return n.splice(r,1),n}function Jr(e,r,n){if(r===n||r<0||r>=e.length||n<0||n>=e.length)return[...e];const a=[...e],[t]=a.splice(r,1);return t?(a.splice(n,0,t),a):[...e]}function Zr(e,r,n){return er(e,n,Math.max(0,Math.min(e.length,r+1)))}function en(e){const{tracks:r,currentIndex:n,repeatMode:a,playbackMode:t}=e,i=r.length;return i===0?{kind:"stop",nextIndex:0}:a==="one"?{kind:"replay_same"}:t==="single"?{kind:"stop",nextIndex:E(n,i)}:n<i-1?{kind:"advance",nextIndex:n+1}:a==="all"?{kind:"wrap",nextIndex:0}:{kind:"stop",nextIndex:E(n,i)}}function rr(e){const{tracks:r,currentIndex:n,repeatMode:a,playbackMode:t}=e,i=r.length;return i===0?0:t==="single"?E(n,i):n<i-1?n+1:a==="all"?0:E(n,i)}function rn(e){const{tracks:r,currentIndex:n,repeatMode:a,playbackMode:t}=e,i=r.length;return i===0?0:t==="single"?E(n,i):n>0?n-1:a==="all"?i-1:0}function nn(e){return e==="off"?"all":e==="all"?"one":"off"}function nr(e,r){return(e==null?void 0:e.artworkUrl)??r??void 0}function tn(e,r){return(e==null?void 0:e.album)??r??void 0}function w(e){return e.tracks[e.currentIndex]??null}function je(e){return e.errorMessage?"error":e.tracks.length===0?"idle":e.isBuffering?"loading":e.isPaused?Number.isFinite(e.duration)&&e.duration>0&&e.currentTime>=e.duration-.05?"ended":"paused":"playing"}function Y(e){var a;const r=e.duration;if(Number.isFinite(r)&&r>0)return r;const n=(a=e.tracks[e.currentIndex])==null?void 0:a.durationSeconds;return typeof n=="number"&&Number.isFinite(n)&&n>0?n:0}function tr(e){const n=Y(e)-e.currentTime;return Number.isFinite(n)?Math.max(0,n):0}function Ge(e){const r=Y(e);return r>0?Math.min(1,Math.max(0,e.currentTime/r)):0}function ar(e){var n;const r=w(e);return nr(r,(n=e.playlistMeta)==null?void 0:n.artworkUrl)}function ir(e){var n;const r=w(e);return tn(r,(n=e.playlistMeta)==null?void 0:n.subtitle)}function or(){const e=h.useGingerPlayback(),r=h.useGingerMedia(),n=I(),a=f.useMemo(()=>h.gingerStateFromContextValues(e,r),[e,r]),t=Y(a),i=t>0?a.currentTime:0,s=Number.isFinite(i)?i:0,u=t>0?`${z(s)} of ${z(t)}`:z(s),l=c=>{r.seek(Number(c.currentTarget.value))};return{state:a,value:s,min:0,max:t>0?t:1,step:"any",ariaValueText:u,ariaLabel:n.seek,onSeekInput:l,onSeekChange:l}}function sr(){const e=h.useGingerPlayback(),r=h.useGingerMedia(),n=I(),a=f.useMemo(()=>h.gingerStateFromContextValues(e,r),[e,r]),t=i=>{r.setVolume(Number(i.currentTarget.value))};return{state:a,value:a.volume,min:0,max:1,step:"any",ariaValueText:`${Math.round(a.volume*100)}%`,ariaLabel:n.volume,onVolumeInput:t,onVolumeChange:t}}function ur(e){const r=h.useGingerPlayback(),n=I(),a=(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?a:t}}function A(e){const{className:r,width:n,height:a,viewBox:t,fill:i,stroke:s,strokeWidth:u,strokeLinecap:l,strokeLinejoin:c,children:m,...y}=e;return o.jsx("svg",{"data-ginger-component":"Wrapper",xmlns:"http://www.w3.org/2000/svg",width:n??24,height:a??24,viewBox:t??"0 0 24 24",fill:"none",stroke:s??"currentColor",strokeWidth:u??2,strokeLinecap:l??"round",strokeLinejoin:c??"round",className:r,"aria-hidden":!0,role:"presentation",...y,children:m})}function Ce(){return o.jsx(A,{children:o.jsx("path",{"data-ginger-component":"Pause",d:"M6 4h4v16H6zM14 4h4v16h-4z"})})}function Le(){return o.jsx(A,{children:o.jsx("path",{"data-ginger-component":"Play",d:"M5 3L19 12 5 21 5 3z"})})}function Ie(){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 we({mode:e}){return e==="one"?o.jsxs(A,{children:[o.jsx(Ie,{}),o.jsx("path",{"data-ginger-component":"RepeatGlyph",d:"M11 10h1v4"})]}):e==="all"?o.jsx(A,{children:o.jsx(Ie,{})}):o.jsxs(A,{children:[o.jsx(Ie,{}),o.jsx("line",{"data-ginger-component":"RepeatGlyph",x1:"3",x2:"21",y1:"3",y2:"21"})]})}function Ne(){return o.jsxs(A,{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 _e(){return o.jsxs(A,{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 De(){return o.jsxs(A,{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 Fe(){return o.jsxs(A,{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 Ue(){return o.jsxs(A,{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 cr({playLabel:e="Play",pauseLabel:r="Pause",playAriaLabel:n,pauseAriaLabel:a,children:t,type:i="button",onClick:s,...u}){const l=I(),c=typeof e=="string"?e:l.play,m=typeof r=="string"?r:l.pause,y=ur({playAriaLabel:n??c,pauseAriaLabel:a??m});return o.jsx("button",{"data-ginger-component":"PlayPause",...u,type:i,"aria-label":y.ariaLabel,onClick:k=>{y.toggle(),s==null||s(k)},children:t??(y.isPaused?o.jsx(Le,{}):o.jsx(Ce,{}))})}cr.displayName="Ginger.Control.PlayPause";function lr({type:e="button",ariaLabel:r,onClick:n,children:a,...t}){const{repeatMode:i,cycleRepeat:s}=h.useGingerPlayback(),l=I().repeat[i];return o.jsx("button",{"data-ginger-component":"Repeat",...t,type:e,"aria-label":r??l,onClick:c=>{s(),n==null||n(c)},children:a??o.jsx(we,{mode:i})})}lr.displayName="Ginger.Control.Repeat";function dr({type:e="button",children:r,ariaLabel:n,onClick:a,...t}){const{next:i}=h.useGingerPlayback(),s=I();return o.jsx("button",{"data-ginger-component":"Next",...t,type:e,"aria-label":n??s.nextTrack,onClick:u=>{i(),a==null||a(u)},children:r??o.jsx(De,{})})}dr.displayName="Ginger.Control.Next";function fr({type:e="button",children:r,ariaLabel:n,onClick:a,...t}){const{prev:i}=h.useGingerPlayback(),s=I();return o.jsx("button",{"data-ginger-component":"Previous",...t,type:e,"aria-label":n??s.previousTrack,onClick:u=>{i(),a==null||a(u)},children:r??o.jsx(_e,{})})}fr.displayName="Ginger.Control.Previous";function gr({type:e="button",children:r,ariaLabel:n,onClick:a,...t}){const{isShuffled:i,toggleShuffle:s}=h.useGingerPlayback(),u=I();return o.jsx("button",{"data-ginger-component":"Shuffle",...t,type:e,"aria-pressed":i,"aria-label":n??u.shuffle,onClick:l=>{s(),a==null||a(l)},children:r??o.jsx(Ne,{})})}gr.displayName="Ginger.Control.Shuffle";function pr({inputStyle:e,style:r,unstyled:n=!1,ariaLabel:a,...t}){const i=or(),s=n?{...r,...e}:{width:"100%",...r,...e};return o.jsx("input",{"data-ginger-component":"SeekBar",...t,type:"range",min:i.min,max:i.max,step:i.step,value:i.value,"aria-label":a??i.ariaLabel,"aria-valuetext":i.ariaValueText,onInput:i.onSeekInput,onChange:i.onSeekChange,style:s})}pr.displayName="Ginger.Control.SeekBar";function mr({inputStyle:e,style:r,unstyled:n=!1,ariaLabel:a,...t}){const i=sr(),s=n?{...r,...e}:{width:"100%",...r,...e};return o.jsx("input",{"data-ginger-component":"Volume",...t,type:"range",min:i.min,max:i.max,step:i.step,value:i.value,"aria-label":a??i.ariaLabel,"aria-valuetext":i.ariaValueText,onInput:i.onVolumeInput,onChange:i.onVolumeChange,style:s})}mr.displayName="Ginger.Control.Volume";function yr({ariaLabel:e,muteLabel:r,unmuteLabel:n,type:a="button",onClick:t,children:i,...s}){const{muted:u,toggleMute:l}=h.useGingerMedia(),c=I();return o.jsx("button",{"data-ginger-component":"Mute",...s,type:a,"aria-pressed":u,"aria-label":e??(u?c.unmute:c.mute),onClick:m=>{l(),t==null||t(m)},children:i??(u?n??o.jsx(Ue,{}):r??o.jsx(Fe,{}))})}yr.displayName="Ginger.Control.Mute";const an=[.5,.75,1,1.25,1.5,2];function hr({rates:e=an,style:r,ariaLabel:n,children:a,...t}){const{playbackRate:i,setPlaybackRate:s}=h.useGingerMedia(),u=I(),l=f.useMemo(()=>Array.from(new Set([...e,i])).sort((c,m)=>c-m),[e,i]);return o.jsx("select",{"data-ginger-component":"PlaybackRate",...t,"aria-label":n??u.playbackSpeed,value:String(i),style:r,onChange:c=>s(Number(c.currentTarget.value)),children:a??l.map(c=>o.jsx("option",{value:String(c),children:c===1?u.playbackRateNormal:u.playbackRateTimes(c)},c))})}hr.displayName="Ginger.Control.PlaybackRate";function V(e,r){function n(a){const t=h.useGingerState(),s=(r(t)??"").trim(),{className:u,style:l,fallback:c,empty:m,children:y}=a;if(!s){const k=m??c??null;return k?o.jsx("span",{className:u,style:l,children:k}):null}return y?o.jsx("span",{className:u,style:l,children:y(s,t)}):o.jsx("span",{className:u,style:l,children:s})}return n.displayName=e,n}function B(e,r){return V(e,n=>r(w(n)))}const on=B("Ginger.Current.Title",e=>e==null?void 0:e.title),sn=B("Ginger.Current.Artist",e=>e==null?void 0:e.artist),un=V("Ginger.Current.Album",e=>ir(e)),cn=B("Ginger.Current.Description",e=>e==null?void 0:e.description),ln=V("Ginger.Current.Copyright",e=>{var n;const r=w(e);return(r==null?void 0:r.copyright)??((n=e.playlistMeta)==null?void 0:n.copyright)}),dn=B("Ginger.Current.Genre",e=>e==null?void 0:e.genre),fn=B("Ginger.Current.Label",e=>e==null?void 0:e.label),gn=B("Ginger.Current.Isrc",e=>e==null?void 0:e.isrc),pn=B("Ginger.Current.TrackNumber",e=>(e==null?void 0:e.trackNumber)!=null?String(e.trackNumber):void 0);function xr({className:e,style:r,fallback:n,empty:a,children:t,format:i}){var c;const s=h.useGingerState(),u=(c=w(s))==null?void 0:c.year;if(typeof u!="number"||!Number.isFinite(u)){const m=a??n??null;return m?o.jsx("span",{"data-ginger-component":"Year",className:e,style:r,children:m}):null}const l=i?i(u):String(u);return t?o.jsx("span",{"data-ginger-component":"Year",className:e,style:r,children:t(l,s)}):o.jsx("span",{"data-ginger-component":"Year",className:e,style:r,children:l})}xr.displayName="Ginger.Current.Year";function br({className:e,style:r,fallback:n,empty:a,children:t,preserveWhitespace:i=!0,unstyled:s=!1}){var y;const u=h.useGingerState(),l=((y=w(u))==null?void 0:y.lyrics)??"",c=i?l.replace(/^\s+|\s+$/g,""):l.trim();if(!c){const k=a??n??null;return k?o.jsx("span",{"data-ginger-component":"Lyrics",className:e,style:r,children:k}):null}const m=!s&&i?{whiteSpace:"pre-wrap"}:void 0;return t?o.jsx("span",{className:e,style:{...m,...r},children:t(c,u)}):o.jsx("span",{className:e,style:{...m,...r},children:c})}br.displayName="Ginger.Current.Lyrics";const Ke=/\[(\d{1,2}):(\d{2})(?:\.(\d{1,3}))?\]/g;function vr(e){const r=[];for(const n of e.split(/\r?\n/)){const a=[...n.matchAll(Ke)];if(a.length===0)continue;const t=n.replace(Ke,"").trim();for(const i of a){const s=Number(i[1]??0),u=Number(i[2]??0),l=Number((i[3]??"0").padEnd(3,"0")),c=s*60+u+l/1e3;Number.isFinite(c)&&c>=0&&r.push({time:c,text:t})}}return r.sort((n,a)=>n.time-a.time)}function kr(){const{tracks:e,currentIndex:r}=h.useGingerPlayback(),{currentTime:n}=h.useGingerMedia(),a=e[r],t=f.useMemo(()=>a?Array.isArray(a.lyricsTimed)&&a.lyricsTimed.length>0?[...a.lyricsTimed].filter(s=>Number.isFinite(s.time)&&s.time>=0).sort((s,u)=>s.time-u.time):typeof a.lyrics=="string"?vr(a.lyrics):[]:[],[a]),i=f.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:i,activeLine:i>=0?t[i]??null:null}}function Ve({className:e,style:r,fallback:n,empty:a,unstyled:t=!1,activeClassName:i,lineClassName:s,children:u}){const l=h.useGingerState(),c=I(),{lines:m,activeIndex:y}=kr();if(m.length===0){const b=a??n??null;return b?o.jsx("span",{"data-ginger-component":"LyricsSynced",className:e,style:r,children:b}):null}const k=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:{...k,...r},"aria-label":c.syncedLyricsList,children:m.map((b,v)=>{const S=v===y;return o.jsx("li",{"aria-current":S?"true":void 0,"data-ginger-active":S||void 0,className:[s,S?i:void 0].filter(Boolean).join(" ")||void 0,style:t?void 0:{padding:"var(--ginger-playlist-row-padding, 4px 8px)",fontWeight:S?600:400,opacity:S?1:.75},children:u?u(b,v,S,l):b.text},`${b.time}-${v}`)})})}Ve.displayName="Ginger.Current.LyricsSynced";function Mr(){const{tracks:e,currentIndex:r}=h.useGingerPlayback(),{currentTime:n,seek:a}=h.useGingerMedia(),t=f.useMemo(()=>{var u;return[...((u=e[r])==null?void 0:u.chapters)??[]].filter(l=>l&&Number.isFinite(l.startSeconds)&&l.startSeconds>=0).sort((l,c)=>l.startSeconds-c.startSeconds)},[r,e]),i=f.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:i,active:i>=0?t[i]??null:null,seekTo:s=>{const u=t[s];u&&a(u.startSeconds)}}}function Be({className:e,style:r,fallback:n,empty:a,unstyled:t=!1,formatStart:i=z,children:s}){const u=h.useGingerState(),l=I(),{list:c,activeIndex:m,seekTo:y}=Mr();if(c.length===0){const b=a??n??null;return b?o.jsx("span",{"data-ginger-component":"Chapters",className:e,style:r,children:b}):null}const k=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:{...k,...r},"aria-label":l.chaptersList,children:c.map((b,v)=>{const S=v===m;return o.jsx("li",{children:o.jsx("button",{type:"button","aria-current":S?"true":void 0,"data-ginger-active":S||void 0,onClick:()=>y(v),style:{width:t?void 0:"100%",textAlign:t?void 0:"left",border:t?void 0:"none",background:t?void 0:S?"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(b,v,S,u):t?o.jsxs(o.Fragment,{children:[i(b.startSeconds)," ",b.title]}):o.jsxs("span",{children:[o.jsx("span",{style:{opacity:.75,marginRight:"0.35em"},children:i(b.startSeconds)}),b.title]})})},`${b.startSeconds}-${b.title}`)})})}Be.displayName="Ginger.Current.Chapters";function Tr({visible:e=!1,className:r,style:n,fallback:a,empty:t,children:i}){var l;const s=h.useGingerState();if(!e)return null;const u=((l=w(s))==null?void 0:l.fileUrl)??"";if(!u){const c=t??a??null;return c?o.jsx("span",{className:r,style:n,children:c}):null}return i?o.jsx("span",{"data-ginger-component":"FileUrl",className:r,style:n,children:i(u,s)}):o.jsx("span",{className:r,style:n,children:u})}Tr.displayName="Ginger.Current.FileUrl";function Sr({className:e,style:r,fallback:n,empty:a,sizes:t,loading:i,onError:s,decoding:u,unstyled:l=!1,imgStyle:c}){const m=h.useGingerState(),y=w(m),k=ar(m);if(!k){const v=a??n??null;return v?o.jsx("span",{className:e,style:r,children:v}):null}const b=[y==null?void 0:y.title,y==null?void 0:y.artist].filter(Boolean).join(" — ")||"Artwork";return o.jsx("div",{"data-ginger-component":"Artwork",className:e,style:l?{...r}:{background:"var(--ginger-artwork-bg, transparent)",borderRadius:"var(--ginger-artwork-radius, 0)",overflow:"hidden",...r},children:o.jsx("img",{src:k,alt:b,sizes:t,loading:i,decoding:u,onError:s,style:{display:l?void 0:"block",width:l?void 0:"100%",height:l?void 0:"100%",objectFit:l?void 0:"cover",...c}})})}Sr.displayName="Ginger.Current.Artwork";function Pr({base:e=0,className:r,style:n,fallback:a,empty:t,children:i}){const s=h.useGingerState();if(s.tracks.length===0){const c=t??a??null;return c?o.jsx("span",{"data-ginger-component":"QueueIndex",className:r,style:n,children:c}):null}const l=String(s.currentIndex+e);return i?o.jsx("span",{"data-ginger-component":"QueueIndex",className:r,style:n,children:i(l,s)}):o.jsx("span",{"data-ginger-component":"QueueIndex",className:r,style:n,children:l})}Pr.displayName="Ginger.Current.QueueIndex";function Er({className:e,style:r,fallback:n,empty:a,children:t}){const i=h.useGingerState(),s=String(i.tracks.length);if(i.tracks.length===0){const u=a??n??null;return u?o.jsx("span",{className:e,style:r,children:u}):null}return t?o.jsx("span",{"data-ginger-component":"QueueLength",className:e,style:r,children:t(s,i)}):o.jsx("span",{"data-ginger-component":"QueueLength",className:e,style:r,children:s})}Er.displayName="Ginger.Current.QueueLength";function Ir({base:e=0,separator:r=" / ",className:n,style:a,fallback:t,empty:i,children:s}){const u=h.useGingerState(),l=u.tracks.length;if(l===0){const k=i??t??null;return k?o.jsx("span",{className:n,style:a,children:k}):null}const c=String(u.currentIndex+e),m=String(l),y=`${c}${r}${m}`;return s?o.jsx("span",{"data-ginger-component":"QueuePosition",className:n,style:a,children:s({index:c,length:m,label:y},u)}):o.jsx("span",{"data-ginger-component":"QueuePosition",className:n,style:a,children:y})}Ir.displayName="Ginger.Current.QueuePosition";function $e(e,r,n){const{className:a,style:t,fallback:i,empty:s,children:u,format:l=z}=n;if(!(e>=0)||!Number.isFinite(e)){const m=s??i??null;return m?o.jsx("span",{"data-ginger-component":"TimeText",className:a,style:t,children:m}):null}const c=l(e);return u?o.jsx("span",{"data-ginger-component":"TimeText",className:a,style:t,children:u(c,r)}):o.jsx("span",{"data-ginger-component":"TimeText",className:a,style:t,children:c})}function Ar(e){const r=h.useGingerState();return $e(r.currentTime,r,e)}Ar.displayName="Ginger.Current.Elapsed";function Rr(e){const r=h.useGingerState();return $e(Y(r),r,e)}Rr.displayName="Ginger.Current.Duration";function jr(e){const r=h.useGingerState();return $e(tr(r),r,e)}jr.displayName="Ginger.Current.Remaining";function Gr({className:e,style:r,fallback:n,empty:a,children:t}){const i=h.useGingerState(),s=Y(i),u=Ge(i);if(!(s>0)){const l=a??n??null;return l?o.jsx("span",{"data-ginger-component":"Progress",className:e,style:r,children:l}):null}return t?o.jsx("span",{"data-ginger-component":"Progress",className:e,style:r,children:t({fraction:u,currentTime:i.currentTime,duration:s},i)}):o.jsx("span",{"data-ginger-component":"Progress",className:e,style:r,children:`${Math.round(u*100)}%`})}Gr.displayName="Ginger.Current.Progress";function Cr({className:e,style:r,height:n=4,showBuffered:a=!1,unstyled:t=!1}){const i=h.useGingerState(),s=`${Math.round(Ge(i)*100)}%`,u=`${Math.round(Math.min(1,Math.max(0,i.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:[a?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:u,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)"}})]})}Cr.displayName="Ginger.Current.TimeRail";function Lr({className:e,style:r,height:n=4,unstyled:a=!1}){const t=h.useGingerState(),i=`${Math.round(Math.min(1,Math.max(0,t.bufferedFraction))*100)}%`;return o.jsx("div",{"data-ginger-component":"BufferRail",className:e,style:a?{...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:i,height:a?void 0:"100%",background:a?void 0:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}})})}Lr.displayName="Ginger.Current.BufferRail";function wr({className:e,style:r,fallback:n,empty:a,children:t}){const i=h.useGingerState(),s=je(i);return t?o.jsx("span",{"data-ginger-component":"PlaybackState",className:e,style:r,children:t(s,i)}):o.jsx("span",{"data-ginger-component":"PlaybackState",className:e,style:r,children:s})}wr.displayName="Ginger.Current.PlaybackState";function Nr({className:e,style:r,fallback:n,empty:a,live:t="polite",children:i}){const s=h.useGingerState(),u=s.errorMessage??"";if(!u){const l=a??n??null;return l?o.jsx("span",{"data-ginger-component":"ErrorMessage",className:e,style:r,children:l}):null}return i?o.jsx("span",{"data-ginger-component":"ErrorMessage",className:e,style:r,"aria-live":t,children:i(u,s)}):o.jsx("span",{"data-ginger-component":"ErrorMessage",className:e,style:r,"aria-live":t,children:u})}Nr.displayName="Ginger.Current.ErrorMessage";const Re=f.createContext(null);function mn(){const e=f.useContext(Re);if(!e)throw new Error("Ginger.Playlist.Track must be used inside <Ginger.Playlist>");return e}function _r({children:e,unstyled:r=!1,rowStyle:n,renderTrack:a,playOnSelect:t=!0,style:i,...s}){const{tracks:u,currentIndex:l,playTrackAt:c,selectTrackAt:m}=h.useGingerPlayback(),y=r?{...i}:{listStyle:"none",margin:0,padding:0,fontFamily:"var(--ginger-font-family, system-ui, sans-serif)",fontSize:"var(--ginger-font-size, 14px)",color:"var(--ginger-primary-color, #111827)",...i};return e!==void 0?o.jsx(Re.Provider,{value:{playOnSelect:t},children:o.jsx("ul",{style:y,...s,children:e})}):o.jsx(Re.Provider,{value:{playOnSelect:t},children:o.jsx("ul",{"data-ginger-component":"Playlist",style:y,...s,children:u.map((b,v)=>{const S=v===l;return o.jsx("li",{children:o.jsx("button",{type:"button",onClick:()=>{t?c(v):m(v)},style:{width:r?void 0:"100%",textAlign:r?void 0:"left",border:r?void 0:"none",background:r?void 0:S?"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:a?a(b,v,S):o.jsxs("span",{children:[b.title,b.artist?` — ${b.artist}`:""]})})},`${v}-${W(b)}`)})})})}_r.displayName="Ginger.Playlist";function Dr({index:e,unstyled:r=!1,className:n,style:a,children:t,liProps:i,onClick:s,...u}){const{playOnSelect:l}=mn(),{tracks:c,currentIndex:m,playTrackAt:y,selectTrackAt:k}=h.useGingerPlayback(),b=e===m,v=c[e],S=v!=null?o.jsxs("span",{children:[v.title,v.artist?` — ${v.artist}`:""]}):null;return o.jsx("li",{...i,children:o.jsx("button",{type:"button","aria-current":b?"true":void 0,"data-ginger-active":b||void 0,className:n,style:{width:r?void 0:"100%",textAlign:r?void 0:"left",border:r?void 0:"none",background:r?void 0:b?"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)",...a},...u,onClick:p=>{s==null||s(p),!p.defaultPrevented&&(l?y(e):k(e))},children:t??S})})}Dr.displayName="Ginger.Playlist.Track";const yn=Object.assign(_r,{Track:Dr}),hn=V("Ginger.Queue.Title",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.title}),xn=V("Ginger.Queue.Subtitle",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.subtitle}),bn=V("Ginger.Queue.Description",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.description}),vn=V("Ginger.Queue.Copyright",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.copyright});function Fr({className:e,style:r,fallback:n,empty:a,unstyled:t=!1,imgStyle:i}){var c,m;const s=h.useGingerState(),u=(c=s.playlistMeta)==null?void 0:c.artworkUrl;if(!u){const y=a??n??null;return y?o.jsx("span",{className:e,style:r,children:y}):null}const l=((m=s.playlistMeta)==null?void 0:m.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:u,alt:l,style:{display:t?void 0:"block",width:t?void 0:"100%",height:t?void 0:"100%",objectFit:t?void 0:"cover",...i}})})}Fr.displayName="Ginger.Queue.Artwork";function X(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):1}function Se(e){return Number.isFinite(e)?Math.min(4,Math.max(.25,e)):1}const F={currentTime:0,duration:0,bufferedFraction:0,isBuffering:!1,errorMessage:null},kn={...F,volume:1,muted:!1,playbackRate:1};function Ur(e){const r=[...e.tracks];let n=E(e.currentIndex??0,r.length),a=null,t=r;return e.isShuffled&&r.length>1&&(a=[...r],t=Ze(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:a,playlistMeta:e.playlistMeta??null,...kn,volume:X(e.volume??1),muted:e.muted??!1,playbackRate:Se(e.playbackRate??1)}}function Mn(e,r){switch(r.type){case"INIT":{const{tracks:n,currentIndex:a,playlistMeta:t,isPaused:i,isShuffled:s,repeatMode:u,playbackMode:l,volume:c,muted:m,playbackRate:y}=r.payload;return Ur({tracks:n,currentIndex:a,playlistMeta:t??null,isPaused:i??!0,isShuffled:s??!1,repeatMode:u??"off",playbackMode:l??"playlist",volume:c,muted:m,playbackRate:y})}case"SET_QUEUE":{const{tracks:n,currentIndex:a}=r.payload,t=[...n],i=E(a??e.currentIndex,t.length);return{...e,tracks:t,currentIndex:i,isShuffled:!1,originalTracks:null,...F}}case"INSERT_TRACK":{const n=r.payload.index??e.tracks.length,a=er(e.tracks,r.payload.track,n);if(r.payload.autoPlay){const i=E(n,a.length);return{...e,tracks:a,currentIndex:i,isShuffled:!1,originalTracks:null,isPaused:!1,...F}}const t=n<=e.currentIndex?e.currentIndex+1:e.currentIndex;return{...e,tracks:a,isShuffled:!1,originalTracks:null,currentIndex:E(t,a.length)}}case"REMOVE_TRACK":{const n=r.payload.index,a=qr(e.tracks,n),t=n<e.currentIndex?e.currentIndex-1:n===e.currentIndex?Math.min(e.currentIndex,Math.max(0,a.length-1)):e.currentIndex;return{...e,tracks:a,isShuffled:!1,originalTracks:null,currentIndex:E(t,a.length),...n===e.currentIndex?F:{}}}case"MOVE_TRACK":{const{fromIndex:n,toIndex:a}=r.payload,t=Jr(e.tracks,n,a);let i=e.currentIndex;return e.currentIndex===n?i=a:n<e.currentIndex&&a>=e.currentIndex?i-=1:n>e.currentIndex&&a<=e.currentIndex&&(i+=1),{...e,tracks:t,isShuffled:!1,originalTracks:null,currentIndex:E(i,t.length)}}case"ADD_NEXT":{const n=Zr(e.tracks,e.currentIndex,r.payload.track);return{...e,tracks:n,isShuffled:!1,originalTracks:null}}case"SET_INDEX":{const n=E(r.payload.index,e.tracks.length),a=r.payload.autoPlay,t=a===!0?!1:a===!1?!0:e.isPaused;return{...e,currentIndex:n,...F,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:nn(e.repeatMode)};case"TOGGLE_SHUFFLE":{if(e.tracks.length<=1)return{...e,isShuffled:!1,originalTracks:null};if(!e.isShuffled){const i=[...e.tracks],s=Ze(i,e.currentIndex);return{...e,isShuffled:!0,originalTracks:i,tracks:s,currentIndex:0}}const n=e.originalTracks?[...e.originalTracks]:[...e.tracks],a=e.tracks[e.currentIndex],t=Kr(n,a);return{...e,isShuffled:!1,originalTracks:null,tracks:n,currentIndex:E(t,n.length)}}case"NEXT":{const n=rr(e),a=n===e.currentIndex;return{...e,currentIndex:n,...a?{}:F,isPaused:a?e.isPaused:!1}}case"PREV":{const n=rn(e),a=n===e.currentIndex;return{...e,currentIndex:n,...a?{}:F,isPaused:a?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,...F};case"SET_VOLUME":return{...e,volume:X(r.payload)};case"SET_MUTED":return{...e,muted:r.payload};case"TOGGLE_MUTE":return{...e,muted:!e.muted};case"SET_PLAYBACK_RATE":return{...e,playbackRate:Se(r.payload)};case"MEDIA_VOLUME_SYNC":{const{volume:n,muted:a}=r.payload,t=X(n);return t===e.volume&&a===e.muted?e:{...e,volume:t,muted:a}}default:return e}}function Ae(){return typeof navigator>"u"||!("mediaSession"in navigator)?null:navigator.mediaSession}function Tn(e,r,n){var l;const a=r.tracks[r.currentIndex],t=a==null?void 0:a.title,i=a==null?void 0:a.artist,s=a==null?void 0:a.album,u=nr(a,(l=r.playlistMeta)==null?void 0:l.artworkUrl);f.useEffect(()=>{const c=Ae();!e||!c||(c.metadata=new MediaMetadata({title:t??"Unknown track",artist:i,album:s,artwork:u?[{src:u}]:void 0}))},[e,t,i,s,u]),f.useEffect(()=>{const c=Ae();!e||!c||(c.playbackState=r.isPaused?"paused":"playing")},[e,r.isPaused]),f.useEffect(()=>{const c=Ae();if(!(!e||!c)){try{c.setActionHandler("play",n.play),c.setActionHandler("pause",n.pause),c.setActionHandler("nexttrack",n.next),c.setActionHandler("previoustrack",n.prev),c.setActionHandler("seekto",m=>{typeof m.seekTime=="number"&&Number.isFinite(m.seekTime)&&n.seek(m.seekTime)})}catch{}return()=>{try{c.setActionHandler("play",null),c.setActionHandler("pause",null),c.setActionHandler("nexttrack",null),c.setActionHandler("previoustrack",null),c.setActionHandler("seekto",null)}catch{}}}},[e,n])}const Sn={"--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 Pn({children:e,initialTracks:r=[],initialIndex:n=0,initialPlaylistMeta:a=null,initialShuffle:t=!1,initialRepeatMode:i="off",initialPlaybackMode:s="playlist",initialPaused:u=!0,initialVolume:l=1,initialMuted:c=!1,initialPlaybackRate:m=1,initialStateKey:y,locale:k,mediaSession:b=!1,beforePlay:v,onPlayBlocked:S,persistence:p,hydrateOnMount:P=!1,resumeOnTrackChange:R=!1,unstyled:C=!1,asChild:K=!1,className:q,style:Pe,onTrackChange:J,onPlay:Z,onPause:ee,onQueueEnd:re,onError:ne}){var We;const U=f.useRef(null),[d,x]=f.useReducer(Mn,void 0,()=>Ur({tracks:r,currentIndex:n,playlistMeta:a,isPaused:u,isShuffled:t,repeatMode:i,playbackMode:s,volume:l,muted:c,playbackRate:m})),Oe=f.useRef(d),Ee=f.useRef({tracks:r,currentIndex:n,playlistMeta:a,isPaused:u,isShuffled:t,repeatMode:i,playbackMode:s,volume:l,muted:c,playbackRate:m});Ee.current={tracks:r,currentIndex:n,playlistMeta:a,isPaused:u,isShuffled:t,repeatMode:i,playbackMode:s,volume:l,muted:c,playbackRate:m};const Q=f.useRef(void 0);f.useEffect(()=>{if(y===void 0){Q.current=void 0;return}if(Q.current===void 0){Q.current=y;return}if(Q.current===y)return;Q.current=y;const g=Ee.current;x({type:"INIT",payload:{tracks:g.tracks,currentIndex:g.currentIndex,playlistMeta:g.playlistMeta,isPaused:g.isPaused,isShuffled:g.isShuffled,repeatMode:g.repeatMode,playbackMode:g.playbackMode,volume:g.volume,muted:g.muted,playbackRate:g.playbackRate}})},[y,x]),f.useEffect(()=>{Oe.current=d},[d]);const Ye=d.tracks[d.currentIndex]??null;f.useEffect(()=>{J==null||J(Ye,d.currentIndex)},[Ye,d.currentIndex,J]),f.useEffect(()=>{d.errorMessage&&(ne==null||ne(d.errorMessage))},[d.errorMessage,ne]);const te=f.useRef(void 0);f.useEffect(()=>{if(te.current===void 0){te.current=d.isPaused;return}te.current!==d.isPaused&&(d.isPaused?ee==null||ee():Z==null||Z()),te.current=d.isPaused},[d.isPaused,ee,Z]);const N=f.useCallback(()=>{x({type:"PLAY"})},[]),_=f.useCallback(()=>{var g;x({type:"PAUSE"}),(g=U.current)==null||g.pause()},[]),ae=f.useCallback(()=>{d.isPaused?N():_()},[_,N,d.isPaused]),D=f.useCallback(g=>{const M=U.current;M&&Number.isFinite(g)&&(M.currentTime=Math.max(0,g))},[]),ie=f.useCallback(g=>{x({type:"SET_VOLUME",payload:X(g)})},[]),oe=f.useCallback(g=>{x({type:"SET_MUTED",payload:g})},[]),se=f.useCallback(()=>{x({type:"TOGGLE_MUTE"})},[]),ue=f.useCallback(g=>{x({type:"SET_PLAYBACK_RATE",payload:Se(g)})},[]),$=f.useCallback(()=>{x({type:"NEXT"})},[]),O=f.useCallback(()=>{x({type:"PREV"})},[]),ce=f.useCallback(g=>{x({type:"SET_REPEAT",payload:g})},[]),le=f.useCallback(()=>{x({type:"CYCLE_REPEAT"})},[]),de=f.useCallback(()=>{x({type:"TOGGLE_SHUFFLE"})},[]),fe=f.useCallback((g,M)=>{x({type:"SET_QUEUE",payload:{tracks:g,currentIndex:M}})},[]),ge=f.useCallback((g,M,T)=>{x({type:"INSERT_TRACK",payload:{track:g,index:M,autoPlay:T}})},[]),pe=f.useCallback(g=>{x({type:"REMOVE_TRACK",payload:{index:g}})},[]),me=f.useCallback((g,M)=>{x({type:"MOVE_TRACK",payload:{fromIndex:g,toIndex:M}})},[]),ye=f.useCallback(g=>{x({type:"ADD_NEXT",payload:{track:g}})},[]),he=f.useCallback(g=>{x({type:"SET_INDEX",payload:{index:g,autoPlay:!0}})},[]),xe=f.useCallback(g=>{x({type:"SET_INDEX",payload:{index:g,autoPlay:!1}})},[]),be=f.useCallback(g=>{x({type:"SET_PLAYLIST_META",payload:g})},[]),ve=f.useCallback(g=>{x({type:"SET_PLAYBACK_MODE",payload:g})},[]),ke=f.useCallback(g=>{x({type:"INIT",payload:g})},[]);f.useEffect(()=>{if(!p||!P)return;const g=p.get("ginger:volume"),M=p.get("ginger:muted"),T=p.get("ginger:playbackRate"),L=p.get("ginger:repeatMode"),Te=p.get("ginger:currentIndex"),G=Ee.current;x({type:"INIT",payload:{tracks:G.tracks,playlistMeta:G.playlistMeta,isPaused:G.isPaused,isShuffled:G.isShuffled,playbackMode:G.playbackMode,currentIndex:typeof Te=="number"?Te:G.currentIndex,repeatMode:L==="off"||L==="all"||L==="one"?L:G.repeatMode,volume:typeof g=="number"?g:G.volume,muted:typeof M=="boolean"?M:G.muted,playbackRate:typeof T=="number"?T:G.playbackRate}})},[P,p]),f.useEffect(()=>{p&&(p.set("ginger:volume",d.volume),p.set("ginger:muted",d.muted),p.set("ginger:playbackRate",d.playbackRate),p.set("ginger:repeatMode",d.repeatMode),p.set("ginger:currentIndex",d.currentIndex))},[p,d.volume,d.muted,d.playbackRate,d.repeatMode,d.currentIndex]),f.useEffect(()=>{if(!p||!R)return;const g=d.tracks[d.currentIndex];if(!g)return;const M=`ginger:resume:${W(g)}`,T=p.get(M);typeof T=="number"&&Number.isFinite(T)&&D(T)},[p,R,d.currentIndex,d.tracks,D]),f.useEffect(()=>{if(!p||!R)return;const g=d.tracks[d.currentIndex];if(!g||!(d.currentTime>=0))return;const M=`ginger:resume:${W(g)}`,T=setTimeout(()=>p.set(M,d.currentTime),250);return()=>clearTimeout(T)},[p,R,d.currentIndex,d.tracks,d.currentTime]);const Vr=(We=d.tracks[d.currentIndex])==null?void 0:We.fileUrl;f.useEffect(()=>{const g=U.current;if(!g)return;if(d.isPaused){g.pause();return}let M=!1;return(async()=>{if(v){let T=!1;try{T=await v()}catch(L){const Te=L instanceof Error?L.message:"beforePlay rejected";x({type:"MEDIA_ERROR",payload:{message:Te}});return}if(!T){M||(x({type:"PAUSE"}),S==null||S());return}}M||g.play().catch(T=>{const L=T instanceof Error?T.message:typeof T=="string"?T:"Playback failed (e.g. autoplay blocked or unavailable source)";x({type:"MEDIA_ERROR",payload:{message:L}})})})(),()=>{M=!0}},[v,Vr,S,d.isPaused]);const Me=f.useCallback(()=>{const g=en(Oe.current);if(g.kind==="replay_same"){const T=U.current;T&&(T.currentTime=0),x({type:"PLAY"});return}if(g.kind==="stop"){x({type:"PAUSE"}),re==null||re();return}const M=g.nextIndex;x({type:"SET_INDEX",payload:{index:M,autoPlay:!0}})},[re]),Br=f.useMemo(()=>({play:N,pause:_,next:$,prev:O,seek:D}),[N,_,$,O,D]);Tn(!!b,d,Br);const Qe=k!=null&&k.seek&&/[\u0590-\u08FF]/.test(k.seek)?"rtl":"ltr",$r=f.useMemo(()=>({state:d,dispatch:x,audioRef:U,notifyEnded:Me,init:ke,play:N,pause:_,togglePlayPause:ae,seek:D,setVolume:ie,setMuted:oe,toggleMute:se,setPlaybackRate:ue,next:$,prev:O,setRepeatMode:ce,cycleRepeat:le,toggleShuffle:de,setQueue:fe,insertTrackAt:ge,removeTrackAt:pe,moveTrack:me,enqueueNext:ye,playTrackAt:he,selectTrackAt:xe,setPlaylistMeta:be,setPlaybackMode:ve}),[le,x,ke,$,Me,_,N,he,ge,pe,me,ye,xe,O,D,oe,ue,fe,ce,be,ve,ie,d,se,ae,de]),Or=f.useMemo(()=>({tracks:d.tracks,currentIndex:d.currentIndex,isPaused:d.isPaused,isShuffled:d.isShuffled,repeatMode:d.repeatMode,originalTracks:d.originalTracks,playlistMeta:d.playlistMeta,init:ke,play:N,pause:_,togglePlayPause:ae,next:$,prev:O,setRepeatMode:ce,cycleRepeat:le,toggleShuffle:de,playbackMode:d.playbackMode,setQueue:fe,insertTrackAt:ge,removeTrackAt:pe,moveTrack:me,enqueueNext:ye,playTrackAt:he,selectTrackAt:xe,setPlaylistMeta:be,setPlaybackMode:ve,dispatch:x}),[d.tracks,d.currentIndex,d.isPaused,d.isShuffled,d.repeatMode,d.playbackMode,d.originalTracks,d.playlistMeta,ke,N,_,ae,$,O,ce,le,de,fe,ge,pe,me,ye,he,xe,be,ve,x]),Yr=f.useMemo(()=>({currentTime:d.currentTime,duration:d.duration,bufferedFraction:d.bufferedFraction,isBuffering:d.isBuffering,errorMessage:d.errorMessage,volume:d.volume,muted:d.muted,playbackRate:d.playbackRate,seek:D,setVolume:ie,setMuted:oe,toggleMute:se,setPlaybackRate:ue,audioRef:U,notifyEnded:Me,dispatch:x}),[d.currentTime,d.duration,d.bufferedFraction,d.isBuffering,d.errorMessage,d.volume,d.muted,d.playbackRate,D,ie,oe,se,ue,U,Me,x]),He=je(d),ze=f.useMemo(()=>C?Pe:{...Sn,...Pe},[Pe,C]),j=f.useMemo(()=>({className:q,style:ze,"data-ginger-playback":He,dir:Qe}),[q,ze,He,Qe]),Qr=f.useMemo(()=>{if(!K)return o.jsx("div",{className:j.className,style:j.style,"data-ginger-playback":j["data-ginger-playback"],dir:j.dir,children:e});const g=f.Children.only(e);if(!f.isValidElement(g))throw new Error("Ginger.Provider asChild expects a single React element child.");const M=g,T=M.props.style;return f.cloneElement(M,{className:En(M.props.className,j.className),style:T&&typeof T=="object"?{...T,...j.style}:j.style,"data-ginger-playback":j["data-ginger-playback"],dir:j.dir})},[K,e,j]);return o.jsx(Xr,{locale:k,children:o.jsx(h.GingerPlaybackContext.Provider,{value:Or,children:o.jsx(h.GingerMediaContext.Provider,{value:Yr,children:o.jsx(qe.Provider,{value:$r,children:Qr})})})})}function En(e,r){const n=[e,r].filter(Boolean).join(" ");return n===""?void 0:n}const In={Provider:Pn,Player:zr,Current:{Title:on,Artist:sn,Album:un,Description:cn,Copyright:ln,Genre:dn,Label:fn,Isrc:gn,TrackNumber:pn,Year:xr,Lyrics:br,LyricsSynced:Ve,Chapters:Be,FileUrl:Tr,Artwork:Sr,QueueIndex:Pr,QueueLength:Er,QueuePosition:Ir,Elapsed:Ar,Duration:Rr,Remaining:jr,Progress:Gr,TimeRail:Cr,BufferRail:Lr,PlaybackState:wr,ErrorMessage:Nr},Queue:{Title:hn,Subtitle:xn,Description:bn,Copyright:vn,Artwork:Fr},Control:{PlayPause:cr,Repeat:lr,Next:dr,Previous:fr,Shuffle:gr,SeekBar:pr,Volume:mr,Mute:yr,PlaybackRate:hr},Icon:{Play:Le,Pause:Ce,SkipForward:De,SkipBack:_e,Shuffle:Ne,Volume2:Fe,VolumeX:Ue,RepeatGlyph:we,Wrapper:A},Playlist:yn};exports.Chapters=Be;exports.Ginger=In;exports.LyricsSynced=Ve;exports.Pause=Ce;exports.Play=Le;exports.RepeatGlyph=we;exports.ShuffleIcon=Ne;exports.SkipBack=_e;exports.SkipForward=De;exports.Volume2=Fe;exports.VolumeX=Ue;exports.Wrapper=A;exports.clampPlaybackRate=Se;exports.clampVolume=X;exports.computeNextIndex=rr;exports.defaultGingerLocale=H;exports.derivePlaybackUiState=je;exports.effectiveDuration=Y;exports.effectiveRemaining=tr;exports.getCurrentTrack=w;exports.parseLrc=vr;exports.progressFraction=Ge;exports.resolvedAlbumLine=ir;exports.resolvedArtwork=ar;exports.useGingerChapters=Mr;exports.useGingerLocale=I;exports.useGingerLyricsSync=kr;exports.usePlayPauseBinding=ur;exports.useSeekBarBinding=or;exports.useVolumeSlider=sr;
|
|
2
|
-
//# sourceMappingURL=ginger-B26HM2Ja.cjs.map
|