@lucaismyname/ginger 0.0.15 → 0.0.17
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 +37 -1
- package/dist/client.cjs +1 -1
- package/dist/client.js +31 -28
- package/dist/components/current/Chapters.d.ts +15 -0
- package/dist/components/current/Chapters.d.ts.map +1 -0
- package/dist/components/current/ChaptersLyricsSynced.test.d.ts +2 -0
- package/dist/components/current/ChaptersLyricsSynced.test.d.ts.map +1 -0
- package/dist/components/current/LyricsSynced.d.ts +16 -0
- package/dist/components/current/LyricsSynced.d.ts.map +1 -0
- package/dist/components/current/index.d.ts +4 -0
- package/dist/components/current/index.d.ts.map +1 -1
- package/dist/core/transitions.d.ts +5 -3
- package/dist/core/transitions.d.ts.map +1 -1
- package/dist/ginger-DWOyCog6.cjs +2 -0
- package/dist/ginger-DWOyCog6.cjs.map +1 -0
- package/dist/ginger-F4UDi2Qf.js +1766 -0
- package/dist/ginger-F4UDi2Qf.js.map +1 -0
- package/dist/ginger.d.ts +2 -0
- package/dist/ginger.d.ts.map +1 -1
- package/dist/hooks/useNextTrackPrefetch.d.ts +16 -0
- package/dist/hooks/useNextTrackPrefetch.d.ts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -28
- package/dist/testing/index.cjs +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/useNextTrackPrefetch-BeAKS3SR.cjs +2 -0
- package/dist/useNextTrackPrefetch-BeAKS3SR.cjs.map +1 -0
- package/dist/useNextTrackPrefetch-gKls_h_N.js +257 -0
- package/dist/useNextTrackPrefetch-gKls_h_N.js.map +1 -0
- package/package.json +1 -1
- package/dist/ginger-BTPRqWHs.js +0 -1621
- package/dist/ginger-BTPRqWHs.js.map +0 -1
- package/dist/ginger-BiI69vrn.cjs +0 -2
- package/dist/ginger-BiI69vrn.cjs.map +0 -1
- package/dist/useSeekDrag-Br1V0Vao.js +0 -290
- package/dist/useSeekDrag-Br1V0Vao.js.map +0 -1
- package/dist/useSeekDrag-aS7uk26h.cjs +0 -2
- package/dist/useSeekDrag-aS7uk26h.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -491,6 +491,8 @@ Other current-track components:
|
|
|
491
491
|
|-----------|-------------|-----------------|
|
|
492
492
|
| `Ginger.Current.Artwork` | Current track artwork or playlist artwork fallback | `unstyled`, `imgStyle`, `sizes`, `loading`, `decoding`, `onError`, display-base props |
|
|
493
493
|
| `Ginger.Current.Lyrics` | Track lyrics | `preserveWhitespace`, render-prop `children` |
|
|
494
|
+
| `Ginger.Current.LyricsSynced` | Timed / LRC lyrics with active line | `activeClassName`, `lineClassName`, `unstyled`, render-prop `children` |
|
|
495
|
+
| `Ginger.Current.Chapters` | Chapter list; click seeks to `startSeconds` | `formatStart`, `unstyled`, render-prop `children` |
|
|
494
496
|
| `Ginger.Current.FileUrl` | Track `fileUrl`, hidden unless explicitly enabled | `visible`, display-base props |
|
|
495
497
|
| `Ginger.Current.QueueIndex` | Current queue index | `base`, render-prop `children` |
|
|
496
498
|
| `Ginger.Current.QueueLength` | Queue length | render-prop `children` |
|
|
@@ -688,7 +690,7 @@ Example:
|
|
|
688
690
|
|
|
689
691
|
- **Headless control bindings** (bind to your own components): **`useSeekBarBinding()`**, **`useVolumeSlider()`**, **`usePlayPauseBinding({ playAriaLabel?, pauseAriaLabel? })`**. Each returns props such as `value`, `min`, `max`, handlers, and `ariaLabel` / `ariaValueText` where relevant.
|
|
690
692
|
|
|
691
|
-
- **Advanced hooks** — **`useGingerKeyboardShortcuts()`**, **`useGingerSleepTimer()`**, **`useSeekDrag()`**, **`useGingerChapters()`**, **`useGingerLyricsSync()`**, and **`useGingerDebugLog()`** are available for custom UX and diagnostics.
|
|
693
|
+
- **Advanced hooks** — **`useGingerKeyboardShortcuts()`**, **`useGingerSleepTimer()`**, **`useSeekDrag()`**, **`useNextTrackPrefetch()`**, **`useGingerChapters()`**, **`useGingerLyricsSync()`**, and **`useGingerDebugLog()`** are available for custom UX and diagnostics.
|
|
692
694
|
|
|
693
695
|
- **Locale** — Pass **`locale={partialMessages}`** on `Ginger.Provider` (type **`GingerLocaleMessages`**) to translate built-in control strings; **`useGingerLocale()`** reads the merged messages anywhere under the provider.
|
|
694
696
|
|
|
@@ -847,6 +849,31 @@ function ChapterAndLyrics() {
|
|
|
847
849
|
|
|
848
850
|
`Track` now supports optional `chapters` and `lyricsTimed` fields. For LRC parsing, use `parseLrc()`.
|
|
849
851
|
|
|
852
|
+
For ready-made UI, use **`Ginger.Current.Chapters`** and **`Ginger.Current.LyricsSynced`** (same data as the hooks above).
|
|
853
|
+
|
|
854
|
+
### Next-track prefetch
|
|
855
|
+
|
|
856
|
+
```tsx
|
|
857
|
+
import { Ginger, useNextTrackPrefetch } from "@lucaismyname/ginger";
|
|
858
|
+
|
|
859
|
+
function PrefetchNext() {
|
|
860
|
+
useNextTrackPrefetch({ crossOrigin: "anonymous" });
|
|
861
|
+
return null;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
export function App() {
|
|
865
|
+
return (
|
|
866
|
+
<Ginger.Provider initialTracks={tracks}>
|
|
867
|
+
<Ginger.Player crossOrigin="anonymous" />
|
|
868
|
+
<PrefetchNext />
|
|
869
|
+
{/* ... */}
|
|
870
|
+
</Ginger.Provider>
|
|
871
|
+
);
|
|
872
|
+
}
|
|
873
|
+
```
|
|
874
|
+
|
|
875
|
+
The hook preloads the **logical** next track (same rules as the Next button) using a detached `HTMLAudioElement` with `preload="auto"`. Pass **`crossOrigin`** when it matches **`Ginger.Player`** for cross-origin URLs.
|
|
876
|
+
|
|
850
877
|
### Sleep timer and drag seek
|
|
851
878
|
|
|
852
879
|
```tsx
|
|
@@ -896,6 +923,7 @@ Use `useGingerDebugLog(true)` during development to log core state transitions i
|
|
|
896
923
|
- `Ginger.Control.SeekBar` and `Ginger.Control.Volume` accept `unstyled`.
|
|
897
924
|
- `Ginger.Current.Artwork`, `Ginger.Queue.Artwork`, `Ginger.Current.TimeRail`, and `Ginger.Current.BufferRail` accept `unstyled`.
|
|
898
925
|
- `Ginger.Playlist` and `Ginger.Playlist.Track` accept `unstyled`.
|
|
926
|
+
- `Ginger.Current.Chapters` and `Ginger.Current.LyricsSynced` accept `unstyled`.
|
|
899
927
|
|
|
900
928
|
This gives you a pure state+behavior layer while keeping convenience components available.
|
|
901
929
|
|
|
@@ -924,6 +952,14 @@ There is no `window` at import time, but playback only starts when the audio ele
|
|
|
924
952
|
|
|
925
953
|
See [Recipes — Updating the queue after mount](#updating-the-queue-after-mount).
|
|
926
954
|
|
|
955
|
+
## Development priorities
|
|
956
|
+
|
|
957
|
+
These priorities guide new work in the library; they are not a guarantee of shipping order.
|
|
958
|
+
|
|
959
|
+
1. **Music libraries and continuous listening** — Features that make track-to-track playback feel better come first: **next-track prefetch** (`useNextTrackPrefetch`), future gapless or crossfade (see `@lucaismyname/ginger/experimental-gapless`), and first-class **chapter** / **synced lyrics** UI (`Ginger.Current.Chapters`, `Ginger.Current.LyricsSynced`).
|
|
960
|
+
2. **Podcasts and live-style streams** — **HLS / DASH** integration is emphasized when a concrete app needs it; the core package stays on native `<audio>` with optional adapters or documentation rather than hard dependencies.
|
|
961
|
+
3. **Embedded or internal players** — **Accessibility**, persistence, and **testing** helpers are favored over heavier ecosystem integrations (Cast, remote playback modules) unless there is a dedicated use case.
|
|
962
|
+
|
|
927
963
|
## Monorepo Development
|
|
928
964
|
|
|
929
965
|
| Path | Purpose |
|
package/dist/client.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ginger-DWOyCog6.cjs"),r=require("./useNextTrackPrefetch-BeAKS3SR.cjs"),a=require("./GingerSplitContexts-C7puo0M7.cjs");exports.Chapters=e.Chapters;exports.Ginger=e.Ginger;exports.LyricsSynced=e.LyricsSynced;exports.clampPlaybackRate=e.clampPlaybackRate;exports.clampVolume=e.clampVolume;exports.defaultGingerLocale=e.defaultGingerLocale;exports.derivePlaybackUiState=e.derivePlaybackUiState;exports.parseLrc=e.parseLrc;exports.useGingerChapters=e.useGingerChapters;exports.useGingerLocale=e.useGingerLocale;exports.useGingerLyricsSync=e.useGingerLyricsSync;exports.usePlayPauseBinding=e.usePlayPauseBinding;exports.useSeekBarBinding=e.useSeekBarBinding;exports.useVolumeSlider=e.useVolumeSlider;exports.attachLiveAnalyser=r.attachLiveAnalyser;exports.detachLiveAnalyser=r.detachLiveAnalyser;exports.useGinger=r.useGinger;exports.useGingerDebugLog=r.useGingerDebugLog;exports.useGingerKeyboardShortcuts=r.useGingerKeyboardShortcuts;exports.useGingerLiveAnalyzer=r.useGingerLiveAnalyzer;exports.useGingerSleepTimer=r.useGingerSleepTimer;exports.useNextTrackPrefetch=r.useNextTrackPrefetch;exports.useSeekDrag=r.useSeekDrag;exports.gingerStateFromContextValues=a.gingerStateFromContextValues;exports.gingerStateFromContexts=a.gingerStateFromContexts;exports.useGingerMedia=a.useGingerMedia;exports.useGingerPlayback=a.useGingerPlayback;exports.useGingerState=a.useGingerState;
|
|
2
2
|
//# sourceMappingURL=client.cjs.map
|
package/dist/client.js
CHANGED
|
@@ -1,31 +1,34 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as
|
|
3
|
-
import { g as
|
|
1
|
+
import { C as s, G as r, L as i, c as n, a as t, d as u, b as g, p as c, u as l, e as o, f as G, g as y, h as d, i as S } from "./ginger-F4UDi2Qf.js";
|
|
2
|
+
import { a as p, d as L, u as b, b as h, c as f, e as k, f as x, g as P, h as C } from "./useNextTrackPrefetch-gKls_h_N.js";
|
|
3
|
+
import { g as A, a as B, u as V, b as D, c as F } from "./GingerSplitContexts-BzBExb95.js";
|
|
4
4
|
export {
|
|
5
|
-
s as
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
5
|
+
s as Chapters,
|
|
6
|
+
r as Ginger,
|
|
7
|
+
i as LyricsSynced,
|
|
8
|
+
p as attachLiveAnalyser,
|
|
9
|
+
n as clampPlaybackRate,
|
|
10
|
+
t as clampVolume,
|
|
11
|
+
u as defaultGingerLocale,
|
|
12
|
+
g as derivePlaybackUiState,
|
|
13
|
+
L as detachLiveAnalyser,
|
|
14
|
+
A as gingerStateFromContextValues,
|
|
15
|
+
B as gingerStateFromContexts,
|
|
16
|
+
c as parseLrc,
|
|
17
|
+
b as useGinger,
|
|
18
|
+
l as useGingerChapters,
|
|
19
|
+
h as useGingerDebugLog,
|
|
20
|
+
f as useGingerKeyboardShortcuts,
|
|
21
|
+
k as useGingerLiveAnalyzer,
|
|
22
|
+
o as useGingerLocale,
|
|
23
|
+
G as useGingerLyricsSync,
|
|
24
|
+
V as useGingerMedia,
|
|
25
|
+
D as useGingerPlayback,
|
|
26
|
+
x as useGingerSleepTimer,
|
|
27
|
+
F as useGingerState,
|
|
28
|
+
P as useNextTrackPrefetch,
|
|
29
|
+
y as usePlayPauseBinding,
|
|
30
|
+
d as useSeekBarBinding,
|
|
31
|
+
C as useSeekDrag,
|
|
32
|
+
S as useVolumeSlider
|
|
30
33
|
};
|
|
31
34
|
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { DisplayBaseProps, GingerState } from '../../types';
|
|
3
|
+
import { GingerChapter } from '../../hooks/useGingerChapters';
|
|
4
|
+
export type ChaptersProps = Omit<DisplayBaseProps, "children"> & {
|
|
5
|
+
/** Remove default list/row styles for fully custom styling. */
|
|
6
|
+
unstyled?: boolean;
|
|
7
|
+
/** Prefix before each chapter title (default: `formatMmSs(startSeconds)`). */
|
|
8
|
+
formatStart?: (startSeconds: number) => string;
|
|
9
|
+
children?: (chapter: GingerChapter, index: number, active: boolean, state: GingerState) => ReactNode;
|
|
10
|
+
};
|
|
11
|
+
export declare function Chapters({ className, style, fallback, empty, unstyled, formatStart, children, }: ChaptersProps): import("react/jsx-runtime").JSX.Element | null;
|
|
12
|
+
export declare namespace Chapters {
|
|
13
|
+
var displayName: string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=Chapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chapters.d.ts","sourceRoot":"","sources":["../../../src/components/current/Chapters.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAGtF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG;IAC/D,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC;CACtG,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,KAAK,EACL,QAAQ,EACR,KAAK,EACL,QAAgB,EAChB,WAAwB,EACxB,QAAQ,GACT,EAAE,aAAa,kDA4Df;yBApEe,QAAQ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChaptersLyricsSynced.test.d.ts","sourceRoot":"","sources":["../../../src/components/current/ChaptersLyricsSynced.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { DisplayBaseProps, GingerState } from '../../types';
|
|
3
|
+
import { TimedLyricLine } from '../../internal/lyrics';
|
|
4
|
+
export type LyricsSyncedProps = Omit<DisplayBaseProps, "children"> & {
|
|
5
|
+
unstyled?: boolean;
|
|
6
|
+
/** Class applied to the line that matches the current playback time. */
|
|
7
|
+
activeClassName?: string;
|
|
8
|
+
/** Class applied to every line. */
|
|
9
|
+
lineClassName?: string;
|
|
10
|
+
children?: (line: TimedLyricLine, index: number, active: boolean, state: GingerState) => ReactNode;
|
|
11
|
+
};
|
|
12
|
+
export declare function LyricsSynced({ className, style, fallback, empty, unstyled, activeClassName, lineClassName, children, }: LyricsSyncedProps): import("react/jsx-runtime").JSX.Element | null;
|
|
13
|
+
export declare namespace LyricsSynced {
|
|
14
|
+
var displayName: string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=LyricsSynced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LyricsSynced.d.ts","sourceRoot":"","sources":["../../../src/components/current/LyricsSynced.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mCAAmC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC;CACpG,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,KAAK,EACL,QAAQ,EACR,KAAK,EACL,QAAgB,EAChB,eAAe,EACf,aAAa,EACb,QAAQ,GACT,EAAE,iBAAiB,kDA8CnB;yBAvDe,YAAY"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export * from './texts';
|
|
2
2
|
export { Year } from './Year';
|
|
3
3
|
export { Lyrics } from './Lyrics';
|
|
4
|
+
export { LyricsSynced } from './LyricsSynced';
|
|
5
|
+
export type { LyricsSyncedProps } from './LyricsSynced';
|
|
6
|
+
export { Chapters } from './Chapters';
|
|
7
|
+
export type { ChaptersProps } from './Chapters';
|
|
4
8
|
export { FileUrl } from './FileUrl';
|
|
5
9
|
export { Artwork } from './Artwork';
|
|
6
10
|
export { QueueIndex, QueueLength, QueuePosition } from './QueueMeta';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/current/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/current/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { GingerState, RepeatMode, Track } from '../types';
|
|
2
|
+
/** Fields used by next/prev/ended navigation; avoids coupling helpers to full `GingerState`. */
|
|
3
|
+
export type GingerPlaybackNavigationSlice = Pick<GingerState, "tracks" | "currentIndex" | "repeatMode" | "playbackMode">;
|
|
2
4
|
export type EndedTransition = {
|
|
3
5
|
kind: "replay_same";
|
|
4
6
|
} | {
|
|
@@ -11,9 +13,9 @@ export type EndedTransition = {
|
|
|
11
13
|
kind: "stop";
|
|
12
14
|
nextIndex: number;
|
|
13
15
|
};
|
|
14
|
-
export declare function computeEndedTransition(state:
|
|
15
|
-
export declare function computeNextIndex(state:
|
|
16
|
-
export declare function computePrevIndex(state:
|
|
16
|
+
export declare function computeEndedTransition(state: GingerPlaybackNavigationSlice): EndedTransition;
|
|
17
|
+
export declare function computeNextIndex(state: GingerPlaybackNavigationSlice): number;
|
|
18
|
+
export declare function computePrevIndex(state: GingerPlaybackNavigationSlice): number;
|
|
17
19
|
export declare function cycleRepeatMode(mode: RepeatMode): RepeatMode;
|
|
18
20
|
export declare function resolveArtworkUrl(track: Track | null, playlistArtwork?: string | null): string | undefined;
|
|
19
21
|
export declare function resolveAlbumLine(track: Track | null, playlistSubtitle?: string | null): string | undefined;
|
|
@@ -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,
|
|
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,gGAAgG;AAChG,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAC9C,WAAW,EACX,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,cAAc,CAC1D,CAAC;AAEF,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,6BAA6B,GAAG,eAAe,CAS5F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,6BAA6B,GAAG,MAAM,CAQ7E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,6BAA6B,GAAG,MAAM,CAQ7E;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";const l=require("react/jsx-runtime"),f=require("react"),b=require("./GingerSplitContexts-C7puo0M7.cjs"),we=f.createContext(null);function _r(){const e=f.useContext(we);if(!e)throw new Error("Ginger components must be used within <Ginger.Provider>");return e}function Ne(e){const{buffered:r,duration:n}=e;return!(n>0)||r.length===0?0:Math.min(1,r.end(r.length-1)/n)}function Nr({className:e,style:r,preload:n="metadata",crossOrigin:a,respectReducedMotion:t=!1}){var I;const{audioRef:i,dispatch:u,state:s,notifyEnded:o}=_r(),d=((I=s.tracks[s.currentIndex])==null?void 0:I.fileUrl)??"",m=f.useRef({currentTime:-1,duration:-1,bufferedFraction:-1}),y=f.useRef(""),[h,k]=f.useState(!1);f.useEffect(()=>{if(!t||typeof window>"u")return;const p=window.matchMedia("(prefers-reduced-motion: reduce)"),E=()=>k(p.matches);return E(),p.addEventListener("change",E),()=>p.removeEventListener("change",E)},[t]);const v=(p,E=!1)=>{const P={currentTime:p.currentTime,duration:p.duration,bufferedFraction:Ne(p)},G=m.current,Me=h?.5:.25,O=Math.abs(P.currentTime-G.currentTime)>=Me||Math.abs(P.duration-G.duration)>=.01||Math.abs(P.bufferedFraction-G.bufferedFraction)>=.01;!E&&!O||(m.current=P,u({type:"MEDIA_TIME_UPDATE",payload:P}))};return f.useEffect(()=>{const p=i.current;p&&(p.volume=s.volume,p.muted=s.muted,p.playbackRate=s.playbackRate)},[i,s.volume,s.muted,s.playbackRate]),f.useEffect(()=>{const p=i.current;if(p){if(!d){p.removeAttribute("src"),m.current={currentTime:-1,duration:-1,bufferedFraction:-1},y.current!==""&&u({type:"MEDIA_SOURCE_CLEARED"}),y.current="";return}p.getAttribute("src")!==d&&(p.src=d,p.load(),m.current={currentTime:-1,duration:-1,bufferedFraction:-1}),y.current=d}},[i,u,s.currentIndex,s.tracks,d]),l.jsx("audio",{ref:i,className:e,style:r,preload:n,crossOrigin:a,controls:!1,playsInline:!0,onTimeUpdate:p=>{v(p.currentTarget)},onLoadedMetadata:p=>{const E=p.currentTarget;m.current={currentTime:-1,duration:-1,bufferedFraction:-1},u({type:"MEDIA_LOADED_METADATA",payload:{duration:E.duration,bufferedFraction:Ne(E)}})},onSeeking:p=>v(p.currentTarget,!0),onSeeked:p=>v(p.currentTarget,!0),onEnded:()=>o(),onPlay:()=>u({type:"MEDIA_PLAY"}),onPause:()=>u({type:"MEDIA_PAUSE"}),onWaiting:()=>u({type:"MEDIA_WAITING"}),onCanPlay:()=>u({type:"MEDIA_CANPLAY"}),onProgress:p=>v(p.currentTarget,!0),onVolumeChange:p=>{const E=p.currentTarget;u({type:"MEDIA_VOLUME_SYNC",payload:{volume:E.volume,muted:E.muted}})},onError:()=>{var G;const p=i.current,E=(G=p==null?void 0:p.error)==null?void 0:G.code;u({type:"MEDIA_ERROR",payload:{message:E===1?"MEDIA_ERR_ABORTED":E===2?"MEDIA_ERR_NETWORK":E===3?"MEDIA_ERR_DECODE":E===4?"MEDIA_ERR_SRC_NOT_SUPPORTED":"MEDIA_ERR_UNKNOWN"}})}})}function S(e,r){return r<=0?0:Math.max(0,Math.min(r-1,e))}function De(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 K(e){return e?e.id!=null&&e.id!==""?`id:${e.id}`:`file:${e.fileUrl}`:""}function Lr(e,r){var u,s;if(!r)return 0;const n=e.findIndex(o=>o===r);if(n!==-1)return n;const a=K(r);if(!a)return 0;const t=[];for(let o=0;o<e.length;o+=1)K(e[o])===a&&t.push(o);if(t.length===0)return 0;if(t.length===1)return t[0];const i=typeof globalThis<"u"&&"process"in globalThis?(s=(u=globalThis.process)==null?void 0:u.env)==null?void 0:s.NODE_ENV:void 0;return i!=null&&i!=="production"&&console.warn("[@lucaismyname/ginger] Ambiguous track identity: multiple queue rows share the same fileUrl without a unique `id`. Resolving to the first match."),t[0]}function Fe(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 wr(e,r){if(r<0||r>=e.length)return[...e];const n=[...e];return n.splice(r,1),n}function Dr(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 Fr(e,r,n){return Fe(e,n,Math.max(0,Math.min(e.length,r+1)))}function Ur(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:S(n,i)}:n<i-1?{kind:"advance",nextIndex:n+1}:a==="all"?{kind:"wrap",nextIndex:0}:{kind:"stop",nextIndex:S(n,i)}}function Ue(e){const{tracks:r,currentIndex:n,repeatMode:a,playbackMode:t}=e,i=r.length;return i===0?0:t==="single"?S(n,i):n<i-1?n+1:a==="all"?0:S(n,i)}function Vr(e){const{tracks:r,currentIndex:n,repeatMode:a,playbackMode:t}=e,i=r.length;return i===0?0:t==="single"?S(n,i):n>0?n-1:a==="all"?i-1:0}function $r(e){return e==="off"?"all":e==="all"?"one":"off"}function Ve(e,r){return(e==null?void 0:e.artworkUrl)??r??void 0}function Br(e,r){return(e==null?void 0:e.album)??r??void 0}function j(e){return e.tracks[e.currentIndex]??null}function Ie(e){return e.errorMessage?"error":e.tracks.length===0?"idle":e.isBuffering?"loading":e.isPaused?Number.isFinite(e.duration)&&e.duration>0&&e.currentTime>=e.duration-.05?"ended":"paused":"playing"}function B(e){var 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 $e(e){const n=B(e)-e.currentTime;return Number.isFinite(n)?Math.max(0,n):0}function Pe(e){const r=B(e);return r>0?Math.min(1,Math.max(0,e.currentTime/r)):0}function Be(e){var n;const r=j(e);return Ve(r,(n=e.playlistMeta)==null?void 0:n.artworkUrl)}function Oe(e){var n;const r=j(e);return Br(r,(n=e.playlistMeta)==null?void 0:n.subtitle)}function F(e,r){function n(a){const t=b.useGingerState(),u=(r(t)??"").trim(),{className:s,style:o,fallback:d,empty:m,children:y}=a;if(!u){const h=m??d??null;return h?l.jsx("span",{className:s,style:o,children:h}):null}return y?l.jsx("span",{className:s,style:o,children:y(u,t)}):l.jsx("span",{className:s,style:o,children:u})}return n.displayName=e,n}function U(e,r){return F(e,n=>r(j(n)))}const Or=U("Ginger.Current.Title",e=>e==null?void 0:e.title),Yr=U("Ginger.Current.Artist",e=>e==null?void 0:e.artist),Qr=F("Ginger.Current.Album",e=>Oe(e)),Hr=U("Ginger.Current.Description",e=>e==null?void 0:e.description),Kr=F("Ginger.Current.Copyright",e=>{var n;const r=j(e);return(r==null?void 0:r.copyright)??((n=e.playlistMeta)==null?void 0:n.copyright)}),Xr=U("Ginger.Current.Genre",e=>e==null?void 0:e.genre),qr=U("Ginger.Current.Label",e=>e==null?void 0:e.label),zr=U("Ginger.Current.Isrc",e=>e==null?void 0:e.isrc),Wr=U("Ginger.Current.TrackNumber",e=>(e==null?void 0:e.trackNumber)!=null?String(e.trackNumber):void 0);function Ye({className:e,style:r,fallback:n,empty:a,children:t,format:i}){var d;const u=b.useGingerState(),s=(d=j(u))==null?void 0:d.year;if(typeof s!="number"||!Number.isFinite(s)){const m=a??n??null;return m?l.jsx("span",{className:e,style:r,children:m}):null}const o=i?i(s):String(s);return t?l.jsx("span",{className:e,style:r,children:t(o,u)}):l.jsx("span",{className:e,style:r,children:o})}Ye.displayName="Ginger.Current.Year";function Qe({className:e,style:r,fallback:n,empty:a,children:t,preserveWhitespace:i=!0}){var m;const u=b.useGingerState(),s=((m=j(u))==null?void 0:m.lyrics)??"",o=i?s.replace(/^\s+|\s+$/g,""):s.trim();if(!o){const y=a??n??null;return y?l.jsx("span",{className:e,style:r,children:y}):null}const d=i?{whiteSpace:"pre-wrap"}:void 0;return t?l.jsx("span",{className:e,style:{...d,...r},children:t(o,u)}):l.jsx("span",{className:e,style:{...d,...r},children:o})}Qe.displayName="Ginger.Current.Lyrics";const Le=/\[(\d{1,2}):(\d{2})(?:\.(\d{1,3}))?\]/g;function He(e){const r=[];for(const n of e.split(/\r?\n/)){const a=[...n.matchAll(Le)];if(a.length===0)continue;const t=n.replace(Le,"").trim();for(const i of a){const u=Number(i[1]??0),s=Number(i[2]??0),o=Number((i[3]??"0").padEnd(3,"0")),d=u*60+s+o/1e3;Number.isFinite(d)&&d>=0&&r.push({time:d,text:t})}}return r.sort((n,a)=>n.time-a.time)}function Ke(){const{tracks:e,currentIndex:r}=b.useGingerPlayback(),{currentTime:n}=b.useGingerMedia(),a=e[r],t=f.useMemo(()=>a?Array.isArray(a.lyricsTimed)&&a.lyricsTimed.length>0?[...a.lyricsTimed].filter(u=>Number.isFinite(u.time)&&u.time>=0).sort((u,s)=>u.time-s.time):typeof a.lyrics=="string"?He(a.lyrics):[]:[],[a]),i=f.useMemo(()=>{for(let u=t.length-1;u>=0;u-=1)if(n>=t[u].time)return u;return-1},[n,t]);return{lines:t,activeIndex:i,activeLine:i>=0?t[i]??null:null}}function Ae({className:e,style:r,fallback:n,empty:a,unstyled:t=!1,activeClassName:i,lineClassName:u,children:s}){const o=b.useGingerState(),{lines:d,activeIndex:m}=Ke();if(d.length===0){const h=a??n??null;return h?l.jsx("span",{className:e,style:r,children:h}):null}const y=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 l.jsx("ul",{className:e,style:{...y,...r},"aria-label":"Synced lyrics",children:d.map((h,k)=>{const v=k===m;return l.jsx("li",{"aria-current":v?"true":void 0,"data-ginger-active":v||void 0,className:[u,v?i:void 0].filter(Boolean).join(" ")||void 0,style:t?void 0:{padding:"var(--ginger-playlist-row-padding, 4px 8px)",fontWeight:v?600:400,opacity:v?1:.75},children:s?s(h,k,v,o):h.text},`${h.time}-${k}`)})})}Ae.displayName="Ginger.Current.LyricsSynced";function Xe(){const{tracks:e,currentIndex:r}=b.useGingerPlayback(),{currentTime:n,seek:a}=b.useGingerMedia(),t=f.useMemo(()=>{var s;return[...((s=e[r])==null?void 0:s.chapters)??[]].filter(o=>o&&Number.isFinite(o.startSeconds)&&o.startSeconds>=0).sort((o,d)=>o.startSeconds-d.startSeconds)},[r,e]),i=f.useMemo(()=>{if(t.length===0)return-1;for(let u=t.length-1;u>=0;u-=1)if(n>=t[u].startSeconds)return u;return-1},[n,t]);return{list:t,activeIndex:i,active:i>=0?t[i]??null:null,seekTo:u=>{const s=t[u];s&&a(s.startSeconds)}}}function Q(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 Re({className:e,style:r,fallback:n,empty:a,unstyled:t=!1,formatStart:i=Q,children:u}){const s=b.useGingerState(),{list:o,activeIndex:d,seekTo:m}=Xe();if(o.length===0){const h=a??n??null;return h?l.jsx("span",{className:e,style:r,children:h}):null}const y=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 l.jsx("ul",{className:e,style:{...y,...r},"aria-label":"Chapters",children:o.map((h,k)=>{const v=k===d;return l.jsx("li",{children:l.jsx("button",{type:"button","aria-current":v?"true":void 0,"data-ginger-active":v||void 0,onClick:()=>m(k),style:{width:t?void 0:"100%",textAlign:t?void 0:"left",border:t?void 0:"none",background:t?void 0:v?"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:u?u(h,k,v,s):l.jsxs("span",{children:[l.jsx("span",{style:{opacity:.75,marginRight:"0.35em"},children:i(h.startSeconds)}),h.title]})})},`${h.startSeconds}-${h.title}`)})})}Re.displayName="Ginger.Current.Chapters";function qe({visible:e=!1,className:r,style:n,fallback:a,empty:t,children:i}){var o;const u=b.useGingerState();if(!e)return null;const s=((o=j(u))==null?void 0:o.fileUrl)??"";if(!s){const d=t??a??null;return d?l.jsx("span",{className:r,style:n,children:d}):null}return i?l.jsx("span",{className:r,style:n,children:i(s,u)}):l.jsx("span",{className:r,style:n,children:s})}qe.displayName="Ginger.Current.FileUrl";function ze({className:e,style:r,fallback:n,empty:a,sizes:t,loading:i,onError:u,decoding:s,unstyled:o=!1,imgStyle:d}){const m=b.useGingerState(),y=j(m),h=Be(m);if(!h){const v=a??n??null;return v?l.jsx("span",{className:e,style:r,children:v}):null}const k=[y==null?void 0:y.title,y==null?void 0:y.artist].filter(Boolean).join(" — ")||"Artwork";return l.jsx("div",{className:e,style:o?{...r}:{background:"var(--ginger-artwork-bg, transparent)",borderRadius:"var(--ginger-artwork-radius, 0)",overflow:"hidden",...r},children:l.jsx("img",{src:h,alt:k,sizes:t,loading:i,decoding:s,onError:u,style:{display:o?void 0:"block",width:o?void 0:"100%",height:o?void 0:"100%",objectFit:o?void 0:"cover",...d}})})}ze.displayName="Ginger.Current.Artwork";function We({base:e=0,className:r,style:n,fallback:a,empty:t,children:i}){const u=b.useGingerState();if(u.tracks.length===0){const d=t??a??null;return d?l.jsx("span",{className:r,style:n,children:d}):null}const o=String(u.currentIndex+e);return i?l.jsx("span",{className:r,style:n,children:i(o,u)}):l.jsx("span",{className:r,style:n,children:o})}We.displayName="Ginger.Current.QueueIndex";function Je({className:e,style:r,fallback:n,empty:a,children:t}){const i=b.useGingerState(),u=String(i.tracks.length);if(i.tracks.length===0){const s=a??n??null;return s?l.jsx("span",{className:e,style:r,children:s}):null}return t?l.jsx("span",{className:e,style:r,children:t(u,i)}):l.jsx("span",{className:e,style:r,children:u})}Je.displayName="Ginger.Current.QueueLength";function Ze({base:e=0,separator:r=" / ",className:n,style:a,fallback:t,empty:i,children:u}){const s=b.useGingerState(),o=s.tracks.length;if(o===0){const h=i??t??null;return h?l.jsx("span",{className:n,style:a,children:h}):null}const d=String(s.currentIndex+e),m=String(o),y=`${d}${r}${m}`;return u?l.jsx("span",{className:n,style:a,children:u({index:d,length:m,label:y},s)}):l.jsx("span",{className:n,style:a,children:y})}Ze.displayName="Ginger.Current.QueuePosition";function Ge(e,r,n){const{className:a,style:t,fallback:i,empty:u,children:s,format:o=Q}=n;if(!(e>=0)||!Number.isFinite(e)){const m=u??i??null;return m?l.jsx("span",{className:a,style:t,children:m}):null}const d=o(e);return s?l.jsx("span",{className:a,style:t,children:s(d,r)}):l.jsx("span",{className:a,style:t,children:d})}function er(e){const r=b.useGingerState();return Ge(r.currentTime,r,e)}er.displayName="Ginger.Current.Elapsed";function rr(e){const r=b.useGingerState();return Ge(B(r),r,e)}rr.displayName="Ginger.Current.Duration";function nr(e){const r=b.useGingerState();return Ge($e(r),r,e)}nr.displayName="Ginger.Current.Remaining";function tr({className:e,style:r,fallback:n,empty:a,children:t}){const i=b.useGingerState(),u=B(i),s=Pe(i);if(!(u>0)){const o=a??n??null;return o?l.jsx("span",{className:e,style:r,children:o}):null}return t?l.jsx("span",{className:e,style:r,children:t({fraction:s,currentTime:i.currentTime,duration:u},i)}):l.jsx("span",{className:e,style:r,children:`${Math.round(s*100)}%`})}tr.displayName="Ginger.Current.Progress";function ar({className:e,style:r,height:n=4,showBuffered:a=!1,unstyled:t=!1}){const i=b.useGingerState(),u=`${Math.round(Pe(i)*100)}%`,s=`${Math.round(Math.min(1,Math.max(0,i.bufferedFraction))*100)}%`;return l.jsxs("div",{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?l.jsx("div",{style:{position:t?void 0:"absolute",left:t?void 0:0,top:t?void 0:0,height:t?void 0:"100%",width:s,background:t?void 0:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}}):null,l.jsx("div",{style:{position:t?void 0:"relative",width:u,height:t?void 0:"100%",background:t?void 0:"var(--ginger-primary-color, #111827)"}})]})}ar.displayName="Ginger.Current.TimeRail";function ir({className:e,style:r,height:n=4,unstyled:a=!1}){const t=b.useGingerState(),i=`${Math.round(Math.min(1,Math.max(0,t.bufferedFraction))*100)}%`;return l.jsx("div",{className:e,style:a?{...r}:{width:"100%",height:n,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",...r},"aria-hidden":!0,children:l.jsx("div",{style:{width:i,height:a?void 0:"100%",background:a?void 0:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}})})}ir.displayName="Ginger.Current.BufferRail";function ur({className:e,style:r,fallback:n,empty:a,children:t}){const i=b.useGingerState(),u=Ie(i);return t?l.jsx("span",{className:e,style:r,children:t(u,i)}):l.jsx("span",{className:e,style:r,children:u})}ur.displayName="Ginger.Current.PlaybackState";function sr({className:e,style:r,fallback:n,empty:a,live:t="polite",children:i}){const u=b.useGingerState(),s=u.errorMessage??"";if(!s){const o=a??n??null;return o?l.jsx("span",{className:e,style:r,children:o}):null}return i?l.jsx("span",{className:e,style:r,"aria-live":t,children:i(s,u)}):l.jsx("span",{className:e,style:r,"aria-live":t,children:s})}sr.displayName="Ginger.Current.ErrorMessage";const H={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 Jr(e){return e?{...H,...e,repeat:{...H.repeat,...e.repeat}}:H}const or=f.createContext(H);function Zr({locale:e,children:r}){const n=Jr(e);return l.jsx(or.Provider,{value:n,children:r})}function A(){return f.useContext(or)}function lr(){const e=b.useGingerPlayback(),r=b.useGingerMedia(),n=A(),a=f.useMemo(()=>b.gingerStateFromContextValues(e,r),[e,r]),t=B(a),i=t>0?a.currentTime:0,u=Number.isFinite(i)?i:0,s=t>0?`${Q(u)} of ${Q(t)}`:Q(u),o=d=>{r.seek(Number(d.currentTarget.value))};return{state:a,value:u,min:0,max:t>0?t:1,step:"any",ariaValueText:s,ariaLabel:n.seek,onSeekInput:o,onSeekChange:o}}function cr(){const e=b.useGingerPlayback(),r=b.useGingerMedia(),n=A(),a=f.useMemo(()=>b.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 dr(e){const r=b.useGingerPlayback(),n=A(),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 fr({playLabel:e="Play",pauseLabel:r="Pause",playAriaLabel:n,pauseAriaLabel:a,type:t="button",onClick:i,...u}){const s=A(),o=typeof e=="string"?e:s.play,d=typeof r=="string"?r:s.pause,m=dr({playAriaLabel:n??o,pauseAriaLabel:a??d});return l.jsx("button",{...u,type:t,"aria-label":m.ariaLabel,onClick:y=>{m.toggle(),i==null||i(y)},children:m.isPaused?e:r})}fr.displayName="Ginger.Control.PlayPause";function gr({type:e="button",onClick:r,...n}){const{repeatMode:a,cycleRepeat:t}=b.useGingerPlayback(),u=A().repeat[a];return l.jsx("button",{...n,type:e,"aria-label":u,onClick:s=>{t(),r==null||r(s)},children:u})}gr.displayName="Ginger.Control.Repeat";function pr({type:e="button",children:r="Next",onClick:n,...a}){const{next:t}=b.useGingerPlayback(),i=A();return l.jsx("button",{...a,type:e,"aria-label":i.nextTrack,onClick:u=>{t(),n==null||n(u)},children:r})}pr.displayName="Ginger.Control.Next";function mr({type:e="button",children:r="Previous",onClick:n,...a}){const{prev:t}=b.useGingerPlayback(),i=A();return l.jsx("button",{...a,type:e,"aria-label":i.previousTrack,onClick:u=>{t(),n==null||n(u)},children:r})}mr.displayName="Ginger.Control.Previous";function yr({type:e="button",children:r="Shuffle",onClick:n,...a}){const{isShuffled:t,toggleShuffle:i}=b.useGingerPlayback(),u=A();return l.jsx("button",{...a,type:e,"aria-pressed":t,"aria-label":u.shuffle,onClick:s=>{i(),n==null||n(s)},children:r})}yr.displayName="Ginger.Control.Shuffle";function br({inputStyle:e,style:r,unstyled:n=!1,...a}){const t=lr(),i=n?{...r,...e}:{width:"100%",...r,...e};return l.jsx("input",{...a,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:i})}br.displayName="Ginger.Control.SeekBar";function xr({inputStyle:e,style:r,unstyled:n=!1,...a}){const t=cr(),i=n?{...r,...e}:{width:"100%",...r,...e};return l.jsx("input",{...a,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:i})}xr.displayName="Ginger.Control.Volume";function hr({muteLabel:e,unmuteLabel:r,type:n="button",onClick:a,...t}){const{muted:i,toggleMute:u}=b.useGingerMedia(),s=A(),o=e??s.mute,d=r??s.unmute;return l.jsx("button",{...t,type:n,"aria-pressed":i,"aria-label":i?s.unmute:s.mute,onClick:m=>{u(),a==null||a(m)},children:i?d:o})}hr.displayName="Ginger.Control.Mute";const en=[.5,.75,1,1.25,1.5,2];function vr({rates:e=en,style:r,...n}){const{playbackRate:a,setPlaybackRate:t}=b.useGingerMedia(),i=A(),u=f.useMemo(()=>Array.from(new Set([...e,a])).sort((s,o)=>s-o),[e,a]);return l.jsx("select",{...n,"aria-label":i.playbackSpeed,value:String(a),style:r,onChange:s=>t(Number(s.currentTarget.value)),children:u.map(s=>l.jsx("option",{value:String(s),children:s===1?i.playbackRateNormal:i.playbackRateTimes(s)},s))})}vr.displayName="Ginger.Control.PlaybackRate";const Se=f.createContext(null);function rn(){const e=f.useContext(Se);if(!e)throw new Error("Ginger.Playlist.Track must be used inside <Ginger.Playlist>");return e}function kr({children:e,unstyled:r=!1,rowStyle:n,renderTrack:a,playOnSelect:t=!0,style:i,...u}){const{tracks:s,currentIndex:o,playTrackAt:d,selectTrackAt:m}=b.useGingerPlayback(),y=r?{...i}:{listStyle:"none",margin:0,padding:0,fontFamily:"var(--ginger-font-family, system-ui, sans-serif)",fontSize:"var(--ginger-font-size, 14px)",color:"var(--ginger-primary-color, #111827)",...i};return e!==void 0?l.jsx(Se.Provider,{value:{playOnSelect:t},children:l.jsx("ul",{style:y,...u,children:e})}):l.jsx(Se.Provider,{value:{playOnSelect:t},children:l.jsx("ul",{style:y,...u,children:s.map((k,v)=>{const I=v===o;return l.jsx("li",{children:l.jsx("button",{type:"button",onClick:()=>{t?d(v):m(v)},style:{width:r?void 0:"100%",textAlign:r?void 0:"left",border:r?void 0:"none",background:r?void 0:I?"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))":"transparent",color:r?void 0:"inherit",font:r?void 0:"inherit",cursor:r?void 0:"pointer",padding:r?void 0:"var(--ginger-playlist-row-padding, 6px 8px)",...n},children:a?a(k,v,I):l.jsxs("span",{children:[k.title,k.artist?` — ${k.artist}`:""]})})},`${v}-${K(k)}`)})})})}kr.displayName="Ginger.Playlist";function Mr({index:e,unstyled:r=!1,className:n,style:a,children:t,liProps:i,onClick:u,...s}){const{playOnSelect:o}=rn(),{tracks:d,currentIndex:m,playTrackAt:y,selectTrackAt:h}=b.useGingerPlayback(),k=e===m,v=d[e],I=v!=null?l.jsxs("span",{children:[v.title,v.artist?` — ${v.artist}`:""]}):null;return l.jsx("li",{...i,children:l.jsx("button",{type:"button","aria-current":k?"true":void 0,"data-ginger-active":k||void 0,className:n,style:{width:r?void 0:"100%",textAlign:r?void 0:"left",border:r?void 0:"none",background:r?void 0:k?"var(--ginger-playlist-active-bg, rgba(17, 24, 39, 0.06))":"transparent",color:r?void 0:"inherit",font:r?void 0:"inherit",cursor:r?void 0:"pointer",padding:r?void 0:"var(--ginger-playlist-row-padding, 6px 8px)",...a},...s,onClick:p=>{u==null||u(p),!p.defaultPrevented&&(o?y(e):h(e))},children:t??I})})}Mr.displayName="Ginger.Playlist.Track";const nn=Object.assign(kr,{Track:Mr}),tn=F("Ginger.Queue.Title",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.title}),an=F("Ginger.Queue.Subtitle",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.subtitle}),un=F("Ginger.Queue.Description",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.description}),sn=F("Ginger.Queue.Copyright",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.copyright});function Tr({className:e,style:r,fallback:n,empty:a,unstyled:t=!1,imgStyle:i}){var d,m;const u=b.useGingerState(),s=(d=u.playlistMeta)==null?void 0:d.artworkUrl;if(!s){const y=a??n??null;return y?l.jsx("span",{className:e,style:r,children:y}):null}const o=((m=u.playlistMeta)==null?void 0:m.title)??"Playlist artwork";return l.jsx("span",{className:e,style:t?{...r}:{display:"inline-block",background:"var(--ginger-artwork-bg, #f3f4f6)",borderRadius:"var(--ginger-artwork-radius, 6px)",overflow:"hidden",...r},children:l.jsx("img",{src:s,alt:o,style:{display:t?void 0:"block",width:t?void 0:"100%",height:t?void 0:"100%",objectFit:t?void 0:"cover",...i}})})}Tr.displayName="Ginger.Queue.Artwork";function X(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):1}function ke(e){return Number.isFinite(e)?Math.min(4,Math.max(.25,e)):1}const w={currentTime:0,duration:0,bufferedFraction:0,isBuffering:!1,errorMessage:null},on={...w,volume:1,muted:!1,playbackRate:1};function Er(e){const r=[...e.tracks];let n=S(e.currentIndex??0,r.length),a=null,t=r;return e.isShuffled&&r.length>1&&(a=[...r],t=De(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,...on,volume:X(e.volume??1),muted:e.muted??!1,playbackRate:ke(e.playbackRate??1)}}function ln(e,r){switch(r.type){case"INIT":{const{tracks:n,currentIndex:a,playlistMeta:t,isPaused:i,isShuffled:u,repeatMode:s,playbackMode:o,volume:d,muted:m,playbackRate:y}=r.payload;return Er({tracks:n,currentIndex:a,playlistMeta:t??null,isPaused:i??!0,isShuffled:u??!1,repeatMode:s??"off",playbackMode:o??"playlist",volume:d,muted:m,playbackRate:y})}case"SET_QUEUE":{const{tracks:n,currentIndex:a}=r.payload,t=[...n],i=S(a??e.currentIndex,t.length);return{...e,tracks:t,currentIndex:i,isShuffled:!1,originalTracks:null,...w}}case"INSERT_TRACK":{const n=r.payload.index??e.tracks.length,a=Fe(e.tracks,r.payload.track,n);if(r.payload.autoPlay){const i=S(n,a.length);return{...e,tracks:a,currentIndex:i,isShuffled:!1,originalTracks:null,isPaused:!1,...w}}const t=n<=e.currentIndex?e.currentIndex+1:e.currentIndex;return{...e,tracks:a,isShuffled:!1,originalTracks:null,currentIndex:S(t,a.length)}}case"REMOVE_TRACK":{const n=r.payload.index,a=wr(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:S(t,a.length),...n===e.currentIndex?w:{}}}case"MOVE_TRACK":{const{fromIndex:n,toIndex:a}=r.payload,t=Dr(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:S(i,t.length)}}case"ADD_NEXT":{const n=Fr(e.tracks,e.currentIndex,r.payload.track);return{...e,tracks:n,isShuffled:!1,originalTracks:null}}case"SET_INDEX":{const n=S(r.payload.index,e.tracks.length),a=r.payload.autoPlay,t=a===!0?!1:a===!1?!0:e.isPaused;return{...e,currentIndex:n,...w,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:$r(e.repeatMode)};case"TOGGLE_SHUFFLE":{if(e.tracks.length<=1)return{...e,isShuffled:!1,originalTracks:null};if(!e.isShuffled){const i=[...e.tracks],u=De(i,e.currentIndex);return{...e,isShuffled:!0,originalTracks:i,tracks:u,currentIndex:0}}const n=e.originalTracks?[...e.originalTracks]:[...e.tracks],a=e.tracks[e.currentIndex],t=Lr(n,a);return{...e,isShuffled:!1,originalTracks:null,tracks:n,currentIndex:S(t,n.length)}}case"NEXT":{const n=Ue(e),a=n===e.currentIndex;return{...e,currentIndex:n,...a?{}:w,isPaused:a?e.isPaused:!1}}case"PREV":{const n=Vr(e),a=n===e.currentIndex;return{...e,currentIndex:n,...a?{}:w,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,...w};case"SET_VOLUME":return{...e,volume:X(r.payload)};case"SET_MUTED":return{...e,muted:r.payload};case"TOGGLE_MUTE":return{...e,muted:!e.muted};case"SET_PLAYBACK_RATE":return{...e,playbackRate:ke(r.payload)};case"MEDIA_VOLUME_SYNC":{const{volume:n,muted:a}=r.payload,t=X(n);return t===e.volume&&a===e.muted?e:{...e,volume:t,muted:a}}default:return e}}function Ee(){return typeof navigator>"u"||!("mediaSession"in navigator)?null:navigator.mediaSession}function cn(e,r,n){var o;const a=r.tracks[r.currentIndex],t=a==null?void 0:a.title,i=a==null?void 0:a.artist,u=a==null?void 0:a.album,s=Ve(a,(o=r.playlistMeta)==null?void 0:o.artworkUrl);f.useEffect(()=>{const d=Ee();!e||!d||(d.metadata=new MediaMetadata({title:t??"Unknown track",artist:i,album:u,artwork:s?[{src:s}]:void 0}))},[e,t,i,u,s]),f.useEffect(()=>{const d=Ee();!e||!d||(d.playbackState=r.isPaused?"paused":"playing")},[e,r.isPaused]),f.useEffect(()=>{const d=Ee();if(!(!e||!d)){try{d.setActionHandler("play",n.play),d.setActionHandler("pause",n.pause),d.setActionHandler("nexttrack",n.next),d.setActionHandler("previoustrack",n.prev),d.setActionHandler("seekto",m=>{typeof m.seekTime=="number"&&Number.isFinite(m.seekTime)&&n.seek(m.seekTime)})}catch{}return()=>{try{d.setActionHandler("play",null),d.setActionHandler("pause",null),d.setActionHandler("nexttrack",null),d.setActionHandler("previoustrack",null),d.setActionHandler("seekto",null)}catch{}}}},[e,n])}const dn={"--ginger-primary-color":"#111827","--ginger-muted-color":"#6b7280","--ginger-font-size":"14px","--ginger-font-family":"system-ui, sans-serif","--ginger-playlist-row-padding":"6px 8px","--ginger-artwork-radius":"6px","--ginger-artwork-bg":"#f3f4f6","--ginger-playlist-active-bg":"rgba(17, 24, 39, 0.06)","--ginger-buffer-color":"rgba(107, 114, 128, 0.35)","--ginger-focus-ring":"0 0 0 2px rgba(59, 130, 246, 0.45)"};function fn({children:e,initialTracks:r=[],initialIndex:n=0,initialPlaylistMeta:a=null,initialShuffle:t=!1,initialRepeatMode:i="off",initialPlaybackMode:u="playlist",initialPaused:s=!0,initialVolume:o=1,initialMuted:d=!1,initialPlaybackRate:m=1,initialStateKey:y,locale:h,mediaSession:k=!1,beforePlay:v,onPlayBlocked:I,persistence:p,hydrateOnMount:E=!1,resumeOnTrackChange:P=!1,unstyled:G=!1,className:Me,style:O,onTrackChange:q,onPlay:z,onPause:W,onQueueEnd:J,onError:Z}){var _e;const D=f.useRef(null),[c,x]=f.useReducer(ln,void 0,()=>Er({tracks:r,currentIndex:n,playlistMeta:a,isPaused:s,isShuffled:t,repeatMode:i,playbackMode:u,volume:o,muted:d,playbackRate:m})),Ce=f.useRef(c),Te=f.useRef({tracks:r,currentIndex:n,playlistMeta:a,isPaused:s,isShuffled:t,repeatMode:i,playbackMode:u,volume:o,muted:d,playbackRate:m});Te.current={tracks:r,currentIndex:n,playlistMeta:a,isPaused:s,isShuffled:t,repeatMode:i,playbackMode:u,volume:o,muted:d,playbackRate:m};const Y=f.useRef(void 0);f.useEffect(()=>{if(y===void 0){Y.current=void 0;return}if(Y.current===void 0){Y.current=y;return}if(Y.current===y)return;Y.current=y;const g=Te.current;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(()=>{Ce.current=c},[c]);const je=c.tracks[c.currentIndex]??null;f.useEffect(()=>{q==null||q(je,c.currentIndex)},[je,c.currentIndex,q]),f.useEffect(()=>{c.errorMessage&&(Z==null||Z(c.errorMessage))},[c.errorMessage,Z]);const ee=f.useRef(void 0);f.useEffect(()=>{if(ee.current===void 0){ee.current=c.isPaused;return}ee.current!==c.isPaused&&(c.isPaused?W==null||W():z==null||z()),ee.current=c.isPaused},[c.isPaused,W,z]);const _=f.useCallback(()=>{x({type:"PLAY"})},[]),N=f.useCallback(()=>{var g;x({type:"PAUSE"}),(g=D.current)==null||g.pause()},[]),re=f.useCallback(()=>{c.isPaused?_():N()},[N,_,c.isPaused]),L=f.useCallback(g=>{const M=D.current;M&&Number.isFinite(g)&&(M.currentTime=Math.max(0,g))},[]),ne=f.useCallback(g=>{x({type:"SET_VOLUME",payload:X(g)})},[]),te=f.useCallback(g=>{x({type:"SET_MUTED",payload:g})},[]),ae=f.useCallback(()=>{x({type:"TOGGLE_MUTE"})},[]),ie=f.useCallback(g=>{x({type:"SET_PLAYBACK_RATE",payload:ke(g)})},[]),V=f.useCallback(()=>{x({type:"NEXT"})},[]),$=f.useCallback(()=>{x({type:"PREV"})},[]),ue=f.useCallback(g=>{x({type:"SET_REPEAT",payload:g})},[]),se=f.useCallback(()=>{x({type:"CYCLE_REPEAT"})},[]),oe=f.useCallback(()=>{x({type:"TOGGLE_SHUFFLE"})},[]),le=f.useCallback((g,M)=>{x({type:"SET_QUEUE",payload:{tracks:g,currentIndex:M}})},[]),ce=f.useCallback((g,M,T)=>{x({type:"INSERT_TRACK",payload:{track:g,index:M,autoPlay:T}})},[]),de=f.useCallback(g=>{x({type:"REMOVE_TRACK",payload:{index:g}})},[]),fe=f.useCallback((g,M)=>{x({type:"MOVE_TRACK",payload:{fromIndex:g,toIndex:M}})},[]),ge=f.useCallback(g=>{x({type:"ADD_NEXT",payload:{track:g}})},[]),pe=f.useCallback(g=>{x({type:"SET_INDEX",payload:{index:g,autoPlay:!0}})},[]),me=f.useCallback(g=>{x({type:"SET_INDEX",payload:{index:g,autoPlay:!1}})},[]),ye=f.useCallback(g=>{x({type:"SET_PLAYLIST_META",payload:g})},[]),be=f.useCallback(g=>{x({type:"SET_PLAYBACK_MODE",payload:g})},[]),xe=f.useCallback(g=>{x({type:"INIT",payload:g})},[]);f.useEffect(()=>{if(!p||!E)return;const g=p.get("ginger:volume"),M=p.get("ginger:muted"),T=p.get("ginger:playbackRate"),C=p.get("ginger:repeatMode"),ve=p.get("ginger:currentIndex"),R=Te.current;x({type:"INIT",payload:{tracks:R.tracks,playlistMeta:R.playlistMeta,isPaused:R.isPaused,isShuffled:R.isShuffled,playbackMode:R.playbackMode,currentIndex:typeof ve=="number"?ve:R.currentIndex,repeatMode:C==="off"||C==="all"||C==="one"?C:R.repeatMode,volume:typeof g=="number"?g:R.volume,muted:typeof M=="boolean"?M:R.muted,playbackRate:typeof T=="number"?T:R.playbackRate}})},[E,p]),f.useEffect(()=>{p&&(p.set("ginger:volume",c.volume),p.set("ginger:muted",c.muted),p.set("ginger:playbackRate",c.playbackRate),p.set("ginger:repeatMode",c.repeatMode),p.set("ginger:currentIndex",c.currentIndex))},[p,c.volume,c.muted,c.playbackRate,c.repeatMode,c.currentIndex]),f.useEffect(()=>{if(!p||!P)return;const g=c.tracks[c.currentIndex];if(!g)return;const M=`ginger:resume:${K(g)}`,T=p.get(M);typeof T=="number"&&Number.isFinite(T)&&L(T)},[p,P,c.currentIndex,c.tracks,L]),f.useEffect(()=>{if(!p||!P)return;const g=c.tracks[c.currentIndex];if(!g||!(c.currentTime>=0))return;const M=`ginger:resume:${K(g)}`,T=setTimeout(()=>p.set(M,c.currentTime),250);return()=>clearTimeout(T)},[p,P,c.currentIndex,c.tracks,c.currentTime]);const Sr=(_e=c.tracks[c.currentIndex])==null?void 0:_e.fileUrl;f.useEffect(()=>{const g=D.current;if(!g)return;if(c.isPaused){g.pause();return}let M=!1;return(async()=>{if(v){let T=!1;try{T=await v()}catch(C){const ve=C instanceof Error?C.message:"beforePlay rejected";x({type:"MEDIA_ERROR",payload:{message:ve}});return}if(!T){M||(x({type:"PAUSE"}),I==null||I());return}}M||g.play().catch(T=>{const C=T instanceof Error?T.message:typeof T=="string"?T:"Playback failed (e.g. autoplay blocked or unavailable source)";x({type:"MEDIA_ERROR",payload:{message:C}})})})(),()=>{M=!0}},[v,Sr,I,c.isPaused]);const he=f.useCallback(()=>{const g=Ur(Ce.current);if(g.kind==="replay_same"){const T=D.current;T&&(T.currentTime=0),x({type:"PLAY"});return}if(g.kind==="stop"){x({type:"PAUSE"}),J==null||J();return}const M=g.nextIndex;x({type:"SET_INDEX",payload:{index:M,autoPlay:!0}})},[J]),Ir=f.useMemo(()=>({play:_,pause:N,next:V,prev:$,seek:L}),[_,N,V,$,L]);cn(!!k,c,Ir);const Pr=h!=null&&h.seek&&/[\u0590-\u08FF]/.test(h.seek)?"rtl":"ltr",Ar=f.useMemo(()=>({state:c,dispatch:x,audioRef:D,notifyEnded:he,init:xe,play:_,pause:N,togglePlayPause:re,seek:L,setVolume:ne,setMuted:te,toggleMute:ae,setPlaybackRate:ie,next:V,prev:$,setRepeatMode:ue,cycleRepeat:se,toggleShuffle:oe,setQueue:le,insertTrackAt:ce,removeTrackAt:de,moveTrack:fe,enqueueNext:ge,playTrackAt:pe,selectTrackAt:me,setPlaylistMeta:ye,setPlaybackMode:be}),[se,x,xe,V,he,N,_,pe,ce,de,fe,ge,me,$,L,te,ie,le,ue,ye,be,ne,c,ae,re,oe]),Rr=f.useMemo(()=>({tracks:c.tracks,currentIndex:c.currentIndex,isPaused:c.isPaused,isShuffled:c.isShuffled,repeatMode:c.repeatMode,originalTracks:c.originalTracks,playlistMeta:c.playlistMeta,init:xe,play:_,pause:N,togglePlayPause:re,next:V,prev:$,setRepeatMode:ue,cycleRepeat:se,toggleShuffle:oe,playbackMode:c.playbackMode,setQueue:le,insertTrackAt:ce,removeTrackAt:de,moveTrack:fe,enqueueNext:ge,playTrackAt:pe,selectTrackAt:me,setPlaylistMeta:ye,setPlaybackMode:be,dispatch:x}),[c.tracks,c.currentIndex,c.isPaused,c.isShuffled,c.repeatMode,c.playbackMode,c.originalTracks,c.playlistMeta,xe,_,N,re,V,$,ue,se,oe,le,ce,de,fe,ge,pe,me,ye,be,x]),Gr=f.useMemo(()=>({currentTime:c.currentTime,duration:c.duration,bufferedFraction:c.bufferedFraction,isBuffering:c.isBuffering,errorMessage:c.errorMessage,volume:c.volume,muted:c.muted,playbackRate:c.playbackRate,seek:L,setVolume:ne,setMuted:te,toggleMute:ae,setPlaybackRate:ie,audioRef:D,notifyEnded:he,dispatch:x}),[c.currentTime,c.duration,c.bufferedFraction,c.isBuffering,c.errorMessage,c.volume,c.muted,c.playbackRate,L,ne,te,ae,ie,D,he,x]),Cr=Ie(c),jr=f.useMemo(()=>G?O:{...dn,...O},[O,G]);return l.jsx(Zr,{locale:h,children:l.jsx(b.GingerPlaybackContext.Provider,{value:Rr,children:l.jsx(b.GingerMediaContext.Provider,{value:Gr,children:l.jsx(we.Provider,{value:Ar,children:l.jsx("div",{className:Me,style:jr,"data-ginger-playback":Cr,dir:Pr,children:e})})})})})}const gn={Provider:fn,Player:Nr,Current:{Title:Or,Artist:Yr,Album:Qr,Description:Hr,Copyright:Kr,Genre:Xr,Label:qr,Isrc:zr,TrackNumber:Wr,Year:Ye,Lyrics:Qe,LyricsSynced:Ae,Chapters:Re,FileUrl:qe,Artwork:ze,QueueIndex:We,QueueLength:Je,QueuePosition:Ze,Elapsed:er,Duration:rr,Remaining:nr,Progress:tr,TimeRail:ar,BufferRail:ir,PlaybackState:ur,ErrorMessage:sr},Queue:{Title:tn,Subtitle:an,Description:un,Copyright:sn,Artwork:Tr},Control:{PlayPause:fr,Repeat:gr,Next:pr,Previous:mr,Shuffle:yr,SeekBar:br,Volume:xr,Mute:hr,PlaybackRate:vr},Playlist:nn};exports.Chapters=Re;exports.Ginger=gn;exports.LyricsSynced=Ae;exports.clampPlaybackRate=ke;exports.clampVolume=X;exports.computeNextIndex=Ue;exports.defaultGingerLocale=H;exports.derivePlaybackUiState=Ie;exports.effectiveDuration=B;exports.effectiveRemaining=$e;exports.getCurrentTrack=j;exports.parseLrc=He;exports.progressFraction=Pe;exports.resolvedAlbumLine=Oe;exports.resolvedArtwork=Be;exports.useGingerChapters=Xe;exports.useGingerLocale=A;exports.useGingerLyricsSync=Ke;exports.usePlayPauseBinding=dr;exports.useSeekBarBinding=lr;exports.useVolumeSlider=cr;
|
|
2
|
+
//# sourceMappingURL=ginger-DWOyCog6.cjs.map
|