@lucaismyname/ginger 0.0.8 → 0.0.10
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 +99 -0
- package/dist/GingerSplitContexts-4YZ-OJ9V.js +63 -0
- package/dist/GingerSplitContexts-4YZ-OJ9V.js.map +1 -0
- package/dist/GingerSplitContexts-Bze1Bqe2.cjs +2 -0
- package/dist/GingerSplitContexts-Bze1Bqe2.cjs.map +1 -0
- package/dist/audio/GingerPlayer.d.ts +2 -1
- package/dist/audio/GingerPlayer.d.ts.map +1 -1
- package/dist/client.cjs +2 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +28 -0
- package/dist/client.js.map +1 -0
- package/dist/components/current/Playback.d.ts +2 -1
- package/dist/components/current/Playback.d.ts.map +1 -1
- package/dist/context/GingerContext.d.ts +4 -0
- package/dist/context/GingerContext.d.ts.map +1 -1
- package/dist/context/GingerProvider.d.ts +1 -1
- package/dist/context/GingerProvider.d.ts.map +1 -1
- package/dist/context/GingerSplitContexts.d.ts +4 -0
- package/dist/context/GingerSplitContexts.d.ts.map +1 -1
- package/dist/core/playbackReducer.d.ts +1 -0
- package/dist/core/playbackReducer.d.ts.map +1 -1
- package/dist/core/queue.d.ts +4 -0
- package/dist/core/queue.d.ts.map +1 -1
- package/dist/core/transitions.d.ts.map +1 -1
- package/dist/experimental-gapless/index.cjs +2 -0
- package/dist/experimental-gapless/index.cjs.map +1 -0
- package/dist/experimental-gapless/index.d.ts +11 -0
- package/dist/experimental-gapless/index.d.ts.map +1 -0
- package/dist/experimental-gapless/index.js +17 -0
- package/dist/experimental-gapless/index.js.map +1 -0
- package/dist/ginger-B5wfhrC8.cjs +2 -0
- package/dist/ginger-B5wfhrC8.cjs.map +1 -0
- package/dist/ginger-Cg2cLsA6.js +1547 -0
- package/dist/ginger-Cg2cLsA6.js.map +1 -0
- package/dist/hooks/useGinger.d.ts +4 -0
- package/dist/hooks/useGinger.d.ts.map +1 -1
- package/dist/hooks/useGingerChapters.d.ts +12 -0
- package/dist/hooks/useGingerChapters.d.ts.map +1 -0
- package/dist/hooks/useGingerDebugLog.d.ts +2 -0
- package/dist/hooks/useGingerDebugLog.d.ts.map +1 -0
- package/dist/hooks/useGingerKeyboardShortcuts.d.ts +8 -0
- package/dist/hooks/useGingerKeyboardShortcuts.d.ts.map +1 -0
- package/dist/hooks/useGingerLyricsSync.d.ts +8 -0
- package/dist/hooks/useGingerLyricsSync.d.ts.map +1 -0
- package/dist/hooks/useGingerSleepTimer.d.ts +9 -0
- package/dist/hooks/useGingerSleepTimer.d.ts.map +1 -0
- package/dist/hooks/useSeekDrag.d.ts +8 -0
- package/dist/hooks/useSeekDrag.d.ts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +13 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -1414
- package/dist/index.js.map +1 -1
- package/dist/internal/lyrics.d.ts +6 -0
- package/dist/internal/lyrics.d.ts.map +1 -0
- package/dist/internal/lyrics.test.d.ts +2 -0
- package/dist/internal/lyrics.test.d.ts.map +1 -0
- package/dist/media/useMediaSession.d.ts +10 -0
- package/dist/media/useMediaSession.d.ts.map +1 -0
- package/dist/testing/index.cjs +91 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +11076 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types.d.ts +45 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/useSeekDrag-B0l3F1fL.js +174 -0
- package/dist/useSeekDrag-B0l3F1fL.js.map +1 -0
- package/dist/useSeekDrag-DmVvk2Pc.cjs +2 -0
- package/dist/useSeekDrag-DmVvk2Pc.cjs.map +1 -0
- package/dist/waveform/index.cjs +2 -0
- package/dist/waveform/index.cjs.map +1 -0
- package/dist/waveform/index.d.ts +3 -0
- package/dist/waveform/index.d.ts.map +1 -0
- package/dist/waveform/index.js +40 -0
- package/dist/waveform/index.js.map +1 -0
- package/dist/waveform/useAudioPeaks.d.ts +7 -0
- package/dist/waveform/useAudioPeaks.d.ts.map +1 -0
- package/package.json +23 -2
package/README.md
CHANGED
|
@@ -697,6 +697,105 @@ Cross-origin audio must be served with compatible CORS headers. If you need the
|
|
|
697
697
|
|
|
698
698
|
If the browser blocks playback (autoplay policy) or `HTMLMediaElement.play()` rejects for another reason, the player dispatches a media error with a short message. **`onError`** still runs (from `errorMessage` in state), and **`Ginger.Current.ErrorMessage`** shows the same string. Associate controls with a visible label using the `id` on `Ginger.Control.SeekBar` and a `<label htmlFor="…">` in your UI.
|
|
699
699
|
|
|
700
|
+
## New Optional Features
|
|
701
|
+
|
|
702
|
+
All additions below are opt-in and preserve existing behavior by default.
|
|
703
|
+
|
|
704
|
+
### Media Session integration
|
|
705
|
+
|
|
706
|
+
Enable lock-screen and OS media controls:
|
|
707
|
+
|
|
708
|
+
```tsx
|
|
709
|
+
<Ginger.Provider initialTracks={tracks} mediaSession>
|
|
710
|
+
<Ginger.Player />
|
|
711
|
+
{/* ... */}
|
|
712
|
+
</Ginger.Provider>
|
|
713
|
+
```
|
|
714
|
+
|
|
715
|
+
### Keyboard shortcuts
|
|
716
|
+
|
|
717
|
+
```tsx
|
|
718
|
+
import { useGingerKeyboardShortcuts } from "@lucaismyname/ginger";
|
|
719
|
+
|
|
720
|
+
function Hotkeys() {
|
|
721
|
+
useGingerKeyboardShortcuts(true, {
|
|
722
|
+
playPause: " ",
|
|
723
|
+
next: "ArrowRight",
|
|
724
|
+
previous: "ArrowLeft",
|
|
725
|
+
mute: "m",
|
|
726
|
+
});
|
|
727
|
+
return null;
|
|
728
|
+
}
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
### Chapters and synced lyrics
|
|
732
|
+
|
|
733
|
+
```tsx
|
|
734
|
+
import { useGingerChapters, useGingerLyricsSync } from "@lucaismyname/ginger";
|
|
735
|
+
|
|
736
|
+
function ChapterAndLyrics() {
|
|
737
|
+
const chapters = useGingerChapters();
|
|
738
|
+
const lyrics = useGingerLyricsSync();
|
|
739
|
+
return (
|
|
740
|
+
<div>
|
|
741
|
+
<button onClick={() => chapters.seekTo(0)}>Jump to first chapter</button>
|
|
742
|
+
<p>Active lyric: {lyrics.activeLine?.text ?? "None"}</p>
|
|
743
|
+
</div>
|
|
744
|
+
);
|
|
745
|
+
}
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
`Track` now supports optional `chapters` and `lyricsTimed` fields. For LRC parsing, use `parseLrc()`.
|
|
749
|
+
|
|
750
|
+
### Sleep timer and drag seek
|
|
751
|
+
|
|
752
|
+
```tsx
|
|
753
|
+
import { useGingerSleepTimer, useSeekDrag } from "@lucaismyname/ginger";
|
|
754
|
+
|
|
755
|
+
function Extras({ duration }: { duration: number }) {
|
|
756
|
+
useGingerSleepTimer({ durationMs: 10 * 60 * 1000, enabled: true });
|
|
757
|
+
const drag = useSeekDrag(duration);
|
|
758
|
+
return <div onPointerDown={drag.onPointerDown}>Drag to seek</div>;
|
|
759
|
+
}
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
### Persistence + resume
|
|
763
|
+
|
|
764
|
+
`Ginger.Provider` accepts:
|
|
765
|
+
|
|
766
|
+
- `persistence?: { get(key): unknown; set(key, value): void }`
|
|
767
|
+
- `hydrateOnMount?: boolean`
|
|
768
|
+
- `resumeOnTrackChange?: boolean`
|
|
769
|
+
|
|
770
|
+
This allows persisted volume/rate/repeat/index and optional per-track resume positions.
|
|
771
|
+
|
|
772
|
+
### Queue mutation actions and single-track mode
|
|
773
|
+
|
|
774
|
+
`useGinger()` and split playback context now include:
|
|
775
|
+
|
|
776
|
+
- `insertTrackAt(track, index?, autoPlay?)`
|
|
777
|
+
- `removeTrackAt(index)`
|
|
778
|
+
- `moveTrack(fromIndex, toIndex)`
|
|
779
|
+
- `enqueueNext(track)`
|
|
780
|
+
|
|
781
|
+
Provider supports `initialPlaybackMode?: "playlist" | "single"` (`"playlist"` default).
|
|
782
|
+
|
|
783
|
+
### Reduced motion and blocked-play policy
|
|
784
|
+
|
|
785
|
+
- `Ginger.Player` supports `respectReducedMotion` to reduce time sync update frequency.
|
|
786
|
+
- `Ginger.Provider` supports `beforePlay?: () => boolean | Promise<boolean>` and `onPlayBlocked`.
|
|
787
|
+
|
|
788
|
+
### Subpath exports
|
|
789
|
+
|
|
790
|
+
Additional entrypoints:
|
|
791
|
+
|
|
792
|
+
- `@lucaismyname/ginger/client`
|
|
793
|
+
- `@lucaismyname/ginger/testing`
|
|
794
|
+
- `@lucaismyname/ginger/waveform`
|
|
795
|
+
- `@lucaismyname/ginger/experimental-gapless`
|
|
796
|
+
|
|
797
|
+
`experimental-gapless` is explicitly non-production and does not alter core playback.
|
|
798
|
+
|
|
700
799
|
## Notes
|
|
701
800
|
|
|
702
801
|
### CORS
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { useContext as n, useMemo as o, createContext as r } from "react";
|
|
2
|
+
const i = r(null), u = r(null);
|
|
3
|
+
function c() {
|
|
4
|
+
const e = n(i);
|
|
5
|
+
if (!e) throw new Error("Ginger hooks must be used within <Ginger.Provider>");
|
|
6
|
+
return e;
|
|
7
|
+
}
|
|
8
|
+
function _() {
|
|
9
|
+
const e = n(u);
|
|
10
|
+
if (!e) throw new Error("Ginger hooks must be used within <Ginger.Provider>");
|
|
11
|
+
return e;
|
|
12
|
+
}
|
|
13
|
+
function z() {
|
|
14
|
+
const e = c(), t = _();
|
|
15
|
+
return o(() => l(e, t), [e, t]);
|
|
16
|
+
}
|
|
17
|
+
function B(e, t) {
|
|
18
|
+
return { ...e, ...t };
|
|
19
|
+
}
|
|
20
|
+
function l(e, t) {
|
|
21
|
+
const {
|
|
22
|
+
init: g,
|
|
23
|
+
play: d,
|
|
24
|
+
pause: p,
|
|
25
|
+
togglePlayPause: m,
|
|
26
|
+
next: k,
|
|
27
|
+
prev: f,
|
|
28
|
+
setRepeatMode: x,
|
|
29
|
+
cycleRepeat: y,
|
|
30
|
+
toggleShuffle: G,
|
|
31
|
+
setQueue: h,
|
|
32
|
+
insertTrackAt: b,
|
|
33
|
+
removeTrackAt: P,
|
|
34
|
+
moveTrack: M,
|
|
35
|
+
enqueueNext: v,
|
|
36
|
+
playTrackAt: w,
|
|
37
|
+
selectTrackAt: C,
|
|
38
|
+
setPlaylistMeta: R,
|
|
39
|
+
dispatch: T,
|
|
40
|
+
...s
|
|
41
|
+
} = e, {
|
|
42
|
+
seek: A,
|
|
43
|
+
setVolume: S,
|
|
44
|
+
setMuted: E,
|
|
45
|
+
toggleMute: q,
|
|
46
|
+
setPlaybackRate: F,
|
|
47
|
+
audioRef: V,
|
|
48
|
+
notifyEnded: N,
|
|
49
|
+
dispatch: Q,
|
|
50
|
+
...a
|
|
51
|
+
} = t;
|
|
52
|
+
return { ...s, ...a };
|
|
53
|
+
}
|
|
54
|
+
export {
|
|
55
|
+
i as G,
|
|
56
|
+
B as a,
|
|
57
|
+
c as b,
|
|
58
|
+
z as c,
|
|
59
|
+
u as d,
|
|
60
|
+
l as g,
|
|
61
|
+
_ as u
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=GingerSplitContexts-4YZ-OJ9V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GingerSplitContexts-4YZ-OJ9V.js","sources":["../src/context/GingerSplitContexts.tsx"],"sourcesContent":["import { createContext, useContext, useMemo, type Dispatch, type MutableRefObject } from \"react\";\nimport type {\n GingerAction,\n GingerInitPayload,\n GingerMediaSlice,\n GingerPlaybackSlice,\n GingerState,\n PlaylistMeta,\n RepeatMode,\n Track,\n} from \"../types\";\n\nexport type GingerPlaybackActions = {\n init: (payload: GingerInitPayload) => void;\n play: () => void;\n pause: () => void;\n togglePlayPause: () => 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 dispatch: Dispatch<GingerAction>;\n};\n\nexport type GingerPlaybackContextValue = GingerPlaybackSlice & GingerPlaybackActions;\n\nexport type GingerMediaActions = {\n seek: (timeSeconds: number) => void;\n setVolume: (volume: number) => void;\n setMuted: (muted: boolean) => void;\n toggleMute: () => void;\n setPlaybackRate: (rate: number) => void;\n audioRef: MutableRefObject<HTMLAudioElement | null>;\n notifyEnded: () => void;\n dispatch: Dispatch<GingerAction>;\n};\n\nexport type GingerMediaContextValue = GingerMediaSlice & GingerMediaActions;\n\nconst GingerPlaybackContext = createContext<GingerPlaybackContextValue | null>(null);\nconst GingerMediaContext = createContext<GingerMediaContextValue | null>(null);\n\nexport function useGingerPlayback(): GingerPlaybackContextValue {\n const ctx = useContext(GingerPlaybackContext);\n if (!ctx) throw new Error(\"Ginger hooks must be used within <Ginger.Provider>\");\n return ctx;\n}\n\nexport function useGingerMedia(): GingerMediaContextValue {\n const ctx = useContext(GingerMediaContext);\n if (!ctx) throw new Error(\"Ginger hooks must be used within <Ginger.Provider>\");\n return ctx;\n}\n\n/** Full merged state; prefer over `useGingerContext().state` so updates follow playback vs media splits. */\nexport function useGingerState(): GingerState {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n return useMemo(() => gingerStateFromContextValues(pb, md), [pb, md]);\n}\n\n/** Merge playback + media slices (for selectors and `useGinger`). */\nexport function gingerStateFromContexts(\n playback: GingerPlaybackSlice,\n media: GingerMediaSlice,\n): GingerState {\n return { ...playback, ...media };\n}\n\n/** Merge full context values into `GingerState` (strips action fields). */\nexport function gingerStateFromContextValues(\n pb: GingerPlaybackContextValue,\n md: GingerMediaContextValue,\n): GingerState {\n const {\n init: _i,\n play: _p,\n pause: _pa,\n togglePlayPause: _t,\n next: _n,\n prev: _pr,\n setRepeatMode: _sr,\n cycleRepeat: _cr,\n toggleShuffle: _ts,\n setQueue: _sq,\n insertTrackAt: _ita,\n removeTrackAt: _rta,\n moveTrack: _mt,\n enqueueNext: _en,\n playTrackAt: _pta,\n selectTrackAt: _sta,\n setPlaylistMeta: _spm,\n dispatch: _d1,\n ...playbackRest\n } = pb;\n const {\n seek: _sk,\n setVolume: _sv,\n setMuted: _sm,\n toggleMute: _tm,\n setPlaybackRate: _spr,\n audioRef: _ar,\n notifyEnded: _ne,\n dispatch: _d2,\n ...mediaRest\n } = md;\n return { ...playbackRest, ...mediaRest };\n}\n\nexport { GingerPlaybackContext, GingerMediaContext };\n"],"names":["GingerPlaybackContext","createContext","GingerMediaContext","useGingerPlayback","ctx","useContext","useGingerMedia","useGingerState","pb","md","useMemo","gingerStateFromContextValues","gingerStateFromContexts","playback","media","_i","_p","_pa","_t","_n","_pr","_sr","_cr","_ts","_sq","_ita","_rta","_mt","_en","_pta","_sta","_spm","_d1","playbackRest","_sk","_sv","_sm","_tm","_spr","_ar","_ne","_d2","mediaRest"],"mappings":";AAgDA,MAAMA,IAAwBC,EAAiD,IAAI,GAC7EC,IAAqBD,EAA8C,IAAI;AAEtE,SAASE,IAAgD;AAC9D,QAAMC,IAAMC,EAAWL,CAAqB;AAC5C,MAAI,CAACI,EAAK,OAAM,IAAI,MAAM,oDAAoD;AAC9E,SAAOA;AACT;AAEO,SAASE,IAA0C;AACxD,QAAMF,IAAMC,EAAWH,CAAkB;AACzC,MAAI,CAACE,EAAK,OAAM,IAAI,MAAM,oDAAoD;AAC9E,SAAOA;AACT;AAGO,SAASG,IAA8B;AAC5C,QAAMC,IAAKL,EAAA,GACLM,IAAKH,EAAA;AACX,SAAOI,EAAQ,MAAMC,EAA6BH,GAAIC,CAAE,GAAG,CAACD,GAAIC,CAAE,CAAC;AACrE;AAGO,SAASG,EACdC,GACAC,GACa;AACb,SAAO,EAAE,GAAGD,GAAU,GAAGC,EAAA;AAC3B;AAGO,SAASH,EACdH,GACAC,GACa;AACb,QAAM;AAAA,IACJ,MAAMM;AAAA,IACN,MAAMC;AAAA,IACN,OAAOC;AAAA,IACP,iBAAiBC;AAAA,IACjB,MAAMC;AAAA,IACN,MAAMC;AAAA,IACN,eAAeC;AAAA,IACf,aAAaC;AAAA,IACb,eAAeC;AAAA,IACf,UAAUC;AAAA,IACV,eAAeC;AAAA,IACf,eAAeC;AAAA,IACf,WAAWC;AAAA,IACX,aAAaC;AAAA,IACb,aAAaC;AAAA,IACb,eAAeC;AAAA,IACf,iBAAiBC;AAAA,IACjB,UAAUC;AAAA,IACV,GAAGC;AAAA,EAAA,IACDzB,GACE;AAAA,IACJ,MAAM0B;AAAA,IACN,WAAWC;AAAA,IACX,UAAUC;AAAA,IACV,YAAYC;AAAA,IACZ,iBAAiBC;AAAA,IACjB,UAAUC;AAAA,IACV,aAAaC;AAAA,IACb,UAAUC;AAAA,IACV,GAAGC;AAAA,EAAA,IACDjC;AACJ,SAAO,EAAE,GAAGwB,GAAc,GAAGS,EAAA;AAC/B;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const n=require("react"),r=n.createContext(null),s=n.createContext(null);function a(){const e=n.useContext(r);if(!e)throw new Error("Ginger hooks must be used within <Ginger.Provider>");return e}function o(){const e=n.useContext(s);if(!e)throw new Error("Ginger hooks must be used within <Ginger.Provider>");return e}function g(){const e=a(),t=o();return n.useMemo(()=>i(e,t),[e,t])}function _(e,t){return{...e,...t}}function i(e,t){const{init:l,play:d,pause:m,togglePlayPause:p,next:x,prev:k,setRepeatMode:G,cycleRepeat:y,toggleShuffle:C,setQueue:f,insertTrackAt:P,removeTrackAt:b,moveTrack:h,enqueueNext:M,playTrackAt:R,selectTrackAt:S,setPlaylistMeta:v,dispatch:w,...u}=e,{seek:T,setVolume:A,setMuted:F,toggleMute:q,setPlaybackRate:E,audioRef:V,notifyEnded:N,dispatch:Q,...c}=t;return{...u,...c}}exports.GingerMediaContext=s;exports.GingerPlaybackContext=r;exports.gingerStateFromContextValues=i;exports.gingerStateFromContexts=_;exports.useGingerMedia=o;exports.useGingerPlayback=a;exports.useGingerState=g;
|
|
2
|
+
//# sourceMappingURL=GingerSplitContexts-Bze1Bqe2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GingerSplitContexts-Bze1Bqe2.cjs","sources":["../src/context/GingerSplitContexts.tsx"],"sourcesContent":["import { createContext, useContext, useMemo, type Dispatch, type MutableRefObject } from \"react\";\nimport type {\n GingerAction,\n GingerInitPayload,\n GingerMediaSlice,\n GingerPlaybackSlice,\n GingerState,\n PlaylistMeta,\n RepeatMode,\n Track,\n} from \"../types\";\n\nexport type GingerPlaybackActions = {\n init: (payload: GingerInitPayload) => void;\n play: () => void;\n pause: () => void;\n togglePlayPause: () => 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 dispatch: Dispatch<GingerAction>;\n};\n\nexport type GingerPlaybackContextValue = GingerPlaybackSlice & GingerPlaybackActions;\n\nexport type GingerMediaActions = {\n seek: (timeSeconds: number) => void;\n setVolume: (volume: number) => void;\n setMuted: (muted: boolean) => void;\n toggleMute: () => void;\n setPlaybackRate: (rate: number) => void;\n audioRef: MutableRefObject<HTMLAudioElement | null>;\n notifyEnded: () => void;\n dispatch: Dispatch<GingerAction>;\n};\n\nexport type GingerMediaContextValue = GingerMediaSlice & GingerMediaActions;\n\nconst GingerPlaybackContext = createContext<GingerPlaybackContextValue | null>(null);\nconst GingerMediaContext = createContext<GingerMediaContextValue | null>(null);\n\nexport function useGingerPlayback(): GingerPlaybackContextValue {\n const ctx = useContext(GingerPlaybackContext);\n if (!ctx) throw new Error(\"Ginger hooks must be used within <Ginger.Provider>\");\n return ctx;\n}\n\nexport function useGingerMedia(): GingerMediaContextValue {\n const ctx = useContext(GingerMediaContext);\n if (!ctx) throw new Error(\"Ginger hooks must be used within <Ginger.Provider>\");\n return ctx;\n}\n\n/** Full merged state; prefer over `useGingerContext().state` so updates follow playback vs media splits. */\nexport function useGingerState(): GingerState {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n return useMemo(() => gingerStateFromContextValues(pb, md), [pb, md]);\n}\n\n/** Merge playback + media slices (for selectors and `useGinger`). */\nexport function gingerStateFromContexts(\n playback: GingerPlaybackSlice,\n media: GingerMediaSlice,\n): GingerState {\n return { ...playback, ...media };\n}\n\n/** Merge full context values into `GingerState` (strips action fields). */\nexport function gingerStateFromContextValues(\n pb: GingerPlaybackContextValue,\n md: GingerMediaContextValue,\n): GingerState {\n const {\n init: _i,\n play: _p,\n pause: _pa,\n togglePlayPause: _t,\n next: _n,\n prev: _pr,\n setRepeatMode: _sr,\n cycleRepeat: _cr,\n toggleShuffle: _ts,\n setQueue: _sq,\n insertTrackAt: _ita,\n removeTrackAt: _rta,\n moveTrack: _mt,\n enqueueNext: _en,\n playTrackAt: _pta,\n selectTrackAt: _sta,\n setPlaylistMeta: _spm,\n dispatch: _d1,\n ...playbackRest\n } = pb;\n const {\n seek: _sk,\n setVolume: _sv,\n setMuted: _sm,\n toggleMute: _tm,\n setPlaybackRate: _spr,\n audioRef: _ar,\n notifyEnded: _ne,\n dispatch: _d2,\n ...mediaRest\n } = md;\n return { ...playbackRest, ...mediaRest };\n}\n\nexport { GingerPlaybackContext, GingerMediaContext };\n"],"names":["GingerPlaybackContext","createContext","GingerMediaContext","useGingerPlayback","ctx","useContext","useGingerMedia","useGingerState","pb","md","useMemo","gingerStateFromContextValues","gingerStateFromContexts","playback","media","_i","_p","_pa","_t","_n","_pr","_sr","_cr","_ts","_sq","_ita","_rta","_mt","_en","_pta","_sta","_spm","_d1","playbackRest","_sk","_sv","_sm","_tm","_spr","_ar","_ne","_d2","mediaRest"],"mappings":"sCAgDMA,EAAwBC,EAAAA,cAAiD,IAAI,EAC7EC,EAAqBD,EAAAA,cAA8C,IAAI,EAEtE,SAASE,GAAgD,CAC9D,MAAMC,EAAMC,EAAAA,WAAWL,CAAqB,EAC5C,GAAI,CAACI,EAAK,MAAM,IAAI,MAAM,oDAAoD,EAC9E,OAAOA,CACT,CAEO,SAASE,GAA0C,CACxD,MAAMF,EAAMC,EAAAA,WAAWH,CAAkB,EACzC,GAAI,CAACE,EAAK,MAAM,IAAI,MAAM,oDAAoD,EAC9E,OAAOA,CACT,CAGO,SAASG,GAA8B,CAC5C,MAAMC,EAAKL,EAAA,EACLM,EAAKH,EAAA,EACX,OAAOI,EAAAA,QAAQ,IAAMC,EAA6BH,EAAIC,CAAE,EAAG,CAACD,EAAIC,CAAE,CAAC,CACrE,CAGO,SAASG,EACdC,EACAC,EACa,CACb,MAAO,CAAE,GAAGD,EAAU,GAAGC,CAAA,CAC3B,CAGO,SAASH,EACdH,EACAC,EACa,CACb,KAAM,CACJ,KAAMM,EACN,KAAMC,EACN,MAAOC,EACP,gBAAiBC,EACjB,KAAMC,EACN,KAAMC,EACN,cAAeC,EACf,YAAaC,EACb,cAAeC,EACf,SAAUC,EACV,cAAeC,EACf,cAAeC,EACf,UAAWC,EACX,YAAaC,EACb,YAAaC,EACb,cAAeC,EACf,gBAAiBC,EACjB,SAAUC,EACV,GAAGC,CAAA,EACDzB,EACE,CACJ,KAAM0B,EACN,UAAWC,EACX,SAAUC,EACV,WAAYC,EACZ,gBAAiBC,EACjB,SAAUC,EACV,YAAaC,EACb,SAAUC,EACV,GAAGC,CAAA,EACDjC,EACJ,MAAO,CAAE,GAAGwB,EAAc,GAAGS,CAAA,CAC/B"}
|
|
@@ -4,6 +4,7 @@ export type GingerPlayerProps = {
|
|
|
4
4
|
style?: CSSProperties;
|
|
5
5
|
preload?: AudioHTMLAttributes<HTMLAudioElement>["preload"];
|
|
6
6
|
crossOrigin?: AudioHTMLAttributes<HTMLAudioElement>["crossOrigin"];
|
|
7
|
+
respectReducedMotion?: boolean;
|
|
7
8
|
};
|
|
8
|
-
export declare function GingerPlayer({ className, style, preload, crossOrigin }: GingerPlayerProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare function GingerPlayer({ className, style, preload, crossOrigin, respectReducedMotion, }: GingerPlayerProps): import("react/jsx-runtime").JSX.Element;
|
|
9
10
|
//# sourceMappingURL=GingerPlayer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GingerPlayer.d.ts","sourceRoot":"","sources":["../../src/audio/GingerPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"GingerPlayer.d.ts","sourceRoot":"","sources":["../../src/audio/GingerPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGlG,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3D,WAAW,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,aAAa,CAAC,CAAC;IACnE,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAQF,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,KAAK,EACL,OAAoB,EACpB,WAAW,EACX,oBAA4B,GAC7B,EAAE,iBAAiB,2CAsHnB"}
|
package/dist/client.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ginger-B5wfhrC8.cjs"),r=require("./useSeekDrag-DmVvk2Pc.cjs"),i=require("./GingerSplitContexts-Bze1Bqe2.cjs");exports.Ginger=e.Ginger;exports.clampPlaybackRate=e.clampPlaybackRate;exports.clampVolume=e.clampVolume;exports.defaultGingerLocale=e.defaultGingerLocale;exports.derivePlaybackUiState=e.derivePlaybackUiState;exports.useGingerLocale=e.useGingerLocale;exports.usePlayPauseBinding=e.usePlayPauseBinding;exports.useSeekBarBinding=e.useSeekBarBinding;exports.useVolumeSlider=e.useVolumeSlider;exports.parseLrc=r.parseLrc;exports.useGinger=r.useGinger;exports.useGingerChapters=r.useGingerChapters;exports.useGingerDebugLog=r.useGingerDebugLog;exports.useGingerKeyboardShortcuts=r.useGingerKeyboardShortcuts;exports.useGingerLyricsSync=r.useGingerLyricsSync;exports.useGingerSleepTimer=r.useGingerSleepTimer;exports.useSeekDrag=r.useSeekDrag;exports.gingerStateFromContextValues=i.gingerStateFromContextValues;exports.gingerStateFromContexts=i.gingerStateFromContexts;exports.useGingerMedia=i.useGingerMedia;exports.useGingerPlayback=i.useGingerPlayback;exports.useGingerState=i.useGingerState;
|
|
2
|
+
//# sourceMappingURL=client.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { G as s, c as r, a as i, d as u, b as g, u as n, e as t, f as o, g as c } from "./ginger-Cg2cLsA6.js";
|
|
2
|
+
import { p as G, u as m, a as S, b as d, c as p, d as b, e as y, f } from "./useSeekDrag-B0l3F1fL.js";
|
|
3
|
+
import { g as x, a as L, u as P, b as B, c as C } from "./GingerSplitContexts-4YZ-OJ9V.js";
|
|
4
|
+
export {
|
|
5
|
+
s as Ginger,
|
|
6
|
+
r as clampPlaybackRate,
|
|
7
|
+
i as clampVolume,
|
|
8
|
+
u as defaultGingerLocale,
|
|
9
|
+
g as derivePlaybackUiState,
|
|
10
|
+
x as gingerStateFromContextValues,
|
|
11
|
+
L as gingerStateFromContexts,
|
|
12
|
+
G as parseLrc,
|
|
13
|
+
m as useGinger,
|
|
14
|
+
S as useGingerChapters,
|
|
15
|
+
d as useGingerDebugLog,
|
|
16
|
+
p as useGingerKeyboardShortcuts,
|
|
17
|
+
n as useGingerLocale,
|
|
18
|
+
b as useGingerLyricsSync,
|
|
19
|
+
P as useGingerMedia,
|
|
20
|
+
B as useGingerPlayback,
|
|
21
|
+
y as useGingerSleepTimer,
|
|
22
|
+
C as useGingerState,
|
|
23
|
+
t as usePlayPauseBinding,
|
|
24
|
+
o as useSeekBarBinding,
|
|
25
|
+
f as useSeekDrag,
|
|
26
|
+
c as useVolumeSlider
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -8,9 +8,10 @@ export declare namespace PlaybackState {
|
|
|
8
8
|
var displayName: string;
|
|
9
9
|
}
|
|
10
10
|
export type ErrorMessageProps = DisplayBaseProps & {
|
|
11
|
+
live?: "polite" | "assertive" | "off";
|
|
11
12
|
children?: (value: string, state: GingerState) => ReactNode;
|
|
12
13
|
};
|
|
13
|
-
export declare function ErrorMessage({ className, style, fallback, empty, children }: ErrorMessageProps): import("react/jsx-runtime").JSX.Element | null;
|
|
14
|
+
export declare function ErrorMessage({ className, style, fallback, empty, live, children }: ErrorMessageProps): import("react/jsx-runtime").JSX.Element | null;
|
|
14
15
|
export declare namespace ErrorMessage {
|
|
15
16
|
var displayName: string;
|
|
16
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Playback.d.ts","sourceRoot":"","sources":["../../../src/components/current/Playback.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAIlF,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAClD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC;CACtE,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CAShG;yBATe,aAAa;;;AAa7B,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG;IACjD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC;CAC7D,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"Playback.d.ts","sourceRoot":"","sources":["../../../src/components/current/Playback.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAIlF,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAClD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC;CACtE,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CAShG;yBATe,aAAa;;;AAa7B,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG;IACjD,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,KAAK,CAAC;IACtC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC;CAC7D,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAe,EAAE,QAAQ,EAAE,EAAE,iBAAiB,kDAmB/G;yBAnBe,YAAY"}
|
|
@@ -21,6 +21,10 @@ export type GingerContextValue = {
|
|
|
21
21
|
cycleRepeat: () => void;
|
|
22
22
|
toggleShuffle: () => void;
|
|
23
23
|
setQueue: (tracks: Track[], currentIndex?: number) => void;
|
|
24
|
+
insertTrackAt: (track: Track, index?: number, autoPlay?: boolean) => void;
|
|
25
|
+
removeTrackAt: (index: number) => void;
|
|
26
|
+
moveTrack: (fromIndex: number, toIndex: number) => void;
|
|
27
|
+
enqueueNext: (track: Track) => void;
|
|
24
28
|
playTrackAt: (index: number) => void;
|
|
25
29
|
selectTrackAt: (index: number) => void;
|
|
26
30
|
setPlaylistMeta: (meta: PlaylistMeta | null) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GingerContext.d.ts","sourceRoot":"","sources":["../../src/context/GingerContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE9G,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACjC,QAAQ,EAAE,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACpD,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,4EAA4E;IAC5E,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;CACtD,CAAC;AAEF,QAAA,MAAM,aAAa,oDAAiD,CAAC;AAErE,wBAAgB,gBAAgB,IAAI,kBAAkB,CAIrD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"GingerContext.d.ts","sourceRoot":"","sources":["../../src/context/GingerContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE9G,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACjC,QAAQ,EAAE,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACpD,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,4EAA4E;IAC5E,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1E,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;CACtD,CAAC;AAEF,QAAA,MAAM,aAAa,oDAAiD,CAAC;AAErE,wBAAgB,gBAAgB,IAAI,kBAAkB,CAIrD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { GingerProviderProps } from '../types';
|
|
2
|
-
export declare function GingerProvider({ children, initialTracks, initialIndex, initialPlaylistMeta, initialShuffle, initialRepeatMode, initialPaused, initialVolume, initialMuted, initialPlaybackRate, initialStateKey, locale, className, style, onTrackChange, onPlay, onPause, onQueueEnd, onError, }: GingerProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare function GingerProvider({ children, initialTracks, initialIndex, initialPlaylistMeta, initialShuffle, initialRepeatMode, initialPlaybackMode, initialPaused, initialVolume, initialMuted, initialPlaybackRate, initialStateKey, locale, mediaSession, beforePlay, onPlayBlocked, persistence, hydrateOnMount, resumeOnTrackChange, className, style, onTrackChange, onPlay, onPause, onQueueEnd, onError, }: GingerProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
3
3
|
//# sourceMappingURL=GingerProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GingerProvider.d.ts","sourceRoot":"","sources":["../../src/context/GingerProvider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GingerProvider.d.ts","sourceRoot":"","sources":["../../src/context/GingerProvider.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAqB,mBAAmB,EAAmC,MAAM,UAAU,CAAC;AAmBxG,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,aAAkB,EAClB,YAAgB,EAChB,mBAA0B,EAC1B,cAAsB,EACtB,iBAAyB,EACzB,mBAAgC,EAChC,aAAoB,EACpB,aAAiB,EACjB,YAAoB,EACpB,mBAAuB,EACvB,eAAe,EACf,MAAM,EACN,YAAoB,EACpB,UAAU,EACV,aAAa,EACb,WAAW,EACX,cAAsB,EACtB,mBAA2B,EAC3B,SAAS,EACT,KAAK,EACL,aAAa,EACb,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,GACR,EAAE,mBAAmB,2CAofrB"}
|
|
@@ -11,6 +11,10 @@ export type GingerPlaybackActions = {
|
|
|
11
11
|
cycleRepeat: () => void;
|
|
12
12
|
toggleShuffle: () => void;
|
|
13
13
|
setQueue: (tracks: Track[], currentIndex?: number) => void;
|
|
14
|
+
insertTrackAt: (track: Track, index?: number, autoPlay?: boolean) => void;
|
|
15
|
+
removeTrackAt: (index: number) => void;
|
|
16
|
+
moveTrack: (fromIndex: number, toIndex: number) => void;
|
|
17
|
+
enqueueNext: (track: Track) => void;
|
|
14
18
|
playTrackAt: (index: number) => void;
|
|
15
19
|
selectTrackAt: (index: number) => void;
|
|
16
20
|
setPlaylistMeta: (meta: PlaylistMeta | null) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GingerSplitContexts.d.ts","sourceRoot":"","sources":["../../src/context/GingerSplitContexts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACjG,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,KAAK,EACN,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,mBAAmB,GAAG,qBAAqB,CAAC;AAErF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACpD,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAE5E,QAAA,MAAM,qBAAqB,4DAAyD,CAAC;AACrF,QAAA,MAAM,kBAAkB,yDAAsD,CAAC;AAE/E,wBAAgB,iBAAiB,IAAI,0BAA0B,CAI9D;AAED,wBAAgB,cAAc,IAAI,uBAAuB,CAIxD;AAED,4GAA4G;AAC5G,wBAAgB,cAAc,IAAI,WAAW,CAI5C;AAED,qEAAqE;AACrE,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,gBAAgB,GACtB,WAAW,CAEb;AAED,2EAA2E;AAC3E,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,0BAA0B,EAC9B,EAAE,EAAE,uBAAuB,GAC1B,WAAW,
|
|
1
|
+
{"version":3,"file":"GingerSplitContexts.d.ts","sourceRoot":"","sources":["../../src/context/GingerSplitContexts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACjG,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,KAAK,EACN,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1E,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,mBAAmB,GAAG,qBAAqB,CAAC;AAErF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACpD,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAE5E,QAAA,MAAM,qBAAqB,4DAAyD,CAAC;AACrF,QAAA,MAAM,kBAAkB,yDAAsD,CAAC;AAE/E,wBAAgB,iBAAiB,IAAI,0BAA0B,CAI9D;AAED,wBAAgB,cAAc,IAAI,uBAAuB,CAIxD;AAED,4GAA4G;AAC5G,wBAAgB,cAAc,IAAI,WAAW,CAI5C;AAED,qEAAqE;AACrE,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,gBAAgB,GACtB,WAAW,CAEb;AAED,2EAA2E;AAC3E,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,0BAA0B,EAC9B,EAAE,EAAE,uBAAuB,GAC1B,WAAW,CAkCb;AAED,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playbackReducer.d.ts","sourceRoot":"","sources":["../../src/core/playbackReducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"playbackReducer.d.ts","sourceRoot":"","sources":["../../src/core/playbackReducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAY7E,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAkBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,WAAW,CA0Bd;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CAiOnF"}
|
package/dist/core/queue.d.ts
CHANGED
|
@@ -3,4 +3,8 @@ export declare function clampIndex(index: number, length: number): number;
|
|
|
3
3
|
export declare function shuffleWithAnchor(tracks: Track[], anchorIndex: number): Track[];
|
|
4
4
|
export declare function trackIdentity(track: Track | null | undefined): string;
|
|
5
5
|
export declare function findIndexByTrackIdentity(tracks: Track[], target: Track | null | undefined): number;
|
|
6
|
+
export declare function insertTrackAt(tracks: Track[], track: Track, index?: number): Track[];
|
|
7
|
+
export declare function removeTrackAt(tracks: Track[], index: number): Track[];
|
|
8
|
+
export declare function moveTrack(tracks: Track[], fromIndex: number, toIndex: number): Track[];
|
|
9
|
+
export declare function addNextTrack(tracks: Track[], currentIndex: number, track: Track): Track[];
|
|
6
10
|
//# sourceMappingURL=queue.d.ts.map
|
package/dist/core/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,CAU/E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGrE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKlG"}
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,CAU/E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGrE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKlG;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,CAKpF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAKrE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAetF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,CAEzF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../src/core/transitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAG/D,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../src/core/transitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAG/D,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,eAAe,CAS1E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAQ3D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAQ3D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAI5D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAE1G;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAE1G"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react"),t=require("../GingerSplitContexts-Bze1Bqe2.cjs");function a(){const{tracks:e}=t.useGingerPlayback();return s.useMemo(()=>({supported:!1,reason:"Gapless playback requires dedicated Web Audio graph orchestration.",preloadedTrackIds:e.map(r=>r.id??r.fileUrl)}),[e])}exports.useExperimentalGapless=a;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/experimental-gapless/index.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type ExperimentalGaplessState = {\n supported: false;\n reason: string;\n preloadedTrackIds: string[];\n};\n\n/**\n * Experimental-only helper surface.\n * This does not alter Ginger playback behavior.\n */\nexport function useExperimentalGapless(): ExperimentalGaplessState {\n const { tracks } = useGingerPlayback();\n return useMemo(\n () => ({\n supported: false as const,\n reason: \"Gapless playback requires dedicated Web Audio graph orchestration.\",\n preloadedTrackIds: tracks.map((track) => track.id ?? track.fileUrl),\n }),\n [tracks],\n );\n}\n"],"names":["useExperimentalGapless","tracks","useGingerPlayback","useMemo","track"],"mappings":"0JAaO,SAASA,GAAmD,CACjE,KAAM,CAAE,OAAAC,CAAA,EAAWC,oBAAA,EACnB,OAAOC,EAAAA,QACL,KAAO,CACL,UAAW,GACX,OAAQ,qEACR,kBAAmBF,EAAO,IAAKG,GAAUA,EAAM,IAAMA,EAAM,OAAO,CAAA,GAEpE,CAACH,CAAM,CAAA,CAEX"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type ExperimentalGaplessState = {
|
|
2
|
+
supported: false;
|
|
3
|
+
reason: string;
|
|
4
|
+
preloadedTrackIds: string[];
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Experimental-only helper surface.
|
|
8
|
+
* This does not alter Ginger playback behavior.
|
|
9
|
+
*/
|
|
10
|
+
export declare function useExperimentalGapless(): ExperimentalGaplessState;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/experimental-gapless/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,wBAAwB,CAUjE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useMemo as a } from "react";
|
|
2
|
+
import { b as s } from "../GingerSplitContexts-4YZ-OJ9V.js";
|
|
3
|
+
function i() {
|
|
4
|
+
const { tracks: e } = s();
|
|
5
|
+
return a(
|
|
6
|
+
() => ({
|
|
7
|
+
supported: !1,
|
|
8
|
+
reason: "Gapless playback requires dedicated Web Audio graph orchestration.",
|
|
9
|
+
preloadedTrackIds: e.map((r) => r.id ?? r.fileUrl)
|
|
10
|
+
}),
|
|
11
|
+
[e]
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
i as useExperimentalGapless
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/experimental-gapless/index.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type ExperimentalGaplessState = {\n supported: false;\n reason: string;\n preloadedTrackIds: string[];\n};\n\n/**\n * Experimental-only helper surface.\n * This does not alter Ginger playback behavior.\n */\nexport function useExperimentalGapless(): ExperimentalGaplessState {\n const { tracks } = useGingerPlayback();\n return useMemo(\n () => ({\n supported: false as const,\n reason: \"Gapless playback requires dedicated Web Audio graph orchestration.\",\n preloadedTrackIds: tracks.map((track) => track.id ?? track.fileUrl),\n }),\n [tracks],\n );\n}\n"],"names":["useExperimentalGapless","tracks","useGingerPlayback","useMemo","track"],"mappings":";;AAaO,SAASA,IAAmD;AACjE,QAAM,EAAE,QAAAC,EAAA,IAAWC,EAAA;AACnB,SAAOC;AAAA,IACL,OAAO;AAAA,MACL,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,mBAAmBF,EAAO,IAAI,CAACG,MAAUA,EAAM,MAAMA,EAAM,OAAO;AAAA,IAAA;AAAA,IAEpE,CAACH,CAAM;AAAA,EAAA;AAEX;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const o=require("react/jsx-runtime"),d=require("react"),k=require("./GingerSplitContexts-Bze1Bqe2.cjs"),Ce=d.createContext(null);function vr(){const e=d.useContext(Ce);if(!e)throw new Error("Ginger components must be used within <Ginger.Provider>");return e}function Re(e){const{buffered:r,duration:n}=e;return!(n>0)||r.length===0?0:Math.min(1,r.end(r.length-1)/n)}function Tr({className:e,style:r,preload:n="metadata",crossOrigin:t,respectReducedMotion:a=!1}){var E;const{audioRef:u,dispatch:s,state:l,notifyEnded:f}=vr(),p=((E=l.tracks[l.currentIndex])==null?void 0:E.fileUrl)??"",y=d.useRef({currentTime:-1,duration:-1,bufferedFraction:-1}),[h,x]=d.useState(!1);d.useEffect(()=>{if(!a||typeof window>"u")return;const g=window.matchMedia("(prefers-reduced-motion: reduce)"),m=()=>x(g.matches);return m(),g.addEventListener("change",m),()=>g.removeEventListener("change",m)},[a]);const T=(g,m=!1)=>{const R={currentTime:g.currentTime,duration:g.duration,bufferedFraction:Re(g)},P=y.current,he=h?.5:.25,H=Math.abs(R.currentTime-P.currentTime)>=he||Math.abs(R.duration-P.duration)>=.01||Math.abs(R.bufferedFraction-P.bufferedFraction)>=.01;!m&&!H||(y.current=R,s({type:"MEDIA_TIME_UPDATE",payload:R}))};return d.useEffect(()=>{const g=u.current;g&&(g.volume=l.volume,g.muted=l.muted,g.playbackRate=l.playbackRate)},[u,l.volume,l.muted,l.playbackRate]),d.useEffect(()=>{const g=u.current;if(g){if(!p){g.removeAttribute("src"),y.current={currentTime:-1,duration:-1,bufferedFraction:-1};return}g.getAttribute("src")!==p&&(g.src=p,g.load(),y.current={currentTime:-1,duration:-1,bufferedFraction:-1})}},[u,l.currentIndex,l.tracks,p]),o.jsx("audio",{ref:u,className:e,style:r,preload:n,crossOrigin:t,controls:!1,playsInline:!0,onTimeUpdate:g=>{T(g.currentTarget)},onLoadedMetadata:g=>{const m=g.currentTarget;y.current={currentTime:-1,duration:-1,bufferedFraction:-1},s({type:"MEDIA_LOADED_METADATA",payload:{duration:m.duration,bufferedFraction:Re(m)}})},onSeeking:g=>T(g.currentTarget,!0),onSeeked:g=>T(g.currentTarget,!0),onEnded:()=>f(),onPlay:()=>s({type:"MEDIA_PLAY"}),onPause:()=>s({type:"MEDIA_PAUSE"}),onWaiting:()=>s({type:"MEDIA_WAITING"}),onCanPlay:()=>s({type:"MEDIA_CANPLAY"}),onProgress:g=>T(g.currentTarget,!0),onVolumeChange:g=>{const m=g.currentTarget;s({type:"MEDIA_VOLUME_SYNC",payload:{volume:m.volume,muted:m.muted}})},onError:()=>{var P;const g=u.current,m=(P=g==null?void 0:g.error)==null?void 0:P.code;s({type:"MEDIA_ERROR",payload:{message:m===1?"MEDIA_ERR_ABORTED":m===2?"MEDIA_ERR_NETWORK":m===3?"MEDIA_ERR_DECODE":m===4?"MEDIA_ERR_SRC_NOT_SUPPORTED":"MEDIA_ERR_UNKNOWN"}})}})}function I(e,r){return r<=0?0:Math.max(0,Math.min(r-1,e))}function Ge(e,r){if(e.length<=1)return[...e];const n=e[r];if(!n)return[...e];const t=e.filter((a,u)=>u!==r);for(let a=t.length-1;a>0;a--){const u=Math.floor(Math.random()*(a+1));[t[a],t[u]]=[t[u],t[a]]}return[n,...t]}function Y(e){return e?e.id!=null&&e.id!==""?`id:${e.id}`:`file:${e.fileUrl}`:""}function Ir(e,r){const n=Y(r);if(!n)return 0;const t=e.findIndex(a=>Y(a)===n);return t===-1?0:t}function je(e,r,n){const t=[...e],a=Math.max(0,Math.min(t.length,n??t.length));return t.splice(a,0,r),t}function Er(e,r){if(r<0||r>=e.length)return[...e];const n=[...e];return n.splice(r,1),n}function Pr(e,r,n){if(r===n||r<0||r>=e.length||n<0||n>=e.length)return[...e];const t=[...e],[a]=t.splice(r,1);return a?(t.splice(n,0,a),t):[...e]}function Sr(e,r,n){return je(e,n,Math.max(0,Math.min(e.length,r+1)))}function Ar(e){const{tracks:r,currentIndex:n,repeatMode:t,playbackMode:a}=e,u=r.length;return u===0?{kind:"stop",nextIndex:0}:t==="one"?{kind:"replay_same"}:a==="single"?{kind:"stop",nextIndex:I(n,u)}:n<u-1?{kind:"advance",nextIndex:n+1}:t==="all"?{kind:"wrap",nextIndex:0}:{kind:"stop",nextIndex:I(n,u)}}function Rr(e){const{tracks:r,currentIndex:n,repeatMode:t,playbackMode:a}=e,u=r.length;return u===0?0:a==="single"?I(n,u):n<u-1?n+1:t==="all"?0:I(n,u)}function Cr(e){const{tracks:r,currentIndex:n,repeatMode:t,playbackMode:a}=e,u=r.length;return u===0?0:a==="single"?I(n,u):n>0?n-1:t==="all"?u-1:0}function Gr(e){return e==="off"?"all":e==="all"?"one":"off"}function jr(e,r){return(e==null?void 0:e.artworkUrl)??r??void 0}function _r(e,r){return(e==null?void 0:e.album)??r??void 0}function G(e){return e.tracks[e.currentIndex]??null}function Te(e){return e.errorMessage?"error":e.tracks.length===0?"idle":e.isBuffering?"loading":e.isPaused?Number.isFinite(e.duration)&&e.duration>0&&e.currentTime>=e.duration-.05?"ended":"paused":"playing"}function B(e){var t;const r=e.duration;if(Number.isFinite(r)&&r>0)return r;const n=(t=e.tracks[e.currentIndex])==null?void 0:t.durationSeconds;return typeof n=="number"&&Number.isFinite(n)&&n>0?n:0}function _e(e){const n=B(e)-e.currentTime;return Number.isFinite(n)?Math.max(0,n):0}function Ie(e){const r=B(e);return r>0?Math.min(1,Math.max(0,e.currentTime/r)):0}function Ne(e){var n;const r=G(e);return jr(r,(n=e.playlistMeta)==null?void 0:n.artworkUrl)}function we(e){var n;const r=G(e);return _r(r,(n=e.playlistMeta)==null?void 0:n.subtitle)}function L(e,r){function n(t){const a=k.useGingerState(),s=(r(a)??"").trim(),{className:l,style:f,fallback:p,empty:y,children:h}=t;if(!s){const x=y??p??null;return x?o.jsx("span",{className:l,style:f,children:x}):null}return h?o.jsx("span",{className:l,style:f,children:h(s,a)}):o.jsx("span",{className:l,style:f,children:s})}return n.displayName=e,n}function F(e,r){return L(e,n=>r(G(n)))}const Nr=F("Ginger.Current.Title",e=>e==null?void 0:e.title),wr=F("Ginger.Current.Artist",e=>e==null?void 0:e.artist),Dr=L("Ginger.Current.Album",e=>we(e)),Lr=F("Ginger.Current.Description",e=>e==null?void 0:e.description),Fr=L("Ginger.Current.Copyright",e=>{var n;const r=G(e);return(r==null?void 0:r.copyright)??((n=e.playlistMeta)==null?void 0:n.copyright)}),Ur=F("Ginger.Current.Genre",e=>e==null?void 0:e.genre),Vr=F("Ginger.Current.Label",e=>e==null?void 0:e.label),Br=F("Ginger.Current.Isrc",e=>e==null?void 0:e.isrc),$r=F("Ginger.Current.TrackNumber",e=>(e==null?void 0:e.trackNumber)!=null?String(e.trackNumber):void 0);function De({className:e,style:r,fallback:n,empty:t,children:a,format:u}){var p;const s=k.useGingerState(),l=(p=G(s))==null?void 0:p.year;if(typeof l!="number"||!Number.isFinite(l)){const y=t??n??null;return y?o.jsx("span",{className:e,style:r,children:y}):null}const f=u?u(l):String(l);return a?o.jsx("span",{className:e,style:r,children:a(f,s)}):o.jsx("span",{className:e,style:r,children:f})}De.displayName="Ginger.Current.Year";function Le({className:e,style:r,fallback:n,empty:t,children:a,preserveWhitespace:u=!0}){var y;const s=k.useGingerState(),l=((y=G(s))==null?void 0:y.lyrics)??"",f=u?l.replace(/^\s+|\s+$/g,""):l.trim();if(!f){const h=t??n??null;return h?o.jsx("span",{className:e,style:r,children:h}):null}const p=u?{whiteSpace:"pre-wrap"}:void 0;return a?o.jsx("span",{className:e,style:{...p,...r},children:a(f,s)}):o.jsx("span",{className:e,style:{...p,...r},children:f})}Le.displayName="Ginger.Current.Lyrics";function Fe({visible:e=!1,className:r,style:n,fallback:t,empty:a,children:u}){var f;const s=k.useGingerState();if(!e)return null;const l=((f=G(s))==null?void 0:f.fileUrl)??"";if(!l){const p=a??t??null;return p?o.jsx("span",{className:r,style:n,children:p}):null}return u?o.jsx("span",{className:r,style:n,children:u(l,s)}):o.jsx("span",{className:r,style:n,children:l})}Fe.displayName="Ginger.Current.FileUrl";function Ue({className:e,style:r,fallback:n,empty:t,sizes:a,loading:u,onError:s,decoding:l,imgStyle:f}){const p=k.useGingerState(),y=G(p),h=Ne(p);if(!h){const T=t??n??null;return T?o.jsx("span",{className:e,style:r,children:T}):null}const x=[y==null?void 0:y.title,y==null?void 0:y.artist].filter(Boolean).join(" — ")||"Artwork";return o.jsx("div",{className:e,style:{background:"var(--ginger-artwork-bg, transparent)",borderRadius:"var(--ginger-artwork-radius, 0)",overflow:"hidden",...r},children:o.jsx("img",{src:h,alt:x,sizes:a,loading:u,decoding:l,onError:s,style:{display:"block",width:"100%",height:"100%",objectFit:"cover",...f}})})}Ue.displayName="Ginger.Current.Artwork";function Ve({base:e=0,className:r,style:n,fallback:t,empty:a,children:u}){const s=k.useGingerState();if(s.tracks.length===0){const p=a??t??null;return p?o.jsx("span",{className:r,style:n,children:p}):null}const f=String(s.currentIndex+e);return u?o.jsx("span",{className:r,style:n,children:u(f,s)}):o.jsx("span",{className:r,style:n,children:f})}Ve.displayName="Ginger.Current.QueueIndex";function Be({className:e,style:r,fallback:n,empty:t,children:a}){const u=k.useGingerState(),s=String(u.tracks.length);if(u.tracks.length===0){const l=t??n??null;return l?o.jsx("span",{className:e,style:r,children:l}):null}return a?o.jsx("span",{className:e,style:r,children:a(s,u)}):o.jsx("span",{className:e,style:r,children:s})}Be.displayName="Ginger.Current.QueueLength";function $e({base:e=0,separator:r=" / ",className:n,style:t,fallback:a,empty:u,children:s}){const l=k.useGingerState(),f=l.tracks.length;if(f===0){const x=u??a??null;return x?o.jsx("span",{className:n,style:t,children:x}):null}const p=String(l.currentIndex+e),y=String(f),h=`${p}${r}${y}`;return s?o.jsx("span",{className:n,style:t,children:s({index:p,length:y,label:h},l)}):o.jsx("span",{className:n,style:t,children:h})}$e.displayName="Ginger.Current.QueuePosition";function ke(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 Ee(e,r,n){const{className:t,style:a,fallback:u,empty:s,children:l,format:f=ke}=n;if(!(e>=0)||!Number.isFinite(e)){const y=s??u??null;return y?o.jsx("span",{className:t,style:a,children:y}):null}const p=f(e);return l?o.jsx("span",{className:t,style:a,children:l(p,r)}):o.jsx("span",{className:t,style:a,children:p})}function Oe(e){const r=k.useGingerState();return Ee(r.currentTime,r,e)}Oe.displayName="Ginger.Current.Elapsed";function Ye(e){const r=k.useGingerState();return Ee(B(r),r,e)}Ye.displayName="Ginger.Current.Duration";function Qe(e){const r=k.useGingerState();return Ee(_e(r),r,e)}Qe.displayName="Ginger.Current.Remaining";function He({className:e,style:r,fallback:n,empty:t,children:a}){const u=k.useGingerState(),s=B(u),l=Ie(u);if(!(s>0)){const f=t??n??null;return f?o.jsx("span",{className:e,style:r,children:f}):null}return a?o.jsx("span",{className:e,style:r,children:a({fraction:l,currentTime:u.currentTime,duration:s},u)}):o.jsx("span",{className:e,style:r,children:`${Math.round(l*100)}%`})}He.displayName="Ginger.Current.Progress";function Xe({className:e,style:r,height:n=4,showBuffered:t=!1}){const a=k.useGingerState(),u=`${Math.round(Ie(a)*100)}%`,s=`${Math.round(Math.min(1,Math.max(0,a.bufferedFraction))*100)}%`;return o.jsxs("div",{className:e,style:{width:"100%",height:n,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",position:"relative",...r},"aria-hidden":!0,children:[t?o.jsx("div",{style:{position:"absolute",left:0,top:0,height:"100%",width:s,background:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}}):null,o.jsx("div",{style:{position:"relative",width:u,height:"100%",background:"var(--ginger-primary-color, #111827)"}})]})}Xe.displayName="Ginger.Current.TimeRail";function Ke({className:e,style:r,height:n=4}){const t=k.useGingerState(),a=`${Math.round(Math.min(1,Math.max(0,t.bufferedFraction))*100)}%`;return o.jsx("div",{className:e,style:{width:"100%",height:n,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",...r},"aria-hidden":!0,children:o.jsx("div",{style:{width:a,height:"100%",background:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}})})}Ke.displayName="Ginger.Current.BufferRail";function qe({className:e,style:r,fallback:n,empty:t,children:a}){const u=k.useGingerState(),s=Te(u);return a?o.jsx("span",{className:e,style:r,children:a(s,u)}):o.jsx("span",{className:e,style:r,children:s})}qe.displayName="Ginger.Current.PlaybackState";function We({className:e,style:r,fallback:n,empty:t,live:a="polite",children:u}){const s=k.useGingerState(),l=s.errorMessage??"";if(!l){const f=t??n??null;return f?o.jsx("span",{className:e,style:r,children:f}):null}return u?o.jsx("span",{className:e,style:r,"aria-live":a,children:u(l,s)}):o.jsx("span",{className:e,style:r,"aria-live":a,children:l})}We.displayName="Ginger.Current.ErrorMessage";const O={seek:"Seek",volume:"Volume",playbackSpeed:"Playback speed",nextTrack:"Next track",previousTrack:"Previous track",shuffle:"Shuffle",mute:"Mute",unmute:"Unmute",play:"Play",pause:"Pause",repeat:{off:"Repeat off",all:"Repeat all",one:"Repeat one"},playbackRateNormal:"1× normal",playbackRateTimes:e=>`${e}×`};function Or(e){return e?{...O,...e,repeat:{...O.repeat,...e.repeat}}:O}const ze=d.createContext(O);function Yr({locale:e,children:r}){const n=Or(e);return o.jsx(ze.Provider,{value:n,children:r})}function S(){return d.useContext(ze)}function Je(){const e=k.useGingerPlayback(),r=k.useGingerMedia(),n=S(),t=d.useMemo(()=>k.gingerStateFromContextValues(e,r),[e,r]),a=B(t),u=a>0?t.currentTime:0,s=Number.isFinite(u)?u:0,l=a>0?`${ke(s)} of ${ke(a)}`:ke(s),f=p=>{r.seek(Number(p.currentTarget.value))};return{state:t,value:s,min:0,max:a>0?a:1,step:"any",ariaValueText:l,ariaLabel:n.seek,onSeekInput:f,onSeekChange:f}}function Ze(){const e=k.useGingerPlayback(),r=k.useGingerMedia(),n=S(),t=d.useMemo(()=>k.gingerStateFromContextValues(e,r),[e,r]),a=u=>{r.setVolume(Number(u.currentTarget.value))};return{state:t,value:t.volume,min:0,max:1,step:"any",ariaValueText:`${Math.round(t.volume*100)}%`,ariaLabel:n.volume,onVolumeInput:a,onVolumeChange:a}}function er(e){const r=k.useGingerPlayback(),n=S(),t=(e==null?void 0:e.playAriaLabel)??n.play,a=(e==null?void 0:e.pauseAriaLabel)??n.pause;return{isPaused:r.isPaused,toggle:r.togglePlayPause,ariaLabel:r.isPaused?t:a}}function rr({playLabel:e="Play",pauseLabel:r="Pause",playAriaLabel:n,pauseAriaLabel:t,type:a="button",...u}){const s=S(),l=typeof e=="string"?e:s.play,f=typeof r=="string"?r:s.pause,p=er({playAriaLabel:n??l,pauseAriaLabel:t??f});return o.jsx("button",{type:a,"aria-label":p.ariaLabel,onClick:p.toggle,...u,children:p.isPaused?e:r})}rr.displayName="Ginger.Control.PlayPause";function nr({type:e="button",...r}){const{repeatMode:n,cycleRepeat:t}=k.useGingerPlayback(),u=S().repeat[n];return o.jsx("button",{type:e,"aria-label":u,onClick:t,...r,children:u})}nr.displayName="Ginger.Control.Repeat";function tr({type:e="button",children:r="Next",...n}){const{next:t}=k.useGingerPlayback(),a=S();return o.jsx("button",{type:e,"aria-label":a.nextTrack,onClick:t,...n,children:r})}tr.displayName="Ginger.Control.Next";function ar({type:e="button",children:r="Previous",...n}){const{prev:t}=k.useGingerPlayback(),a=S();return o.jsx("button",{type:e,"aria-label":a.previousTrack,onClick:t,...n,children:r})}ar.displayName="Ginger.Control.Previous";function ur({type:e="button",children:r="Shuffle",...n}){const{isShuffled:t,toggleShuffle:a}=k.useGingerPlayback(),u=S();return o.jsx("button",{type:e,"aria-pressed":t,"aria-label":u.shuffle,onClick:a,...n,children:r})}ur.displayName="Ginger.Control.Shuffle";function ir({inputStyle:e,style:r,...n}){const t=Je();return o.jsx("input",{...n,type:"range",min:t.min,max:t.max,step:t.step,value:t.value,"aria-label":t.ariaLabel,"aria-valuetext":t.ariaValueText,onInput:t.onSeekInput,onChange:t.onSeekChange,style:{width:"100%",...r,...e}})}ir.displayName="Ginger.Control.SeekBar";function sr({inputStyle:e,style:r,...n}){const t=Ze();return o.jsx("input",{...n,type:"range",min:t.min,max:t.max,step:t.step,value:t.value,"aria-label":t.ariaLabel,"aria-valuetext":t.ariaValueText,onInput:t.onVolumeInput,onChange:t.onVolumeChange,style:{width:"100%",...r,...e}})}sr.displayName="Ginger.Control.Volume";function lr({muteLabel:e,unmuteLabel:r,type:n="button",...t}){const{muted:a,toggleMute:u}=k.useGingerMedia(),s=S(),l=e??s.mute,f=r??s.unmute;return o.jsx("button",{type:n,"aria-pressed":a,"aria-label":a?s.unmute:s.mute,onClick:u,...t,children:a?f:l})}lr.displayName="Ginger.Control.Mute";const Qr=[.5,.75,1,1.25,1.5,2];function or({rates:e=Qr,style:r,...n}){const{playbackRate:t,setPlaybackRate:a}=k.useGingerMedia(),u=S(),s=d.useMemo(()=>Array.from(new Set([...e,t])).sort((l,f)=>l-f),[e,t]);return o.jsx("select",{...n,"aria-label":u.playbackSpeed,value:String(t),style:r,onChange:l=>a(Number(l.currentTarget.value)),children:s.map(l=>o.jsx("option",{value:String(l),children:l===1?u.playbackRateNormal:u.playbackRateTimes(l)},l))})}or.displayName="Ginger.Control.PlaybackRate";const ve=d.createContext(null);function Hr(){const e=d.useContext(ve);if(!e)throw new Error("Ginger.Playlist.Track must be used inside <Ginger.Playlist>");return e}function cr({children:e,rowStyle:r,renderTrack:n,playOnSelect:t=!0,style:a,...u}){const{tracks:s,currentIndex:l,playTrackAt:f,selectTrackAt:p}=k.useGingerPlayback(),y={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(ve.Provider,{value:{playOnSelect:t},children:o.jsx("ul",{style:y,...u,children:e})}):o.jsx(ve.Provider,{value:{playOnSelect:t},children:o.jsx("ul",{style:y,...u,children:s.map((x,T)=>{const E=T===l;return o.jsx("li",{children:o.jsx("button",{type:"button",onClick:()=>{t?f(T):p(T)},style:{width:"100%",textAlign:"left",border:"none",background:E?"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))":"transparent",color:"inherit",font:"inherit",cursor:"pointer",padding:"var(--ginger-playlist-row-padding, 6px 8px)",...r},children:n?n(x,T,E):o.jsxs("span",{children:[x.title,x.artist?` — ${x.artist}`:""]})})},`${T}-${Y(x)}`)})})})}cr.displayName="Ginger.Playlist";function dr({index:e,className:r,style:n,children:t,liProps:a,onClick:u,...s}){const{playOnSelect:l}=Hr(),{tracks:f,currentIndex:p,playTrackAt:y,selectTrackAt:h}=k.useGingerPlayback(),x=e===p,T=f[e],E=T!=null?o.jsxs("span",{children:[T.title,T.artist?` — ${T.artist}`:""]}):null;return o.jsx("li",{...a,children:o.jsx("button",{type:"button","aria-current":x?"true":void 0,"data-ginger-active":x||void 0,className:r,style:{width:"100%",textAlign:"left",border:"none",background:x?"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))":"transparent",color:"inherit",font:"inherit",cursor:"pointer",padding:"var(--ginger-playlist-row-padding, 6px 8px)",...n},...s,onClick:g=>{u==null||u(g),!g.defaultPrevented&&(l?y(e):h(e))},children:t??E})})}dr.displayName="Ginger.Playlist.Track";const Xr=Object.assign(cr,{Track:dr}),Kr=L("Ginger.Queue.Title",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.title}),qr=L("Ginger.Queue.Subtitle",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.subtitle}),Wr=L("Ginger.Queue.Description",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.description}),zr=L("Ginger.Queue.Copyright",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.copyright});function fr({className:e,style:r,fallback:n,empty:t,imgStyle:a}){var f,p;const u=k.useGingerState(),s=(f=u.playlistMeta)==null?void 0:f.artworkUrl;if(!s){const y=t??n??null;return y?o.jsx("span",{className:e,style:r,children:y}):null}const l=((p=u.playlistMeta)==null?void 0:p.title)??"Playlist artwork";return o.jsx("span",{className:e,style:{display:"inline-block",background:"var(--ginger-artwork-bg, #f3f4f6)",borderRadius:"var(--ginger-artwork-radius, 6px)",overflow:"hidden",...r},children:o.jsx("img",{src:s,alt:l,style:{display:"block",width:"100%",height:"100%",objectFit:"cover",...a}})})}fr.displayName="Ginger.Queue.Artwork";function Q(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):1}function xe(e){return Number.isFinite(e)?Math.min(4,Math.max(.25,e)):1}const D={currentTime:0,duration:0,bufferedFraction:0,isBuffering:!1,errorMessage:null},Jr={...D,volume:1,muted:!1,playbackRate:1};function pr(e){const r=[...e.tracks];let n=I(e.currentIndex??0,r.length),t=null,a=r;return e.isShuffled&&r.length>1&&(t=[...r],a=Ge(r,n),n=0),{tracks:a,currentIndex:n,playbackMode:e.playbackMode??"playlist",isPaused:e.isPaused??!0,isShuffled:!!(e.isShuffled&&a.length>1),repeatMode:e.repeatMode??"off",originalTracks:t,playlistMeta:e.playlistMeta??null,...Jr,volume:Q(e.volume??1),muted:e.muted??!1,playbackRate:xe(e.playbackRate??1)}}function Zr(e,r){switch(r.type){case"INIT":{const{tracks:n,currentIndex:t,playlistMeta:a,isPaused:u,isShuffled:s,repeatMode:l,playbackMode:f,volume:p,muted:y,playbackRate:h}=r.payload;return pr({tracks:n,currentIndex:t,playlistMeta:a??null,isPaused:u??!0,isShuffled:s??!1,repeatMode:l??"off",playbackMode:f??"playlist",volume:p,muted:y,playbackRate:h})}case"SET_QUEUE":{const{tracks:n,currentIndex:t}=r.payload,a=[...n],u=I(t??e.currentIndex,a.length);return{...e,tracks:a,currentIndex:u,isShuffled:!1,originalTracks:null,...D}}case"INSERT_TRACK":{const n=r.payload.index??e.tracks.length,t=je(e.tracks,r.payload.track,n);if(r.payload.autoPlay){const u=I(n,t.length);return{...e,tracks:t,currentIndex:u,isShuffled:!1,originalTracks:null,isPaused:!1,...D}}const a=n<=e.currentIndex?e.currentIndex+1:e.currentIndex;return{...e,tracks:t,isShuffled:!1,originalTracks:null,currentIndex:I(a,t.length)}}case"REMOVE_TRACK":{const n=r.payload.index,t=Er(e.tracks,n),a=n<e.currentIndex?e.currentIndex-1:n===e.currentIndex?Math.min(e.currentIndex,Math.max(0,t.length-1)):e.currentIndex;return{...e,tracks:t,isShuffled:!1,originalTracks:null,currentIndex:I(a,t.length),...n===e.currentIndex?D:{}}}case"MOVE_TRACK":{const{fromIndex:n,toIndex:t}=r.payload,a=Pr(e.tracks,n,t);let u=e.currentIndex;return e.currentIndex===n?u=t:n<e.currentIndex&&t>=e.currentIndex?u-=1:n>e.currentIndex&&t<=e.currentIndex&&(u+=1),{...e,tracks:a,isShuffled:!1,originalTracks:null,currentIndex:I(u,a.length)}}case"ADD_NEXT":{const n=Sr(e.tracks,e.currentIndex,r.payload.track);return{...e,tracks:n,isShuffled:!1,originalTracks:null}}case"SET_INDEX":{const n=I(r.payload.index,e.tracks.length),t=r.payload.autoPlay,a=t===!0?!1:t===!1?!0:e.isPaused;return{...e,currentIndex:n,...D,isPaused:a}}case"PLAY":return{...e,isPaused:!1};case"PAUSE":return{...e,isPaused:!0};case"TOGGLE_PAUSE":return{...e,isPaused:!e.isPaused};case"SET_REPEAT":return{...e,repeatMode:r.payload};case"CYCLE_REPEAT":return{...e,repeatMode:Gr(e.repeatMode)};case"TOGGLE_SHUFFLE":{if(e.tracks.length<=1)return{...e,isShuffled:!1,originalTracks:null};if(!e.isShuffled){const u=[...e.tracks],s=Ge(u,e.currentIndex);return{...e,isShuffled:!0,originalTracks:u,tracks:s,currentIndex:0}}const n=e.originalTracks?[...e.originalTracks]:[...e.tracks],t=e.tracks[e.currentIndex],a=Ir(n,t);return{...e,isShuffled:!1,originalTracks:null,tracks:n,currentIndex:I(a,n.length)}}case"NEXT":{const n=Rr(e),t=n===e.currentIndex;return{...e,currentIndex:n,...t?{}:D,isPaused:t?e.isPaused:!1}}case"PREV":{const n=Cr(e),t=n===e.currentIndex;return{...e,currentIndex:n,...t?{}:D,isPaused:t?e.isPaused:!1}}case"MEDIA_TIME_UPDATE":return{...e,currentTime:r.payload.currentTime,duration:Number.isFinite(r.payload.duration)?r.payload.duration:e.duration,bufferedFraction:r.payload.bufferedFraction,isBuffering:!1};case"MEDIA_LOADED_METADATA":return{...e,duration:Number.isFinite(r.payload.duration)?r.payload.duration:e.duration,bufferedFraction:r.payload.bufferedFraction,errorMessage:null};case"SET_PLAYLIST_META":return{...e,playlistMeta:r.payload};case"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"SET_VOLUME":return{...e,volume:Q(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:xe(r.payload)};case"MEDIA_VOLUME_SYNC":{const{volume:n,muted:t}=r.payload,a=Q(n);return a===e.volume&&t===e.muted?e:{...e,volume:a,muted:t}}default:return e}}function en(e){const r=e.tracks[e.currentIndex];return r?{title:r.title,artist:r.artist,album:r.album,artwork:r.artworkUrl?[{src:r.artworkUrl}]:void 0}:{title:"Unknown track"}}function rn(e,r,n){d.useEffect(()=>{if(!e||typeof navigator>"u"||!("mediaSession"in navigator))return;const t=navigator.mediaSession;t.metadata=new MediaMetadata(en(r)),t.playbackState=r.isPaused?"paused":"playing";try{t.setActionHandler("play",n.play),t.setActionHandler("pause",n.pause),t.setActionHandler("nexttrack",n.next),t.setActionHandler("previoustrack",n.prev),t.setActionHandler("seekto",a=>{typeof a.seekTime=="number"&&Number.isFinite(a.seekTime)&&n.seek(a.seekTime)})}catch{}return()=>{try{t.setActionHandler("play",null),t.setActionHandler("pause",null),t.setActionHandler("nexttrack",null),t.setActionHandler("previoustrack",null),t.setActionHandler("seekto",null)}catch{}}},[e,r,n])}const nn={"--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 tn({children:e,initialTracks:r=[],initialIndex:n=0,initialPlaylistMeta:t=null,initialShuffle:a=!1,initialRepeatMode:u="off",initialPlaybackMode:s="playlist",initialPaused:l=!0,initialVolume:f=1,initialMuted:p=!1,initialPlaybackRate:y=1,initialStateKey:h,locale:x,mediaSession:T=!1,beforePlay:E,onPlayBlocked:g,persistence:m,hydrateOnMount:R=!1,resumeOnTrackChange:P=!1,className:he,style:H,onTrackChange:X,onPlay:K,onPause:q,onQueueEnd:W,onError:z}){var Ae;const w=d.useRef(null),[i,b]=d.useReducer(Zr,void 0,()=>pr({tracks:r,currentIndex:n,playlistMeta:t,isPaused:l,isShuffled:a,repeatMode:u,playbackMode:s,volume:f,muted:p,playbackRate:y})),Pe=d.useRef(i),Me=d.useRef({tracks:r,currentIndex:n,playlistMeta:t,isPaused:l,isShuffled:a,repeatMode:u,playbackMode:s,volume:f,muted:p,playbackRate:y});Me.current={tracks:r,currentIndex:n,playlistMeta:t,isPaused:l,isShuffled:a,repeatMode:u,playbackMode:s,volume:f,muted:p,playbackRate:y};const $=d.useRef(void 0);d.useEffect(()=>{if(h===void 0){$.current=void 0;return}if($.current===void 0){$.current=h;return}if($.current===h)return;$.current=h;const c=Me.current;b({type:"INIT",payload:{tracks:c.tracks,currentIndex:c.currentIndex,playlistMeta:c.playlistMeta,isPaused:c.isPaused,isShuffled:c.isShuffled,repeatMode:c.repeatMode,playbackMode:c.playbackMode,volume:c.volume,muted:c.muted,playbackRate:c.playbackRate}})},[h,b]),d.useEffect(()=>{Pe.current=i},[i]);const Se=i.tracks[i.currentIndex]??null;d.useEffect(()=>{X==null||X(Se,i.currentIndex)},[Se,i.currentIndex,X]),d.useEffect(()=>{i.errorMessage&&(z==null||z(i.errorMessage))},[i.errorMessage,z]);const J=d.useRef(void 0);d.useEffect(()=>{if(J.current===void 0){J.current=i.isPaused;return}J.current!==i.isPaused&&(i.isPaused?q==null||q():K==null||K()),J.current=i.isPaused},[i.isPaused,q,K]);const j=d.useCallback(()=>{b({type:"PLAY"})},[]),_=d.useCallback(()=>{var c;b({type:"PAUSE"}),(c=w.current)==null||c.pause()},[]),Z=d.useCallback(()=>{i.isPaused?j():_()},[_,j,i.isPaused]),N=d.useCallback(c=>{const M=w.current;M&&Number.isFinite(c)&&(M.currentTime=Math.max(0,c))},[]),ee=d.useCallback(c=>{b({type:"SET_VOLUME",payload:Q(c)})},[]),re=d.useCallback(c=>{b({type:"SET_MUTED",payload:c})},[]),ne=d.useCallback(()=>{b({type:"TOGGLE_MUTE"})},[]),te=d.useCallback(c=>{b({type:"SET_PLAYBACK_RATE",payload:xe(c)})},[]),U=d.useCallback(()=>{b({type:"NEXT"})},[]),V=d.useCallback(()=>{b({type:"PREV"})},[]),ae=d.useCallback(c=>{b({type:"SET_REPEAT",payload:c})},[]),ue=d.useCallback(()=>{b({type:"CYCLE_REPEAT"})},[]),ie=d.useCallback(()=>{b({type:"TOGGLE_SHUFFLE"})},[]),se=d.useCallback((c,M)=>{b({type:"SET_QUEUE",payload:{tracks:c,currentIndex:M}})},[]),le=d.useCallback((c,M,v)=>{b({type:"INSERT_TRACK",payload:{track:c,index:M,autoPlay:v}})},[]),oe=d.useCallback(c=>{b({type:"REMOVE_TRACK",payload:{index:c}})},[]),ce=d.useCallback((c,M)=>{b({type:"MOVE_TRACK",payload:{fromIndex:c,toIndex:M}})},[]),de=d.useCallback(c=>{b({type:"ADD_NEXT",payload:{track:c}})},[]),fe=d.useCallback(c=>{b({type:"SET_INDEX",payload:{index:c,autoPlay:!0}})},[]),pe=d.useCallback(c=>{b({type:"SET_INDEX",payload:{index:c,autoPlay:!1}})},[]),ge=d.useCallback(c=>{b({type:"SET_PLAYLIST_META",payload:c})},[]),ye=d.useCallback(c=>{b({type:"INIT",payload:c})},[]);d.useEffect(()=>{if(!m||!R)return;const c=m.get("ginger:volume"),M=m.get("ginger:muted"),v=m.get("ginger:playbackRate"),C=m.get("ginger:repeatMode"),be=m.get("ginger:currentIndex"),A=Me.current;b({type:"INIT",payload:{tracks:A.tracks,playlistMeta:A.playlistMeta,isPaused:A.isPaused,isShuffled:A.isShuffled,playbackMode:A.playbackMode,currentIndex:typeof be=="number"?be:A.currentIndex,repeatMode:C==="off"||C==="all"||C==="one"?C:A.repeatMode,volume:typeof c=="number"?c:A.volume,muted:typeof M=="boolean"?M:A.muted,playbackRate:typeof v=="number"?v:A.playbackRate}})},[R,m]),d.useEffect(()=>{m&&(m.set("ginger:volume",i.volume),m.set("ginger:muted",i.muted),m.set("ginger:playbackRate",i.playbackRate),m.set("ginger:repeatMode",i.repeatMode),m.set("ginger:currentIndex",i.currentIndex))},[m,i.volume,i.muted,i.playbackRate,i.repeatMode,i.currentIndex]),d.useEffect(()=>{if(!m||!P)return;const c=i.tracks[i.currentIndex];if(!c)return;const M=`ginger:resume:${Y(c)}`,v=m.get(M);typeof v=="number"&&Number.isFinite(v)&&N(v)},[m,P,i.currentIndex,i.tracks,N]),d.useEffect(()=>{if(!m||!P)return;const c=i.tracks[i.currentIndex];if(!c||!(i.currentTime>=0))return;const M=`ginger:resume:${Y(c)}`,v=setTimeout(()=>m.set(M,i.currentTime),250);return()=>clearTimeout(v)},[m,P,i.currentIndex,i.tracks,i.currentTime]);const gr=(Ae=i.tracks[i.currentIndex])==null?void 0:Ae.fileUrl;d.useEffect(()=>{const c=w.current;if(!c)return;if(i.isPaused){c.pause();return}let M=!1;return(async()=>{if(E){let v=!1;try{v=await E()}catch(C){const be=C instanceof Error?C.message:"beforePlay rejected";b({type:"MEDIA_ERROR",payload:{message:be}});return}if(!v){M||(b({type:"PAUSE"}),g==null||g());return}}M||c.play().catch(v=>{const C=v instanceof Error?v.message:typeof v=="string"?v:"Playback failed (e.g. autoplay blocked or unavailable source)";b({type:"MEDIA_ERROR",payload:{message:C}})})})(),()=>{M=!0}},[E,gr,g,i.isPaused]);const me=d.useCallback(()=>{const c=Ar(Pe.current);if(c.kind==="replay_same"){const v=w.current;v&&(v.currentTime=0),b({type:"PLAY"});return}if(c.kind==="stop"){b({type:"PAUSE"}),W==null||W();return}const M=c.nextIndex;b({type:"SET_INDEX",payload:{index:M,autoPlay:!0}})},[W]),yr=d.useMemo(()=>({play:j,pause:_,next:U,prev:V,seek:N}),[j,_,U,V,N]);rn(!!T,i,yr);const mr=x!=null&&x.seek&&/[\u0590-\u08FF]/.test(x.seek)?"rtl":"ltr",br=d.useMemo(()=>({state:i,dispatch:b,audioRef:w,notifyEnded:me,init:ye,play:j,pause:_,togglePlayPause:Z,seek:N,setVolume:ee,setMuted:re,toggleMute:ne,setPlaybackRate:te,next:U,prev:V,setRepeatMode:ae,cycleRepeat:ue,toggleShuffle:ie,setQueue:se,insertTrackAt:le,removeTrackAt:oe,moveTrack:ce,enqueueNext:de,playTrackAt:fe,selectTrackAt:pe,setPlaylistMeta:ge}),[ue,b,ye,U,me,_,j,fe,le,oe,ce,de,pe,V,N,re,te,se,ae,ge,ee,i,ne,Z,ie]),kr=d.useMemo(()=>({tracks:i.tracks,currentIndex:i.currentIndex,isPaused:i.isPaused,isShuffled:i.isShuffled,repeatMode:i.repeatMode,originalTracks:i.originalTracks,playlistMeta:i.playlistMeta,init:ye,play:j,pause:_,togglePlayPause:Z,next:U,prev:V,setRepeatMode:ae,cycleRepeat:ue,toggleShuffle:ie,playbackMode:i.playbackMode,setQueue:se,insertTrackAt:le,removeTrackAt:oe,moveTrack:ce,enqueueNext:de,playTrackAt:fe,selectTrackAt:pe,setPlaylistMeta:ge,dispatch:b}),[i.tracks,i.currentIndex,i.isPaused,i.isShuffled,i.repeatMode,i.playbackMode,i.originalTracks,i.playlistMeta,ye,j,_,Z,U,V,ae,ue,ie,se,le,oe,ce,de,fe,pe,ge,b]),xr=d.useMemo(()=>({currentTime:i.currentTime,duration:i.duration,bufferedFraction:i.bufferedFraction,isBuffering:i.isBuffering,errorMessage:i.errorMessage,volume:i.volume,muted:i.muted,playbackRate:i.playbackRate,seek:N,setVolume:ee,setMuted:re,toggleMute:ne,setPlaybackRate:te,audioRef:w,notifyEnded:me,dispatch:b}),[i.currentTime,i.duration,i.bufferedFraction,i.isBuffering,i.errorMessage,i.volume,i.muted,i.playbackRate,N,ee,re,ne,te,w,me,b]),hr=Te(i),Mr=d.useMemo(()=>({...nn,...H}),[H]);return o.jsx(Yr,{locale:x,children:o.jsx(k.GingerPlaybackContext.Provider,{value:kr,children:o.jsx(k.GingerMediaContext.Provider,{value:xr,children:o.jsx(Ce.Provider,{value:br,children:o.jsx("div",{className:he,style:Mr,"data-ginger-playback":hr,dir:mr,children:e})})})})})}const an={Provider:tn,Player:Tr,Current:{Title:Nr,Artist:wr,Album:Dr,Description:Lr,Copyright:Fr,Genre:Ur,Label:Vr,Isrc:Br,TrackNumber:$r,Year:De,Lyrics:Le,FileUrl:Fe,Artwork:Ue,QueueIndex:Ve,QueueLength:Be,QueuePosition:$e,Elapsed:Oe,Duration:Ye,Remaining:Qe,Progress:He,TimeRail:Xe,BufferRail:Ke,PlaybackState:qe,ErrorMessage:We},Queue:{Title:Kr,Subtitle:qr,Description:Wr,Copyright:zr,Artwork:fr},Control:{PlayPause:rr,Repeat:nr,Next:tr,Previous:ar,Shuffle:ur,SeekBar:ir,Volume:sr,Mute:lr,PlaybackRate:or},Playlist:Xr};exports.Ginger=an;exports.clampPlaybackRate=xe;exports.clampVolume=Q;exports.defaultGingerLocale=O;exports.derivePlaybackUiState=Te;exports.effectiveDuration=B;exports.effectiveRemaining=_e;exports.getCurrentTrack=G;exports.progressFraction=Ie;exports.resolvedAlbumLine=we;exports.resolvedArtwork=Ne;exports.useGingerLocale=S;exports.usePlayPauseBinding=er;exports.useSeekBarBinding=Je;exports.useVolumeSlider=Ze;
|
|
2
|
+
//# sourceMappingURL=ginger-B5wfhrC8.cjs.map
|