@lucaismyname/ginger 0.0.3 → 0.0.8

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.
Files changed (40) hide show
  1. package/README.md +745 -0
  2. package/dist/audio/GingerPlayer.d.ts.map +1 -1
  3. package/dist/components/controls/Controls.d.ts +7 -3
  4. package/dist/components/controls/Controls.d.ts.map +1 -1
  5. package/dist/components/current/Artwork.d.ts.map +1 -1
  6. package/dist/components/current/Time.d.ts +11 -1
  7. package/dist/components/current/Time.d.ts.map +1 -1
  8. package/dist/components/current/index.d.ts +1 -1
  9. package/dist/components/current/index.d.ts.map +1 -1
  10. package/dist/components/playlist/GingerPlaylist.d.ts.map +1 -1
  11. package/dist/context/GingerContext.d.ts +3 -1
  12. package/dist/context/GingerContext.d.ts.map +1 -1
  13. package/dist/context/GingerLocaleContext.d.ts +9 -0
  14. package/dist/context/GingerLocaleContext.d.ts.map +1 -0
  15. package/dist/context/GingerProvider.d.ts +1 -1
  16. package/dist/context/GingerProvider.d.ts.map +1 -1
  17. package/dist/context/GingerSplitContexts.d.ts +42 -0
  18. package/dist/context/GingerSplitContexts.d.ts.map +1 -0
  19. package/dist/core/playbackReducer.d.ts.map +1 -1
  20. package/dist/core/playbackReducer.test.d.ts +2 -0
  21. package/dist/core/playbackReducer.test.d.ts.map +1 -0
  22. package/dist/core/queue.d.ts +2 -1
  23. package/dist/core/queue.d.ts.map +1 -1
  24. package/dist/core/transitions.test.d.ts +2 -0
  25. package/dist/core/transitions.test.d.ts.map +1 -0
  26. package/dist/ginger.d.ts +1 -0
  27. package/dist/ginger.d.ts.map +1 -1
  28. package/dist/hooks/useControlBindings.d.ts +40 -0
  29. package/dist/hooks/useControlBindings.d.ts.map +1 -0
  30. package/dist/hooks/useGinger.d.ts +3 -1
  31. package/dist/hooks/useGinger.d.ts.map +1 -1
  32. package/dist/index.cjs +1 -1
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.ts +10 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +999 -647
  37. package/dist/index.js.map +1 -1
  38. package/dist/types.d.ts +33 -0
  39. package/dist/types.d.ts.map +1 -1
  40. package/package.json +19 -5
@@ -1 +1 @@
1
- {"version":3,"file":"GingerPlayer.d.ts","sourceRoot":"","sources":["../../src/audio/GingerPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGhF,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;CACpE,CAAC;AAQF,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAoB,EAAE,WAAW,EAAE,EAAE,iBAAiB,2CAmFtG"}
1
+ {"version":3,"file":"GingerPlayer.d.ts","sourceRoot":"","sources":["../../src/audio/GingerPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGxF,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;CACpE,CAAC;AAQF,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAoB,EAAE,WAAW,EAAE,EAAE,iBAAiB,2CA0GtG"}
@@ -3,8 +3,12 @@ export type PlayPauseProps = ButtonHTMLAttributes<HTMLButtonElement> & {
3
3
  /** Optional labels; still headless—defaults are text for a11y */
4
4
  playLabel?: ReactNode;
5
5
  pauseLabel?: ReactNode;
6
+ /** Screen-reader label when paused (playing would start); defaults to match `playLabel` when it is a string */
7
+ playAriaLabel?: string;
8
+ /** Screen-reader label when playing (action would pause); defaults to match `pauseLabel` when it is a string */
9
+ pauseAriaLabel?: string;
6
10
  };
7
- export declare function PlayPause({ playLabel, pauseLabel, type, ...rest }: PlayPauseProps): import("react/jsx-runtime").JSX.Element;
11
+ export declare function PlayPause({ playLabel, pauseLabel, playAriaLabel, pauseAriaLabel, type, ...rest }: PlayPauseProps): import("react/jsx-runtime").JSX.Element;
8
12
  export declare namespace PlayPause {
9
13
  var displayName: string;
10
14
  }
@@ -28,14 +32,14 @@ export declare function Shuffle({ type, children, ...rest }: ShuffleProps): impo
28
32
  export declare namespace Shuffle {
29
33
  var displayName: string;
30
34
  }
31
- export type SeekBarProps = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "onChange"> & {
35
+ export type SeekBarProps = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "onChange" | "onInput" | "min" | "max" | "step"> & {
32
36
  inputStyle?: CSSProperties;
33
37
  };
34
38
  export declare function SeekBar({ inputStyle, style, ...rest }: SeekBarProps): import("react/jsx-runtime").JSX.Element;
35
39
  export declare namespace SeekBar {
36
40
  var displayName: string;
37
41
  }
38
- export type VolumeProps = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "onChange"> & {
42
+ export type VolumeProps = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "onChange" | "onInput" | "min" | "max" | "step"> & {
39
43
  inputStyle?: CSSProperties;
40
44
  };
41
45
  export declare function Volume({ inputStyle, style, ...rest }: VolumeProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"Controls.d.ts","sourceRoot":"","sources":["../../../src/components/controls/Controls.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,oBAAoB,EACrB,MAAM,OAAO,CAAC;AAIf,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACrE,iEAAiE;IACjE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB,CAAC;AAEF,wBAAgB,SAAS,CAAC,EAAE,SAAkB,EAAE,UAAoB,EAAE,IAAe,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,2CAO/G;yBAPe,SAAS;;;AAiBzB,MAAM,MAAM,WAAW,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AAElE,wBAAgB,MAAM,CAAC,EAAE,IAAe,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,2CAO/D;yBAPe,MAAM;;;AAWtB,MAAM,MAAM,SAAS,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AAChE,wBAAgB,IAAI,CAAC,EAAE,IAAe,EAAE,QAAiB,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,2CAO9E;yBAPe,IAAI;;;AAUpB,MAAM,MAAM,aAAa,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AACpE,wBAAgB,QAAQ,CAAC,EAAE,IAAe,EAAE,QAAqB,EAAE,GAAG,IAAI,EAAE,EAAE,aAAa,2CAO1F;yBAPe,QAAQ;;;AAUxB,MAAM,MAAM,YAAY,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AACnE,wBAAgB,OAAO,CAAC,EAAE,IAAe,EAAE,QAAoB,EAAE,GAAG,IAAI,EAAE,EAAE,YAAY,2CAOvF;yBAPe,OAAO;;;AAUvB,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC,GAAG;IACtG,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,wBAAgB,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,YAAY,2CAiBnE;yBAjBe,OAAO;;;AAqBvB,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC,GAAG;IACrG,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,wBAAgB,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,2CAejE;yBAfe,MAAM;;;AAmBtB,MAAM,MAAM,SAAS,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAChE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB,CAAC;AAEF,wBAAgB,IAAI,CAAC,EACnB,SAAkB,EAClB,WAAsB,EACtB,IAAe,EACf,GAAG,IAAI,EACR,EAAE,SAAS,2CAaX;yBAlBe,IAAI;;;AAwBpB,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,GAAG;IACpG,gDAAgD;IAChD,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,KAAoB,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,iBAAiB,2CAqBvF;yBArBe,YAAY"}
1
+ {"version":3,"file":"Controls.d.ts","sourceRoot":"","sources":["../../../src/components/controls/Controls.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,oBAAoB,EACrB,MAAM,OAAO,CAAC;AAKf,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACrE,iEAAiE;IACjE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,+GAA+G;IAC/G,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gHAAgH;IAChH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACxB,SAAkB,EAClB,UAAoB,EACpB,aAAa,EACb,cAAc,EACd,IAAe,EACf,GAAG,IAAI,EACR,EAAE,cAAc,2CAahB;yBApBe,SAAS;;;AAwBzB,MAAM,MAAM,WAAW,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AAElE,wBAAgB,MAAM,CAAC,EAAE,IAAe,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,2CAS/D;yBATe,MAAM;;;AAatB,MAAM,MAAM,SAAS,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AAChE,wBAAgB,IAAI,CAAC,EAAE,IAAe,EAAE,QAAiB,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,2CAQ9E;yBARe,IAAI;;;AAWpB,MAAM,MAAM,aAAa,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AACpE,wBAAgB,QAAQ,CAAC,EAAE,IAAe,EAAE,QAAqB,EAAE,GAAG,IAAI,EAAE,EAAE,aAAa,2CAQ1F;yBARe,QAAQ;;;AAWxB,MAAM,MAAM,YAAY,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AACnE,wBAAgB,OAAO,CAAC,EAAE,IAAe,EAAE,QAAoB,EAAE,GAAG,IAAI,EAAE,EAAE,YAAY,2CAcvF;yBAde,OAAO;;;AAiBvB,MAAM,MAAM,YAAY,GAAG,IAAI,CAC7B,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CACnE,GAAG;IACF,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,wBAAgB,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,YAAY,2CAiBnE;yBAjBe,OAAO;;;AAqBvB,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CACnE,GAAG;IACF,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,wBAAgB,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,2CAiBjE;yBAjBe,MAAM;;;AAqBtB,MAAM,MAAM,SAAS,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAChE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB,CAAC;AAEF,wBAAgB,IAAI,CAAC,EACnB,SAAS,EACT,WAAW,EACX,IAAe,EACf,GAAG,IAAI,EACR,EAAE,SAAS,2CAgBX;yBArBe,IAAI;;;AA2BpB,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,GAAG;IACpG,gDAAgD;IAChD,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,KAAoB,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,iBAAiB,2CAsBvF;yBAtBe,YAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"Artwork.d.ts","sourceRoot":"","sources":["../../../src/components/current/Artwork.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,MAAM,MAAM,YAAY,GAAG,gBAAgB,GACzC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG;IACxF,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEJ,wBAAgB,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,YAAY,kDAqCvH;yBArCe,OAAO"}
1
+ {"version":3,"file":"Artwork.d.ts","sourceRoot":"","sources":["../../../src/components/current/Artwork.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,MAAM,MAAM,YAAY,GAAG,gBAAgB,GACzC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG;IACxF,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEJ,wBAAgB,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,YAAY,kDAoCvH;yBApCe,OAAO"}
@@ -30,9 +30,19 @@ export declare namespace Progress {
30
30
  export type TimeRailProps = DisplayBaseProps & {
31
31
  /** 0-1 height in px for the rail */
32
32
  height?: number;
33
+ /** When true, shows a buffered range behind the progress fill (uses `bufferedFraction`). */
34
+ showBuffered?: boolean;
33
35
  };
34
- export declare function TimeRail({ className, style, height }: TimeRailProps): import("react/jsx-runtime").JSX.Element;
36
+ export declare function TimeRail({ className, style, height, showBuffered }: TimeRailProps): import("react/jsx-runtime").JSX.Element;
35
37
  export declare namespace TimeRail {
36
38
  var displayName: string;
37
39
  }
40
+ export type BufferRailProps = DisplayBaseProps & {
41
+ height?: number;
42
+ };
43
+ /** Buffered portion of the timeline (0…`bufferedFraction`); pair with `TimeRail` or use alone. */
44
+ export declare function BufferRail({ className, style, height }: BufferRailProps): import("react/jsx-runtime").JSX.Element;
45
+ export declare namespace BufferRail {
46
+ var displayName: string;
47
+ }
38
48
  //# sourceMappingURL=Time.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Time.d.ts","sourceRoot":"","sources":["../../../src/components/current/Time.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAKjE,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG;IAC7C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC;CAC7D,CAAC;AAqBF,wBAAgB,OAAO,CAAC,KAAK,EAAE,aAAa,iFAG3C;yBAHe,OAAO;;;AAOvB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,iFAG5C;yBAHe,QAAQ;;;AAOxB,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,iFAG7C;yBAHe,SAAS;;;AAOzB,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG;IAC7C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC;CAClH,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,aAAa,kDAmBtF;yBAnBe,QAAQ;;;AAuBxB,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG;IAC7C,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAU,EAAE,EAAE,aAAa,2CAmBvE;yBAnBe,QAAQ"}
1
+ {"version":3,"file":"Time.d.ts","sourceRoot":"","sources":["../../../src/components/current/Time.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAKjE,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG;IAC7C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC;CAC7D,CAAC;AAqBF,wBAAgB,OAAO,CAAC,KAAK,EAAE,aAAa,iFAG3C;yBAHe,OAAO;;;AAOvB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,iFAG5C;yBAHe,QAAQ;;;AAOxB,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,iFAG7C;yBAHe,SAAS;;;AAOzB,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG;IAC7C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC;CAClH,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,aAAa,kDAmBtF;yBAnBe,QAAQ;;;AAuBxB,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG;IAC7C,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAU,EAAE,YAAoB,EAAE,EAAE,aAAa,2CAwC7F;yBAxCe,QAAQ;;;AA4CxB,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,kGAAkG;AAClG,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAU,EAAE,EAAE,eAAe,2CAyB3E;yBAzBe,UAAU"}
@@ -4,6 +4,6 @@ export { Lyrics } from './Lyrics';
4
4
  export { FileUrl } from './FileUrl';
5
5
  export { Artwork } from './Artwork';
6
6
  export { QueueIndex, QueueLength, QueuePosition } from './QueueMeta';
7
- export { Elapsed, Duration, Remaining, Progress, TimeRail } from './Time';
7
+ export { BufferRail, Elapsed, Duration, Remaining, Progress, TimeRail } from './Time';
8
8
  export { PlaybackState, ErrorMessage } from './Playback';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -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,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC1E,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,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 +1 @@
1
- {"version":3,"file":"GingerPlaylist.d.ts","sourceRoot":"","sources":["../../../src/components/playlist/GingerPlaylist.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAYF,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,GAAG;IACrF,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,SAAS,CAAC;IAC5E,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,YAAmB,EACnB,KAAK,EACL,GAAG,IAAI,EACR,EAAE,mBAAmB,2CAiErB;yBAxEe,cAAc;;;AA4E9B,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,GAAG;IAC7F,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,OAAO,CAAC,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;CAC3C,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,OAAO,EACP,GAAG,UAAU,EACd,EAAE,wBAAwB,2CA2C1B;yBAnDe,mBAAmB;;;AAuDnC,eAAO,MAAM,sBAAsB;;CAEjC,CAAC"}
1
+ {"version":3,"file":"GingerPlaylist.d.ts","sourceRoot":"","sources":["../../../src/components/playlist/GingerPlaylist.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAYF,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,GAAG;IACrF,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,SAAS,CAAC;IAC5E,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,YAAmB,EACnB,KAAK,EACL,GAAG,IAAI,EACR,EAAE,mBAAmB,2CAiErB;yBAxEe,cAAc;;;AA4E9B,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,GAAG;IAC7F,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,OAAO,CAAC,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;CAC3C,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,OAAO,EACP,GAAG,UAAU,EACd,EAAE,wBAAwB,2CA2C1B;yBAnDe,mBAAmB;;;AAuDnC,eAAO,MAAM,sBAAsB;;CAEjC,CAAC"}
@@ -1,10 +1,12 @@
1
1
  import { Dispatch, MutableRefObject } from 'react';
2
- import { GingerAction, GingerState, PlaylistMeta, RepeatMode, Track } from '../types';
2
+ import { GingerAction, GingerInitPayload, GingerState, PlaylistMeta, RepeatMode, Track } from '../types';
3
3
  export type GingerContextValue = {
4
4
  state: GingerState;
5
5
  dispatch: Dispatch<GingerAction>;
6
6
  audioRef: MutableRefObject<HTMLAudioElement | null>;
7
7
  notifyEnded: () => void;
8
+ /** Full reset to match `createInitialState` / provider `initial*` props. */
9
+ init: (payload: GingerInitPayload) => void;
8
10
  play: () => void;
9
11
  pause: () => void;
10
12
  togglePlayPause: () => 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,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE3F,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,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,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"}
@@ -0,0 +1,9 @@
1
+ import { ReactNode } from 'react';
2
+ import { GingerLocaleMessages } from '../types';
3
+ export declare const defaultGingerLocale: GingerLocaleMessages;
4
+ export declare function GingerLocaleProvider({ locale, children, }: {
5
+ locale?: Partial<GingerLocaleMessages>;
6
+ children: ReactNode;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ export declare function useGingerLocale(): GingerLocaleMessages;
9
+ //# sourceMappingURL=GingerLocaleContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GingerLocaleContext.d.ts","sourceRoot":"","sources":["../../src/context/GingerLocaleContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAErD,eAAO,MAAM,mBAAmB,EAAE,oBAkBjC,CAAC;AAaF,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACvC,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAGA;AAED,wBAAgB,eAAe,IAAI,oBAAoB,CAEtD"}
@@ -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, 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, initialPaused, initialVolume, initialMuted, initialPlaybackRate, initialStateKey, locale, 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":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAmC,MAAM,UAAU,CAAC;AAarF,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,aAAkB,EAClB,YAAgB,EAChB,mBAA0B,EAC1B,cAAsB,EACtB,iBAAyB,EACzB,aAAoB,EACpB,aAAiB,EACjB,YAAoB,EACpB,mBAAuB,EACvB,SAAS,EACT,KAAK,EACL,aAAa,EACb,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,GACR,EAAE,mBAAmB,2CAyNrB"}
1
+ {"version":3,"file":"GingerProvider.d.ts","sourceRoot":"","sources":["../../src/context/GingerProvider.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAqB,mBAAmB,EAAmC,MAAM,UAAU,CAAC;AAkBxG,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,aAAkB,EAClB,YAAgB,EAChB,mBAA0B,EAC1B,cAAsB,EACtB,iBAAyB,EACzB,aAAoB,EACpB,aAAiB,EACjB,YAAoB,EACpB,mBAAuB,EACvB,eAAe,EACf,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EACb,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,GACR,EAAE,mBAAmB,2CAqXrB"}
@@ -0,0 +1,42 @@
1
+ import { Dispatch, MutableRefObject } from 'react';
2
+ import { GingerAction, GingerInitPayload, GingerMediaSlice, GingerPlaybackSlice, GingerState, PlaylistMeta, RepeatMode, Track } from '../types';
3
+ export type GingerPlaybackActions = {
4
+ init: (payload: GingerInitPayload) => void;
5
+ play: () => void;
6
+ pause: () => void;
7
+ togglePlayPause: () => void;
8
+ next: () => void;
9
+ prev: () => void;
10
+ setRepeatMode: (mode: RepeatMode) => void;
11
+ cycleRepeat: () => void;
12
+ toggleShuffle: () => void;
13
+ setQueue: (tracks: Track[], currentIndex?: number) => void;
14
+ playTrackAt: (index: number) => void;
15
+ selectTrackAt: (index: number) => void;
16
+ setPlaylistMeta: (meta: PlaylistMeta | null) => void;
17
+ dispatch: Dispatch<GingerAction>;
18
+ };
19
+ export type GingerPlaybackContextValue = GingerPlaybackSlice & GingerPlaybackActions;
20
+ export type GingerMediaActions = {
21
+ seek: (timeSeconds: number) => void;
22
+ setVolume: (volume: number) => void;
23
+ setMuted: (muted: boolean) => void;
24
+ toggleMute: () => void;
25
+ setPlaybackRate: (rate: number) => void;
26
+ audioRef: MutableRefObject<HTMLAudioElement | null>;
27
+ notifyEnded: () => void;
28
+ dispatch: Dispatch<GingerAction>;
29
+ };
30
+ export type GingerMediaContextValue = GingerMediaSlice & GingerMediaActions;
31
+ declare const GingerPlaybackContext: import('react').Context<GingerPlaybackContextValue | null>;
32
+ declare const GingerMediaContext: import('react').Context<GingerMediaContextValue | null>;
33
+ export declare function useGingerPlayback(): GingerPlaybackContextValue;
34
+ export declare function useGingerMedia(): GingerMediaContextValue;
35
+ /** Full merged state; prefer over `useGingerContext().state` so updates follow playback vs media splits. */
36
+ export declare function useGingerState(): GingerState;
37
+ /** Merge playback + media slices (for selectors and `useGinger`). */
38
+ export declare function gingerStateFromContexts(playback: GingerPlaybackSlice, media: GingerMediaSlice): GingerState;
39
+ /** Merge full context values into `GingerState` (strips action fields). */
40
+ export declare function gingerStateFromContextValues(pb: GingerPlaybackContextValue, md: GingerMediaContextValue): GingerState;
41
+ export { GingerPlaybackContext, GingerMediaContext };
42
+ //# sourceMappingURL=GingerSplitContexts.d.ts.map
@@ -0,0 +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,CA8Bb;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;AAI7E,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,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,WAAW,CAyBd;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CA2JnF"}
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;AAI7E,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,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,WAAW,CAyBd;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CA4JnF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=playbackReducer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbackReducer.test.d.ts","sourceRoot":"","sources":["../../src/core/playbackReducer.test.ts"],"names":[],"mappings":""}
@@ -1,5 +1,6 @@
1
1
  import { Track } from '../types';
2
2
  export declare function clampIndex(index: number, length: number): number;
3
3
  export declare function shuffleWithAnchor(tracks: Track[], anchorIndex: number): Track[];
4
- export declare function findIndexByFileUrl(tracks: Track[], fileUrl: string): number;
4
+ export declare function trackIdentity(track: Track | null | undefined): string;
5
+ export declare function findIndexByTrackIdentity(tracks: Track[], target: Track | null | undefined): number;
5
6
  //# sourceMappingURL=queue.d.ts.map
@@ -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,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG3E"}
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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transitions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitions.test.d.ts","sourceRoot":"","sources":["../../src/core/transitions.test.ts"],"names":[],"mappings":""}
package/dist/ginger.d.ts CHANGED
@@ -28,6 +28,7 @@ export declare const Ginger: {
28
28
  Remaining: typeof Current.Remaining;
29
29
  Progress: typeof Current.Progress;
30
30
  TimeRail: typeof Current.TimeRail;
31
+ BufferRail: typeof Current.BufferRail;
31
32
  PlaybackState: typeof Current.PlaybackState;
32
33
  ErrorMessage: typeof Current.ErrorMessage;
33
34
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ginger.d.ts","sourceRoot":"","sources":["../src/ginger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,OAAO,MAAM,gCAAgC,CAAC;AAE1D,OAAO,KAAK,KAAK,MAAM,iCAAiC,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+ClB,CAAC"}
1
+ {"version":3,"file":"ginger.d.ts","sourceRoot":"","sources":["../src/ginger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,OAAO,MAAM,gCAAgC,CAAC;AAE1D,OAAO,KAAK,KAAK,MAAM,iCAAiC,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDlB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { FormEvent } from 'react';
2
+ import { GingerState } from '../types';
3
+ export type SeekBarBinding = {
4
+ state: GingerState;
5
+ value: number;
6
+ min: number;
7
+ max: number;
8
+ step: "any";
9
+ ariaValueText: string;
10
+ ariaLabel: string;
11
+ onSeekInput: (e: FormEvent<HTMLInputElement>) => void;
12
+ onSeekChange: (e: FormEvent<HTMLInputElement>) => void;
13
+ };
14
+ /** Headless seek slider: bind return value to `<input type="range" />` or your own component. */
15
+ export declare function useSeekBarBinding(): SeekBarBinding;
16
+ export type VolumeBinding = {
17
+ state: GingerState;
18
+ value: number;
19
+ min: number;
20
+ max: number;
21
+ step: "any";
22
+ ariaValueText: string;
23
+ ariaLabel: string;
24
+ onVolumeInput: (e: FormEvent<HTMLInputElement>) => void;
25
+ onVolumeChange: (e: FormEvent<HTMLInputElement>) => void;
26
+ };
27
+ /** Headless volume slider. */
28
+ export declare function useVolumeSlider(): VolumeBinding;
29
+ export type PlayPauseBinding = {
30
+ isPaused: boolean;
31
+ toggle: () => void;
32
+ /** Resolved aria label for the button’s *next* action (play vs pause). */
33
+ ariaLabel: string;
34
+ };
35
+ /** Headless play/pause control; use with `playAriaLabel` / `pauseAriaLabel` from locale or custom strings. */
36
+ export declare function usePlayPauseBinding(options?: {
37
+ playAriaLabel?: string;
38
+ pauseAriaLabel?: string;
39
+ }): PlayPauseBinding;
40
+ //# sourceMappingURL=useControlBindings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useControlBindings.d.ts","sourceRoot":"","sources":["../../src/hooks/useControlBindings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM5C,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,KAAK,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CACxD,CAAC;AAEF,iGAAiG;AACjG,wBAAgB,iBAAiB,IAAI,cAAc,CA4BlD;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,KAAK,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACxD,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CAC1D,CAAC;AAEF,8BAA8B;AAC9B,wBAAgB,eAAe,IAAI,aAAa,CAqB/C;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,8GAA8G;AAC9G,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,gBAAgB,CAUnB"}
@@ -24,6 +24,8 @@ export declare function useGinger(): {
24
24
  playTrackAt: (index: number) => void;
25
25
  selectTrackAt: (index: number) => void;
26
26
  setPlaylistMeta: (meta: import('..').PlaylistMeta | null) => void;
27
- dispatch: import('react').Dispatch<import('../types').GingerAction>;
27
+ init: (payload: import('..').GingerInitPayload) => void;
28
+ audioRef: import('react').MutableRefObject<HTMLAudioElement | null>;
29
+ dispatch: import('react').Dispatch<import('..').GingerAction>;
28
30
  };
29
31
  //# sourceMappingURL=useGinger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useGinger.d.ts","sourceRoot":"","sources":["../../src/hooks/useGinger.ts"],"names":[],"mappings":"AAYA,wBAAgB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuDxB"}
1
+ {"version":3,"file":"useGinger.d.ts","sourceRoot":"","sources":["../../src/hooks/useGinger.ts"],"names":[],"mappings":"AAYA,wBAAgB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCxB"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),p=require("react"),ue=p.createContext(null);function y(){const e=p.useContext(ue);if(!e)throw new Error("Ginger components must be used within <Ginger.Provider>");return e}function ie(e){const{buffered:r,duration:t}=e;return!(t>0)||r.length===0?0:Math.min(1,r.end(r.length-1)/t)}function Be({className:e,style:r,preload:t="metadata",crossOrigin:n}){var f;const{audioRef:i,dispatch:a,state:u,notifyEnded:l}=y(),c=((f=u.tracks[u.currentIndex])==null?void 0:f.fileUrl)??"";return p.useEffect(()=>{const o=i.current;o&&(o.volume=u.volume,o.muted=u.muted,o.playbackRate=u.playbackRate)},[i,u.volume,u.muted,u.playbackRate]),p.useEffect(()=>{const o=i.current;if(o){if(!c){o.removeAttribute("src");return}o.getAttribute("src")!==c&&(o.src=c,o.load())}},[i,u.currentIndex,u.tracks,c]),s.jsx("audio",{ref:i,className:e,style:r,preload:t,crossOrigin:n,controls:!1,onTimeUpdate:o=>{const d=o.currentTarget;a({type:"MEDIA_TIME_UPDATE",payload:{currentTime:d.currentTime,duration:d.duration,bufferedFraction:ie(d)}})},onLoadedMetadata:o=>{const d=o.currentTarget;a({type:"MEDIA_LOADED_METADATA",payload:{duration:d.duration,bufferedFraction:ie(d)}})},onEnded:()=>l(),onPlay:()=>a({type:"MEDIA_PLAY"}),onPause:()=>a({type:"MEDIA_PAUSE"}),onWaiting:()=>a({type:"MEDIA_WAITING"}),onCanPlay:()=>a({type:"MEDIA_CANPLAY"}),onVolumeChange:o=>{const d=o.currentTarget;a({type:"MEDIA_VOLUME_SYNC",payload:{volume:d.volume,muted:d.muted}})},onError:()=>{var h;const o=i.current,d=(h=o==null?void 0:o.error)==null?void 0:h.code;a({type:"MEDIA_ERROR",payload:{message:d===1?"MEDIA_ERR_ABORTED":d===2?"MEDIA_ERR_NETWORK":d===3?"MEDIA_ERR_DECODE":d===4?"MEDIA_ERR_SRC_NOT_SUPPORTED":"MEDIA_ERR_UNKNOWN"}})}})}function C(e,r){return r<=0?0:Math.max(0,Math.min(r-1,e))}function se(e,r){if(e.length<=1)return[...e];const t=e[r];if(!t)return[...e];const n=e.filter((i,a)=>a!==r);for(let i=n.length-1;i>0;i--){const a=Math.floor(Math.random()*(i+1));[n[i],n[a]]=[n[a],n[i]]}return[t,...n]}function Ve(e,r){const t=e.findIndex(n=>n.fileUrl===r);return t===-1?0:t}function $e(e){const{tracks:r,currentIndex:t,repeatMode:n}=e,i=r.length;return i===0?{kind:"stop",nextIndex:0}:n==="one"?{kind:"replay_same"}:t<i-1?{kind:"advance",nextIndex:t+1}:n==="all"?{kind:"wrap",nextIndex:0}:{kind:"stop",nextIndex:C(t,i)}}function Qe(e){const{tracks:r,currentIndex:t,repeatMode:n}=e,i=r.length;return i===0?0:t<i-1?t+1:n==="all"?0:C(t,i)}function Xe(e){const{tracks:r,currentIndex:t,repeatMode:n}=e,i=r.length;return i===0?0:t>0?t-1:n==="all"?i-1:0}function We(e){return e==="off"?"all":e==="all"?"one":"off"}function qe(e,r){return(e==null?void 0:e.artworkUrl)??r??void 0}function Ke(e,r){return(e==null?void 0:e.album)??r??void 0}function T(e){return e.tracks[e.currentIndex]??null}function le(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 S(e){var n;const r=e.duration;if(Number.isFinite(r)&&r>0)return r;const t=(n=e.tracks[e.currentIndex])==null?void 0:n.durationSeconds;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:0}function oe(e){const t=S(e)-e.currentTime;return Number.isFinite(t)?Math.max(0,t):0}function U(e){const r=S(e);return r>0?Math.min(1,Math.max(0,e.currentTime/r)):0}function ce(e){var t;const r=T(e);return qe(r,(t=e.playlistMeta)==null?void 0:t.artworkUrl)}function de(e){var t;const r=T(e);return Ke(r,(t=e.playlistMeta)==null?void 0:t.subtitle)}function v(e,r){function t(n){const{state:i}=y(),u=(r(i)??"").trim(),{className:l,style:c,fallback:f,empty:o,children:d}=n;if(!u){const m=o??f??null;return m?s.jsx("span",{className:l,style:c,children:m}):null}return d?s.jsx("span",{className:l,style:c,children:d(u,i)}):s.jsx("span",{className:l,style:c,children:u})}return t.displayName=e,t}function I(e,r){return v(e,t=>r(T(t)))}const ze=I("Ginger.Current.Title",e=>e==null?void 0:e.title),He=I("Ginger.Current.Artist",e=>e==null?void 0:e.artist),Je=v("Ginger.Current.Album",e=>de(e)),Ze=I("Ginger.Current.Description",e=>e==null?void 0:e.description),er=v("Ginger.Current.Copyright",e=>{var t;const r=T(e);return(r==null?void 0:r.copyright)??((t=e.playlistMeta)==null?void 0:t.copyright)}),rr=I("Ginger.Current.Genre",e=>e==null?void 0:e.genre),tr=I("Ginger.Current.Label",e=>e==null?void 0:e.label),nr=I("Ginger.Current.Isrc",e=>e==null?void 0:e.isrc),ir=I("Ginger.Current.TrackNumber",e=>(e==null?void 0:e.trackNumber)!=null?String(e.trackNumber):void 0);function fe({className:e,style:r,fallback:t,empty:n,children:i,format:a}){var f;const{state:u}=y(),l=(f=T(u))==null?void 0:f.year;if(typeof l!="number"||!Number.isFinite(l)){const o=n??t??null;return o?s.jsx("span",{className:e,style:r,children:o}):null}const c=a?a(l):String(l);return i?s.jsx("span",{className:e,style:r,children:i(c,u)}):s.jsx("span",{className:e,style:r,children:c})}fe.displayName="Ginger.Current.Year";function pe({className:e,style:r,fallback:t,empty:n,children:i,preserveWhitespace:a=!0}){var o;const{state:u}=y(),l=((o=T(u))==null?void 0:o.lyrics)??"",c=a?l.replace(/^\s+|\s+$/g,""):l.trim();if(!c){const d=n??t??null;return d?s.jsx("span",{className:e,style:r,children:d}):null}const f=a?{whiteSpace:"pre-wrap"}:void 0;return i?s.jsx("span",{className:e,style:{...f,...r},children:i(c,u)}):s.jsx("span",{className:e,style:{...f,...r},children:c})}pe.displayName="Ginger.Current.Lyrics";function ge({visible:e=!1,className:r,style:t,fallback:n,empty:i,children:a}){var c;const{state:u}=y();if(!e)return null;const l=((c=T(u))==null?void 0:c.fileUrl)??"";if(!l){const f=i??n??null;return f?s.jsx("span",{className:r,style:t,children:f}):null}return a?s.jsx("span",{className:r,style:t,children:a(l,u)}):s.jsx("span",{className:r,style:t,children:l})}ge.displayName="Ginger.Current.FileUrl";function ye({className:e,style:r,fallback:t,empty:n,sizes:i,loading:a,onError:u,decoding:l,imgStyle:c}){const{state:f}=y(),o=T(f),d=ce(f);if(!d){const h=n??t??null;return h?s.jsx("span",{className:e,style:r,children:h}):null}const m=[o==null?void 0:o.title,o==null?void 0:o.artist].filter(Boolean).join(" — ")||"Artwork";return s.jsx("span",{className:e,style:{display:"inline-block",background:"var(--ginger-artwork-bg, #f3f4f6)",borderRadius:"var(--ginger-artwork-radius, 6px)",overflow:"hidden",...r},children:s.jsx("img",{src:d,alt:m,sizes:i,loading:a,decoding:l,onError:u,style:{display:"block",width:"100%",height:"100%",objectFit:"cover",...c}})})}ye.displayName="Ginger.Current.Artwork";function me({base:e=0,className:r,style:t,fallback:n,empty:i,children:a}){const{state:u}=y();if(u.tracks.length===0){const f=i??n??null;return f?s.jsx("span",{className:r,style:t,children:f}):null}const c=String(u.currentIndex+e);return a?s.jsx("span",{className:r,style:t,children:a(c,u)}):s.jsx("span",{className:r,style:t,children:c})}me.displayName="Ginger.Current.QueueIndex";function xe({className:e,style:r,fallback:t,empty:n,children:i}){const{state:a}=y(),u=String(a.tracks.length);if(a.tracks.length===0){const l=n??t??null;return l?s.jsx("span",{className:e,style:r,children:l}):null}return i?s.jsx("span",{className:e,style:r,children:i(u,a)}):s.jsx("span",{className:e,style:r,children:u})}xe.displayName="Ginger.Current.QueueLength";function be({base:e=0,separator:r=" / ",className:t,style:n,fallback:i,empty:a,children:u}){const{state:l}=y(),c=l.tracks.length;if(c===0){const m=a??i??null;return m?s.jsx("span",{className:t,style:n,children:m}):null}const f=String(l.currentIndex+e),o=String(c),d=`${f}${r}${o}`;return u?s.jsx("span",{className:t,style:n,children:u({index:f,length:o,label:d},l)}):s.jsx("span",{className:t,style:n,children:d})}be.displayName="Ginger.Current.QueuePosition";function ar(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 L(e,r,t){const{className:n,style:i,fallback:a,empty:u,children:l,format:c=ar}=t;if(!(e>=0)||!Number.isFinite(e)){const o=u??a??null;return o?s.jsx("span",{className:n,style:i,children:o}):null}const f=c(e);return l?s.jsx("span",{className:n,style:i,children:l(f,r)}):s.jsx("span",{className:n,style:i,children:f})}function he(e){const{state:r}=y();return L(r.currentTime,r,e)}he.displayName="Ginger.Current.Elapsed";function ke(e){const{state:r}=y();return L(S(r),r,e)}ke.displayName="Ginger.Current.Duration";function Pe(e){const{state:r}=y();return L(oe(r),r,e)}Pe.displayName="Ginger.Current.Remaining";function Me({className:e,style:r,fallback:t,empty:n,children:i}){const{state:a}=y(),u=S(a),l=U(a);if(!(u>0)){const c=n??t??null;return c?s.jsx("span",{className:e,style:r,children:c}):null}return i?s.jsx("span",{className:e,style:r,children:i({fraction:l,currentTime:a.currentTime,duration:u},a)}):s.jsx("span",{className:e,style:r,children:`${Math.round(l*100)}%`})}Me.displayName="Ginger.Current.Progress";function Te({className:e,style:r,height:t=4}){const{state:n}=y(),i=`${Math.round(U(n)*100)}%`;return s.jsx("div",{className:e,style:{width:"100%",height:t,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",...r},"aria-hidden":!0,children:s.jsx("div",{style:{width:i,height:"100%",background:"var(--ginger-primary-color, #111827)"}})})}Te.displayName="Ginger.Current.TimeRail";function Ee({className:e,style:r,fallback:t,empty:n,children:i}){const{state:a}=y(),u=le(a);return i?s.jsx("span",{className:e,style:r,children:i(u,a)}):s.jsx("span",{className:e,style:r,children:u})}Ee.displayName="Ginger.Current.PlaybackState";function Ae({className:e,style:r,fallback:t,empty:n,children:i}){const{state:a}=y(),u=a.errorMessage??"";if(!u){const l=n??t??null;return l?s.jsx("span",{className:e,style:r,children:l}):null}return i?s.jsx("span",{className:e,style:r,children:i(u,a)}):s.jsx("span",{className:e,style:r,children:u})}Ae.displayName="Ginger.Current.ErrorMessage";function ve({playLabel:e="Play",pauseLabel:r="Pause",type:t="button",...n}){const{state:i,togglePlayPause:a}=y();return s.jsx("button",{type:t,"aria-label":i.isPaused?"Play":"Pause",onClick:a,...n,children:i.isPaused?e:r})}ve.displayName="Ginger.Control.PlayPause";const ae={off:"Repeat off",all:"Repeat all",one:"Repeat one"};function Ie({type:e="button",...r}){const{state:t,cycleRepeat:n}=y();return s.jsx("button",{type:e,"aria-label":ae[t.repeatMode],onClick:n,...r,children:ae[t.repeatMode]})}Ie.displayName="Ginger.Control.Repeat";function Ce({type:e="button",children:r="Next",...t}){const{next:n}=y();return s.jsx("button",{type:e,"aria-label":"Next track",onClick:n,...t,children:r})}Ce.displayName="Ginger.Control.Next";function Re({type:e="button",children:r="Previous",...t}){const{prev:n}=y();return s.jsx("button",{type:e,"aria-label":"Previous track",onClick:n,...t,children:r})}Re.displayName="Ginger.Control.Previous";function Se({type:e="button",children:r="Shuffle",...t}){const{state:n,toggleShuffle:i}=y();return s.jsx("button",{type:e,"aria-pressed":n.isShuffled,"aria-label":"Shuffle",onClick:i,...t,children:r})}Se.displayName="Ginger.Control.Shuffle";function je({inputStyle:e,style:r,...t}){const{state:n,seek:i}=y(),a=Number.isFinite(n.duration)&&n.duration>0?n.duration:0,u=a>0?n.currentTime:0;return s.jsx("input",{type:"range",min:0,max:a>0?a:1,step:"any",value:Number.isFinite(u)?u:0,"aria-label":"Seek",onChange:l=>i(Number(l.currentTarget.value)),style:{width:"100%",...r,...e},...t})}je.displayName="Ginger.Control.SeekBar";function Ge({inputStyle:e,style:r,...t}){const{state:n,setVolume:i}=y();return s.jsx("input",{type:"range",min:0,max:1,step:"any",value:n.volume,"aria-label":"Volume",onChange:a=>i(Number(a.currentTarget.value)),style:{width:"100%",...r,...e},...t})}Ge.displayName="Ginger.Control.Volume";function _e({muteLabel:e="Mute",unmuteLabel:r="Unmute",type:t="button",...n}){const{state:i,toggleMute:a}=y();return s.jsx("button",{type:t,"aria-pressed":i.muted,"aria-label":i.muted?"Unmute":"Mute",onClick:a,...n,children:i.muted?r:e})}_e.displayName="Ginger.Control.Mute";const ur=[.5,.75,1,1.25,1.5,2];function Ne({rates:e=ur,style:r,...t}){const{state:n,setPlaybackRate:i}=y(),a=p.useMemo(()=>Array.from(new Set([...e,n.playbackRate])).sort((u,l)=>u-l),[e,n.playbackRate]);return s.jsx("select",{"aria-label":"Playback speed",value:String(n.playbackRate),style:r,onChange:u=>i(Number(u.currentTarget.value)),...t,children:a.map(u=>s.jsx("option",{value:String(u),children:u===1?"1× normal":`${u}×`},u))})}Ne.displayName="Ginger.Control.PlaybackRate";const w=p.createContext(null);function sr(){const e=p.useContext(w);if(!e)throw new Error("Ginger.Playlist.Track must be used inside <Ginger.Playlist>");return e}function De({children:e,rowStyle:r,renderTrack:t,playOnSelect:n=!0,style:i,...a}){const{state:u,playTrackAt:l,selectTrackAt:c}=y(),f={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?s.jsx(w.Provider,{value:{playOnSelect:n},children:s.jsx("ul",{style:f,...a,children:e})}):s.jsx(w.Provider,{value:{playOnSelect:n},children:s.jsx("ul",{style:f,...a,children:u.tracks.map((d,m)=>{const h=m===u.currentIndex;return s.jsx("li",{children:s.jsx("button",{type:"button",onClick:()=>{n?l(m):c(m)},style:{width:"100%",textAlign:"left",border:"none",background:h?"rgba(17, 24, 39, 0.06)":"transparent",color:"inherit",font:"inherit",cursor:"pointer",padding:"var(--ginger-playlist-row-padding, 6px 8px)",...r},children:t?t(d,m,h):s.jsxs("span",{children:[d.title,d.artist?` — ${d.artist}`:""]})})},`${d.fileUrl}-${m}`)})})})}De.displayName="Ginger.Playlist";function we({index:e,className:r,style:t,children:n,liProps:i,onClick:a,...u}){const{playOnSelect:l}=sr(),{state:c,playTrackAt:f,selectTrackAt:o}=y(),d=e===c.currentIndex,m=c.tracks[e],h=m!=null?s.jsxs("span",{children:[m.title,m.artist?` — ${m.artist}`:""]}):null;return s.jsx("li",{...i,children:s.jsx("button",{type:"button","aria-current":d?"true":void 0,"data-ginger-active":d||void 0,className:r,style:{width:"100%",textAlign:"left",border:"none",background:d?"rgba(17, 24, 39, 0.06)":"transparent",color:"inherit",font:"inherit",cursor:"pointer",padding:"var(--ginger-playlist-row-padding, 6px 8px)",...t},...u,onClick:A=>{a==null||a(A),!A.defaultPrevented&&(l?f(e):o(e))},children:n??h})})}we.displayName="Ginger.Playlist.Track";const lr=Object.assign(De,{Track:we}),or=v("Ginger.Queue.Title",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.title}),cr=v("Ginger.Queue.Subtitle",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.subtitle}),dr=v("Ginger.Queue.Description",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.description}),fr=v("Ginger.Queue.Copyright",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.copyright});function Ue({className:e,style:r,fallback:t,empty:n,imgStyle:i}){var c,f;const{state:a}=y(),u=(c=a.playlistMeta)==null?void 0:c.artworkUrl;if(!u){const o=n??t??null;return o?s.jsx("span",{className:e,style:r,children:o}):null}const l=((f=a.playlistMeta)==null?void 0:f.title)??"Playlist artwork";return s.jsx("span",{className:e,style:{display:"inline-block",background:"var(--ginger-artwork-bg, #f3f4f6)",borderRadius:"var(--ginger-artwork-radius, 6px)",overflow:"hidden",...r},children:s.jsx("img",{src:u,alt:l,style:{display:"block",width:"100%",height:"100%",objectFit:"cover",...i}})})}Ue.displayName="Ginger.Queue.Artwork";function D(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):1}function F(e){return Number.isFinite(e)?Math.min(4,Math.max(.25,e)):1}const R={currentTime:0,duration:0,bufferedFraction:0,isBuffering:!1,errorMessage:null},pr={...R,volume:1,muted:!1,playbackRate:1};function Le(e){const r=[...e.tracks];let t=C(e.currentIndex??0,r.length),n=null,i=r;return e.isShuffled&&r.length>1&&(n=[...r],i=se(r,t),t=0),{tracks:i,currentIndex:t,isPaused:e.isPaused??!0,isShuffled:!!(e.isShuffled&&i.length>1),repeatMode:e.repeatMode??"off",originalTracks:n,playlistMeta:e.playlistMeta??null,...pr,volume:D(e.volume??1),muted:e.muted??!1,playbackRate:F(e.playbackRate??1)}}function gr(e,r){switch(r.type){case"INIT":{const{tracks:t,currentIndex:n,playlistMeta:i,isPaused:a,isShuffled:u,repeatMode:l,volume:c,muted:f,playbackRate:o}=r.payload;return Le({tracks:t,currentIndex:n,playlistMeta:i??null,isPaused:a??!0,isShuffled:u??!1,repeatMode:l??"off",volume:c,muted:f,playbackRate:o})}case"SET_QUEUE":{const{tracks:t,currentIndex:n}=r.payload,i=[...t],a=C(n??e.currentIndex,i.length);return{...e,tracks:i,currentIndex:a,...R}}case"SET_INDEX":{const t=C(r.payload.index,e.tracks.length),n=r.payload.autoPlay,i=n===!0?!1:n===!1?!0:e.isPaused;return{...e,currentIndex:t,...R,isPaused:i}}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:We(e.repeatMode)};case"TOGGLE_SHUFFLE":{if(e.tracks.length<=1)return{...e,isShuffled:!1,originalTracks:null};if(!e.isShuffled){const u=[...e.tracks],l=se(u,e.currentIndex);return{...e,isShuffled:!0,originalTracks:u,tracks:l,currentIndex:0}}const t=e.originalTracks?[...e.originalTracks]:[...e.tracks],n=e.tracks[e.currentIndex],i=(n==null?void 0:n.fileUrl)??"",a=Ve(t,i);return{...e,isShuffled:!1,originalTracks:null,tracks:t,currentIndex:C(a,t.length)}}case"NEXT":{const t=Qe(e),n=t===e.currentIndex;return{...e,currentIndex:t,...n?{}:R,isPaused:n?e.isPaused:!1}}case"PREV":{const t=Xe(e),n=t===e.currentIndex;return{...e,currentIndex:t,...n?{}:R,isPaused:n?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:D(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:F(r.payload)};case"MEDIA_VOLUME_SYNC":{const{volume:t,muted:n}=r.payload,i=D(t);return i===e.volume&&n===e.muted?e:{...e,volume:i,muted:n}}default:return e}}const yr={"--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"};function mr({children:e,initialTracks:r=[],initialIndex:t=0,initialPlaylistMeta:n=null,initialShuffle:i=!1,initialRepeatMode:a="off",initialPaused:u=!0,initialVolume:l=1,initialMuted:c=!1,initialPlaybackRate:f=1,className:o,style:d,onTrackChange:m,onPlay:h,onPause:A,onQueueEnd:j,onError:P}){var ne;const E=p.useRef(null),[x,b]=p.useReducer(gr,void 0,()=>Le({tracks:r,currentIndex:t,playlistMeta:n,isPaused:u,isShuffled:i,repeatMode:a,volume:l,muted:c,playbackRate:f})),O=x.tracks[x.currentIndex]??null;p.useEffect(()=>{m==null||m(O,x.currentIndex)},[O,x.currentIndex,m]),p.useEffect(()=>{x.errorMessage&&(P==null||P(x.errorMessage))},[x.errorMessage,P]);const G=p.useRef(void 0);p.useEffect(()=>{if(G.current===void 0){G.current=x.isPaused;return}G.current!==x.isPaused&&(x.isPaused?A==null||A():h==null||h()),G.current=x.isPaused},[x.isPaused,A,h]);const _=p.useCallback(()=>{var g;b({type:"PLAY"}),(g=E.current)==null||g.play().catch(k=>{b({type:"PAUSE"});const M=k instanceof Error?k.message:"Playback failed";P==null||P(M)})},[P]),N=p.useCallback(()=>{var g;b({type:"PAUSE"}),(g=E.current)==null||g.pause()},[]),Y=p.useCallback(()=>{x.isPaused?_():N()},[N,_,x.isPaused]),B=p.useCallback(g=>{const k=E.current;k&&Number.isFinite(g)&&(k.currentTime=Math.max(0,g))},[]),V=p.useCallback(g=>{b({type:"SET_VOLUME",payload:D(g)})},[]),$=p.useCallback(g=>{b({type:"SET_MUTED",payload:g})},[]),Q=p.useCallback(()=>{b({type:"TOGGLE_MUTE"})},[]),X=p.useCallback(g=>{b({type:"SET_PLAYBACK_RATE",payload:F(g)})},[]),W=p.useCallback(()=>{b({type:"NEXT"})},[]),q=p.useCallback(()=>{b({type:"PREV"})},[]),K=p.useCallback(g=>{b({type:"SET_REPEAT",payload:g})},[]),z=p.useCallback(()=>{b({type:"CYCLE_REPEAT"})},[]),H=p.useCallback(()=>{b({type:"TOGGLE_SHUFFLE"})},[]),J=p.useCallback((g,k)=>{b({type:"SET_QUEUE",payload:{tracks:g,currentIndex:k}})},[]),Z=p.useCallback(g=>{b({type:"SET_INDEX",payload:{index:g,autoPlay:!0}}),queueMicrotask(()=>{var k;(k=E.current)==null||k.play().catch(()=>{})})},[]),ee=p.useCallback(g=>{b({type:"SET_INDEX",payload:{index:g,autoPlay:!1}})},[]),re=p.useCallback(g=>{b({type:"SET_PLAYLIST_META",payload:g})},[]),Fe=(ne=x.tracks[x.currentIndex])==null?void 0:ne.fileUrl;p.useEffect(()=>{const g=E.current;g&&(x.isPaused?g.pause():g.play().catch(k=>{b({type:"PAUSE"});const M=k instanceof Error?k.message:"Playback failed";P==null||P(M)}))},[x.isPaused,Fe,P]);const te=p.useCallback(()=>{const g=$e(x);if(g.kind==="replay_same"){const M=E.current;M&&(M.currentTime=0,M.play().catch(()=>{})),b({type:"PLAY"});return}if(g.kind==="stop"){b({type:"PAUSE"}),j==null||j();return}const k=g.nextIndex;b({type:"SET_INDEX",payload:{index:k,autoPlay:!0}}),queueMicrotask(()=>{var M;(M=E.current)==null||M.play().catch(()=>{})})},[j,x]),Oe=p.useMemo(()=>({state:x,dispatch:b,audioRef:E,notifyEnded:te,play:_,pause:N,togglePlayPause:Y,seek:B,setVolume:V,setMuted:$,toggleMute:Q,setPlaybackRate:X,next:W,prev:q,setRepeatMode:K,cycleRepeat:z,toggleShuffle:H,setQueue:J,playTrackAt:Z,selectTrackAt:ee,setPlaylistMeta:re}),[z,b,W,te,N,_,Z,ee,q,B,$,X,J,K,re,V,x,Q,Y,H]),Ye=p.useMemo(()=>({...yr,...d}),[d]);return s.jsx(ue.Provider,{value:Oe,children:s.jsx("div",{className:o,style:Ye,children:e})})}const xr={Provider:mr,Player:Be,Current:{Title:ze,Artist:He,Album:Je,Description:Ze,Copyright:er,Genre:rr,Label:tr,Isrc:nr,TrackNumber:ir,Year:fe,Lyrics:pe,FileUrl:ge,Artwork:ye,QueueIndex:me,QueueLength:xe,QueuePosition:be,Elapsed:he,Duration:ke,Remaining:Pe,Progress:Me,TimeRail:Te,PlaybackState:Ee,ErrorMessage:Ae},Queue:{Title:or,Subtitle:cr,Description:dr,Copyright:fr,Artwork:Ue},Control:{PlayPause:ve,Repeat:Ie,Next:Ce,Previous:Re,Shuffle:Se,SeekBar:je,Volume:Ge,Mute:_e,PlaybackRate:Ne},Playlist:lr};function br(){const e=y(),{state:r}=e;return p.useMemo(()=>({state:r,currentTrack:T(r),playbackUi:le(r),duration:S(r),remaining:oe(r),progress:U(r),artworkUrl:ce(r),albumLine:de(r),play:e.play,pause:e.pause,togglePlayPause:e.togglePlayPause,seek:e.seek,setVolume:e.setVolume,setMuted:e.setMuted,toggleMute:e.toggleMute,setPlaybackRate:e.setPlaybackRate,next:e.next,prev:e.prev,setRepeatMode:e.setRepeatMode,cycleRepeat:e.cycleRepeat,toggleShuffle:e.toggleShuffle,setQueue:e.setQueue,playTrackAt:e.playTrackAt,selectTrackAt:e.selectTrackAt,setPlaylistMeta:e.setPlaylistMeta,dispatch:e.dispatch}),[e.cycleRepeat,e.dispatch,e.next,e.pause,e.play,e.playTrackAt,e.selectTrackAt,e.prev,e.seek,e.setMuted,e.setPlaybackRate,e.setPlaylistMeta,e.setQueue,e.setRepeatMode,e.setVolume,e.toggleMute,e.togglePlayPause,e.toggleShuffle,r])}exports.Ginger=xr;exports.useGinger=br;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),d=require("react"),he=d.createContext(null);function cr(){const e=d.useContext(he);if(!e)throw new Error("Ginger components must be used within <Ginger.Provider>");return e}function xe(e){const{buffered:r,duration:t}=e;return!(t>0)||r.length===0?0:Math.min(1,r.end(r.length-1)/t)}function dr({className:e,style:r,preload:t="metadata",crossOrigin:n}){var x;const{audioRef:a,dispatch:u,state:i,notifyEnded:o}=cr(),c=((x=i.tracks[i.currentIndex])==null?void 0:x.fileUrl)??"",p=d.useRef({currentTime:-1,duration:-1,bufferedFraction:-1}),g=(f,m=!1)=>{const k={currentTime:f.currentTime,duration:f.duration,bufferedFraction:xe(f)},M=p.current,R=Math.abs(k.currentTime-M.currentTime)>=.25||Math.abs(k.duration-M.duration)>=.01||Math.abs(k.bufferedFraction-M.bufferedFraction)>=.01;!m&&!R||(p.current=k,u({type:"MEDIA_TIME_UPDATE",payload:k}))};return d.useEffect(()=>{const f=a.current;f&&(f.volume=i.volume,f.muted=i.muted,f.playbackRate=i.playbackRate)},[a,i.volume,i.muted,i.playbackRate]),d.useEffect(()=>{const f=a.current;if(f){if(!c){f.removeAttribute("src"),p.current={currentTime:-1,duration:-1,bufferedFraction:-1};return}f.getAttribute("src")!==c&&(f.src=c,f.load(),p.current={currentTime:-1,duration:-1,bufferedFraction:-1})}},[a,i.currentIndex,i.tracks,c]),s.jsx("audio",{ref:a,className:e,style:r,preload:t,crossOrigin:n,controls:!1,playsInline:!0,onTimeUpdate:f=>{g(f.currentTarget)},onLoadedMetadata:f=>{const m=f.currentTarget;p.current={currentTime:-1,duration:-1,bufferedFraction:-1},u({type:"MEDIA_LOADED_METADATA",payload:{duration:m.duration,bufferedFraction:xe(m)}})},onSeeking:f=>g(f.currentTarget,!0),onSeeked:f=>g(f.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:f=>g(f.currentTarget,!0),onVolumeChange:f=>{const m=f.currentTarget;u({type:"MEDIA_VOLUME_SYNC",payload:{volume:m.volume,muted:m.muted}})},onError:()=>{var M;const f=a.current,m=(M=f==null?void 0:f.error)==null?void 0:M.code;u({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 N(e,r){return r<=0?0:Math.max(0,Math.min(r-1,e))}function ke(e,r){if(e.length<=1)return[...e];const t=e[r];if(!t)return[...e];const n=e.filter((a,u)=>u!==r);for(let a=n.length-1;a>0;a--){const u=Math.floor(Math.random()*(a+1));[n[a],n[u]]=[n[u],n[a]]}return[t,...n]}function pe(e){return e?e.id!=null&&e.id!==""?`id:${e.id}`:`file:${e.fileUrl}`:""}function fr(e,r){const t=pe(r);if(!t)return 0;const n=e.findIndex(a=>pe(a)===t);return n===-1?0:n}function pr(e){const{tracks:r,currentIndex:t,repeatMode:n}=e,a=r.length;return a===0?{kind:"stop",nextIndex:0}:n==="one"?{kind:"replay_same"}:t<a-1?{kind:"advance",nextIndex:t+1}:n==="all"?{kind:"wrap",nextIndex:0}:{kind:"stop",nextIndex:N(t,a)}}function gr(e){const{tracks:r,currentIndex:t,repeatMode:n}=e,a=r.length;return a===0?0:t<a-1?t+1:n==="all"?0:N(t,a)}function yr(e){const{tracks:r,currentIndex:t,repeatMode:n}=e,a=r.length;return a===0?0:t>0?t-1:n==="all"?a-1:0}function mr(e){return e==="off"?"all":e==="all"?"one":"off"}function br(e,r){return(e==null?void 0:e.artworkUrl)??r??void 0}function xr(e,r){return(e==null?void 0:e.album)??r??void 0}function E(e){return e.tracks[e.currentIndex]??null}function le(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 w(e){var n;const r=e.duration;if(Number.isFinite(r)&&r>0)return r;const t=(n=e.tracks[e.currentIndex])==null?void 0:n.durationSeconds;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:0}function Me(e){const t=w(e)-e.currentTime;return Number.isFinite(t)?Math.max(0,t):0}function ye(e){const r=w(e);return r>0?Math.min(1,Math.max(0,e.currentTime/r)):0}function Pe(e){var t;const r=E(e);return br(r,(t=e.playlistMeta)==null?void 0:t.artworkUrl)}function ve(e){var t;const r=E(e);return xr(r,(t=e.playlistMeta)==null?void 0:t.subtitle)}const Te=d.createContext(null),Ee=d.createContext(null);function P(){const e=d.useContext(Te);if(!e)throw new Error("Ginger hooks must be used within <Ginger.Provider>");return e}function A(){const e=d.useContext(Ee);if(!e)throw new Error("Ginger hooks must be used within <Ginger.Provider>");return e}function h(){const e=P(),r=A();return d.useMemo(()=>B(e,r),[e,r])}function hr(e,r){return{...e,...r}}function B(e,r){const{init:t,play:n,pause:a,togglePlayPause:u,next:i,prev:o,setRepeatMode:c,cycleRepeat:p,toggleShuffle:g,setQueue:x,playTrackAt:f,selectTrackAt:m,setPlaylistMeta:k,dispatch:M,...R}=e,{seek:L,setVolume:D,setMuted:I,toggleMute:l,setPlaybackRate:b,audioRef:de,notifyEnded:fe,dispatch:G,...$}=r;return{...R,...$}}function S(e,r){function t(n){const a=h(),i=(r(a)??"").trim(),{className:o,style:c,fallback:p,empty:g,children:x}=n;if(!i){const f=g??p??null;return f?s.jsx("span",{className:o,style:c,children:f}):null}return x?s.jsx("span",{className:o,style:c,children:x(i,a)}):s.jsx("span",{className:o,style:c,children:i})}return t.displayName=e,t}function C(e,r){return S(e,t=>r(E(t)))}const kr=C("Ginger.Current.Title",e=>e==null?void 0:e.title),Mr=C("Ginger.Current.Artist",e=>e==null?void 0:e.artist),Pr=S("Ginger.Current.Album",e=>ve(e)),vr=C("Ginger.Current.Description",e=>e==null?void 0:e.description),Tr=S("Ginger.Current.Copyright",e=>{var t;const r=E(e);return(r==null?void 0:r.copyright)??((t=e.playlistMeta)==null?void 0:t.copyright)}),Er=C("Ginger.Current.Genre",e=>e==null?void 0:e.genre),Rr=C("Ginger.Current.Label",e=>e==null?void 0:e.label),Ir=C("Ginger.Current.Isrc",e=>e==null?void 0:e.isrc),Ar=C("Ginger.Current.TrackNumber",e=>(e==null?void 0:e.trackNumber)!=null?String(e.trackNumber):void 0);function Re({className:e,style:r,fallback:t,empty:n,children:a,format:u}){var p;const i=h(),o=(p=E(i))==null?void 0:p.year;if(typeof o!="number"||!Number.isFinite(o)){const g=n??t??null;return g?s.jsx("span",{className:e,style:r,children:g}):null}const c=u?u(o):String(o);return a?s.jsx("span",{className:e,style:r,children:a(c,i)}):s.jsx("span",{className:e,style:r,children:c})}Re.displayName="Ginger.Current.Year";function Ie({className:e,style:r,fallback:t,empty:n,children:a,preserveWhitespace:u=!0}){var g;const i=h(),o=((g=E(i))==null?void 0:g.lyrics)??"",c=u?o.replace(/^\s+|\s+$/g,""):o.trim();if(!c){const x=n??t??null;return x?s.jsx("span",{className:e,style:r,children:x}):null}const p=u?{whiteSpace:"pre-wrap"}:void 0;return a?s.jsx("span",{className:e,style:{...p,...r},children:a(c,i)}):s.jsx("span",{className:e,style:{...p,...r},children:c})}Ie.displayName="Ginger.Current.Lyrics";function Ae({visible:e=!1,className:r,style:t,fallback:n,empty:a,children:u}){var c;const i=h();if(!e)return null;const o=((c=E(i))==null?void 0:c.fileUrl)??"";if(!o){const p=a??n??null;return p?s.jsx("span",{className:r,style:t,children:p}):null}return u?s.jsx("span",{className:r,style:t,children:u(o,i)}):s.jsx("span",{className:r,style:t,children:o})}Ae.displayName="Ginger.Current.FileUrl";function Se({className:e,style:r,fallback:t,empty:n,sizes:a,loading:u,onError:i,decoding:o,imgStyle:c}){const p=h(),g=E(p),x=Pe(p);if(!x){const m=n??t??null;return m?s.jsx("span",{className:e,style:r,children:m}):null}const f=[g==null?void 0:g.title,g==null?void 0:g.artist].filter(Boolean).join(" — ")||"Artwork";return s.jsx("div",{className:e,style:{background:"var(--ginger-artwork-bg, transparent)",borderRadius:"var(--ginger-artwork-radius, 0)",overflow:"hidden",...r},children:s.jsx("img",{src:x,alt:f,sizes:a,loading:u,decoding:o,onError:i,style:{display:"block",width:"100%",height:"100%",objectFit:"cover",...c}})})}Se.displayName="Ginger.Current.Artwork";function Ce({base:e=0,className:r,style:t,fallback:n,empty:a,children:u}){const i=h();if(i.tracks.length===0){const p=a??n??null;return p?s.jsx("span",{className:r,style:t,children:p}):null}const c=String(i.currentIndex+e);return u?s.jsx("span",{className:r,style:t,children:u(c,i)}):s.jsx("span",{className:r,style:t,children:c})}Ce.displayName="Ginger.Current.QueueIndex";function Ge({className:e,style:r,fallback:t,empty:n,children:a}){const u=h(),i=String(u.tracks.length);if(u.tracks.length===0){const o=n??t??null;return o?s.jsx("span",{className:e,style:r,children:o}):null}return a?s.jsx("span",{className:e,style:r,children:a(i,u)}):s.jsx("span",{className:e,style:r,children:i})}Ge.displayName="Ginger.Current.QueueLength";function _e({base:e=0,separator:r=" / ",className:t,style:n,fallback:a,empty:u,children:i}){const o=h(),c=o.tracks.length;if(c===0){const f=u??a??null;return f?s.jsx("span",{className:t,style:n,children:f}):null}const p=String(o.currentIndex+e),g=String(c),x=`${p}${r}${g}`;return i?s.jsx("span",{className:t,style:n,children:i({index:p,length:g,label:x},o)}):s.jsx("span",{className:t,style:n,children:x})}_e.displayName="Ginger.Current.QueuePosition";function oe(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 me(e,r,t){const{className:n,style:a,fallback:u,empty:i,children:o,format:c=oe}=t;if(!(e>=0)||!Number.isFinite(e)){const g=i??u??null;return g?s.jsx("span",{className:n,style:a,children:g}):null}const p=c(e);return o?s.jsx("span",{className:n,style:a,children:o(p,r)}):s.jsx("span",{className:n,style:a,children:p})}function je(e){const r=h();return me(r.currentTime,r,e)}je.displayName="Ginger.Current.Elapsed";function Ne(e){const r=h();return me(w(r),r,e)}Ne.displayName="Ginger.Current.Duration";function we(e){const r=h();return me(Me(r),r,e)}we.displayName="Ginger.Current.Remaining";function Le({className:e,style:r,fallback:t,empty:n,children:a}){const u=h(),i=w(u),o=ye(u);if(!(i>0)){const c=n??t??null;return c?s.jsx("span",{className:e,style:r,children:c}):null}return a?s.jsx("span",{className:e,style:r,children:a({fraction:o,currentTime:u.currentTime,duration:i},u)}):s.jsx("span",{className:e,style:r,children:`${Math.round(o*100)}%`})}Le.displayName="Ginger.Current.Progress";function De({className:e,style:r,height:t=4,showBuffered:n=!1}){const a=h(),u=`${Math.round(ye(a)*100)}%`,i=`${Math.round(Math.min(1,Math.max(0,a.bufferedFraction))*100)}%`;return s.jsxs("div",{className:e,style:{width:"100%",height:t,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",position:"relative",...r},"aria-hidden":!0,children:[n?s.jsx("div",{style:{position:"absolute",left:0,top:0,height:"100%",width:i,background:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}}):null,s.jsx("div",{style:{position:"relative",width:u,height:"100%",background:"var(--ginger-primary-color, #111827)"}})]})}De.displayName="Ginger.Current.TimeRail";function Fe({className:e,style:r,height:t=4}){const n=h(),a=`${Math.round(Math.min(1,Math.max(0,n.bufferedFraction))*100)}%`;return s.jsx("div",{className:e,style:{width:"100%",height:t,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",...r},"aria-hidden":!0,children:s.jsx("div",{style:{width:a,height:"100%",background:"var(--ginger-buffer-color, rgba(107, 114, 128, 0.35))"}})})}Fe.displayName="Ginger.Current.BufferRail";function Ue({className:e,style:r,fallback:t,empty:n,children:a}){const u=h(),i=le(u);return a?s.jsx("span",{className:e,style:r,children:a(i,u)}):s.jsx("span",{className:e,style:r,children:i})}Ue.displayName="Ginger.Current.PlaybackState";function Ve({className:e,style:r,fallback:t,empty:n,children:a}){const u=h(),i=u.errorMessage??"";if(!i){const o=n??t??null;return o?s.jsx("span",{className:e,style:r,children:o}):null}return a?s.jsx("span",{className:e,style:r,children:a(i,u)}):s.jsx("span",{className:e,style:r,children:i})}Ve.displayName="Ginger.Current.ErrorMessage";const U={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 Sr(e){return e?{...U,...e,repeat:{...U.repeat,...e.repeat}}:U}const Be=d.createContext(U);function Cr({locale:e,children:r}){const t=Sr(e);return s.jsx(Be.Provider,{value:t,children:r})}function T(){return d.useContext(Be)}function $e(){const e=P(),r=A(),t=T(),n=d.useMemo(()=>B(e,r),[e,r]),a=w(n),u=a>0?n.currentTime:0,i=Number.isFinite(u)?u:0,o=a>0?`${oe(i)} of ${oe(a)}`:oe(i),c=p=>{r.seek(Number(p.currentTarget.value))};return{state:n,value:i,min:0,max:a>0?a:1,step:"any",ariaValueText:o,ariaLabel:t.seek,onSeekInput:c,onSeekChange:c}}function Oe(){const e=P(),r=A(),t=T(),n=d.useMemo(()=>B(e,r),[e,r]),a=u=>{r.setVolume(Number(u.currentTarget.value))};return{state:n,value:n.volume,min:0,max:1,step:"any",ariaValueText:`${Math.round(n.volume*100)}%`,ariaLabel:t.volume,onVolumeInput:a,onVolumeChange:a}}function Ye(e){const r=P(),t=T(),n=(e==null?void 0:e.playAriaLabel)??t.play,a=(e==null?void 0:e.pauseAriaLabel)??t.pause;return{isPaused:r.isPaused,toggle:r.togglePlayPause,ariaLabel:r.isPaused?n:a}}function Qe({playLabel:e="Play",pauseLabel:r="Pause",playAriaLabel:t,pauseAriaLabel:n,type:a="button",...u}){const i=T(),o=typeof e=="string"?e:i.play,c=typeof r=="string"?r:i.pause,p=Ye({playAriaLabel:t??o,pauseAriaLabel:n??c});return s.jsx("button",{type:a,"aria-label":p.ariaLabel,onClick:p.toggle,...u,children:p.isPaused?e:r})}Qe.displayName="Ginger.Control.PlayPause";function Xe({type:e="button",...r}){const{repeatMode:t,cycleRepeat:n}=P(),u=T().repeat[t];return s.jsx("button",{type:e,"aria-label":u,onClick:n,...r,children:u})}Xe.displayName="Ginger.Control.Repeat";function We({type:e="button",children:r="Next",...t}){const{next:n}=P(),a=T();return s.jsx("button",{type:e,"aria-label":a.nextTrack,onClick:n,...t,children:r})}We.displayName="Ginger.Control.Next";function qe({type:e="button",children:r="Previous",...t}){const{prev:n}=P(),a=T();return s.jsx("button",{type:e,"aria-label":a.previousTrack,onClick:n,...t,children:r})}qe.displayName="Ginger.Control.Previous";function ze({type:e="button",children:r="Shuffle",...t}){const{isShuffled:n,toggleShuffle:a}=P(),u=T();return s.jsx("button",{type:e,"aria-pressed":n,"aria-label":u.shuffle,onClick:a,...t,children:r})}ze.displayName="Ginger.Control.Shuffle";function He({inputStyle:e,style:r,...t}){const n=$e();return s.jsx("input",{...t,type:"range",min:n.min,max:n.max,step:n.step,value:n.value,"aria-label":n.ariaLabel,"aria-valuetext":n.ariaValueText,onInput:n.onSeekInput,onChange:n.onSeekChange,style:{width:"100%",...r,...e}})}He.displayName="Ginger.Control.SeekBar";function Ke({inputStyle:e,style:r,...t}){const n=Oe();return s.jsx("input",{...t,type:"range",min:n.min,max:n.max,step:n.step,value:n.value,"aria-label":n.ariaLabel,"aria-valuetext":n.ariaValueText,onInput:n.onVolumeInput,onChange:n.onVolumeChange,style:{width:"100%",...r,...e}})}Ke.displayName="Ginger.Control.Volume";function Je({muteLabel:e,unmuteLabel:r,type:t="button",...n}){const{muted:a,toggleMute:u}=A(),i=T(),o=e??i.mute,c=r??i.unmute;return s.jsx("button",{type:t,"aria-pressed":a,"aria-label":a?i.unmute:i.mute,onClick:u,...n,children:a?c:o})}Je.displayName="Ginger.Control.Mute";const Gr=[.5,.75,1,1.25,1.5,2];function Ze({rates:e=Gr,style:r,...t}){const{playbackRate:n,setPlaybackRate:a}=A(),u=T(),i=d.useMemo(()=>Array.from(new Set([...e,n])).sort((o,c)=>o-c),[e,n]);return s.jsx("select",{...t,"aria-label":u.playbackSpeed,value:String(n),style:r,onChange:o=>a(Number(o.currentTarget.value)),children:i.map(o=>s.jsx("option",{value:String(o),children:o===1?u.playbackRateNormal:u.playbackRateTimes(o)},o))})}Ze.displayName="Ginger.Control.PlaybackRate";const ge=d.createContext(null);function _r(){const e=d.useContext(ge);if(!e)throw new Error("Ginger.Playlist.Track must be used inside <Ginger.Playlist>");return e}function er({children:e,rowStyle:r,renderTrack:t,playOnSelect:n=!0,style:a,...u}){const{tracks:i,currentIndex:o,playTrackAt:c,selectTrackAt:p}=P(),g={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?s.jsx(ge.Provider,{value:{playOnSelect:n},children:s.jsx("ul",{style:g,...u,children:e})}):s.jsx(ge.Provider,{value:{playOnSelect:n},children:s.jsx("ul",{style:g,...u,children:i.map((f,m)=>{const k=m===o;return s.jsx("li",{children:s.jsx("button",{type:"button",onClick:()=>{n?c(m):p(m)},style:{width:"100%",textAlign:"left",border:"none",background:k?"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:t?t(f,m,k):s.jsxs("span",{children:[f.title,f.artist?` — ${f.artist}`:""]})})},`${m}-${pe(f)}`)})})})}er.displayName="Ginger.Playlist";function rr({index:e,className:r,style:t,children:n,liProps:a,onClick:u,...i}){const{playOnSelect:o}=_r(),{tracks:c,currentIndex:p,playTrackAt:g,selectTrackAt:x}=P(),f=e===p,m=c[e],k=m!=null?s.jsxs("span",{children:[m.title,m.artist?` — ${m.artist}`:""]}):null;return s.jsx("li",{...a,children:s.jsx("button",{type:"button","aria-current":f?"true":void 0,"data-ginger-active":f||void 0,className:r,style:{width:"100%",textAlign:"left",border:"none",background:f?"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)",...t},...i,onClick:M=>{u==null||u(M),!M.defaultPrevented&&(o?g(e):x(e))},children:n??k})})}rr.displayName="Ginger.Playlist.Track";const jr=Object.assign(er,{Track:rr}),Nr=S("Ginger.Queue.Title",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.title}),wr=S("Ginger.Queue.Subtitle",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.subtitle}),Lr=S("Ginger.Queue.Description",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.description}),Dr=S("Ginger.Queue.Copyright",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.copyright});function tr({className:e,style:r,fallback:t,empty:n,imgStyle:a}){var c,p;const u=h(),i=(c=u.playlistMeta)==null?void 0:c.artworkUrl;if(!i){const g=n??t??null;return g?s.jsx("span",{className:e,style:r,children:g}):null}const o=((p=u.playlistMeta)==null?void 0:p.title)??"Playlist artwork";return s.jsx("span",{className:e,style:{display:"inline-block",background:"var(--ginger-artwork-bg, #f3f4f6)",borderRadius:"var(--ginger-artwork-radius, 6px)",overflow:"hidden",...r},children:s.jsx("img",{src:i,alt:o,style:{display:"block",width:"100%",height:"100%",objectFit:"cover",...a}})})}tr.displayName="Ginger.Queue.Artwork";function V(e){return Number.isFinite(e)?Math.min(1,Math.max(0,e)):1}function ce(e){return Number.isFinite(e)?Math.min(4,Math.max(.25,e)):1}const F={currentTime:0,duration:0,bufferedFraction:0,isBuffering:!1,errorMessage:null},Fr={...F,volume:1,muted:!1,playbackRate:1};function nr(e){const r=[...e.tracks];let t=N(e.currentIndex??0,r.length),n=null,a=r;return e.isShuffled&&r.length>1&&(n=[...r],a=ke(r,t),t=0),{tracks:a,currentIndex:t,isPaused:e.isPaused??!0,isShuffled:!!(e.isShuffled&&a.length>1),repeatMode:e.repeatMode??"off",originalTracks:n,playlistMeta:e.playlistMeta??null,...Fr,volume:V(e.volume??1),muted:e.muted??!1,playbackRate:ce(e.playbackRate??1)}}function Ur(e,r){switch(r.type){case"INIT":{const{tracks:t,currentIndex:n,playlistMeta:a,isPaused:u,isShuffled:i,repeatMode:o,volume:c,muted:p,playbackRate:g}=r.payload;return nr({tracks:t,currentIndex:n,playlistMeta:a??null,isPaused:u??!0,isShuffled:i??!1,repeatMode:o??"off",volume:c,muted:p,playbackRate:g})}case"SET_QUEUE":{const{tracks:t,currentIndex:n}=r.payload,a=[...t],u=N(n??e.currentIndex,a.length);return{...e,tracks:a,currentIndex:u,isShuffled:!1,originalTracks:null,...F}}case"SET_INDEX":{const t=N(r.payload.index,e.tracks.length),n=r.payload.autoPlay,a=n===!0?!1:n===!1?!0:e.isPaused;return{...e,currentIndex:t,...F,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:mr(e.repeatMode)};case"TOGGLE_SHUFFLE":{if(e.tracks.length<=1)return{...e,isShuffled:!1,originalTracks:null};if(!e.isShuffled){const u=[...e.tracks],i=ke(u,e.currentIndex);return{...e,isShuffled:!0,originalTracks:u,tracks:i,currentIndex:0}}const t=e.originalTracks?[...e.originalTracks]:[...e.tracks],n=e.tracks[e.currentIndex],a=fr(t,n);return{...e,isShuffled:!1,originalTracks:null,tracks:t,currentIndex:N(a,t.length)}}case"NEXT":{const t=gr(e),n=t===e.currentIndex;return{...e,currentIndex:t,...n?{}:F,isPaused:n?e.isPaused:!1}}case"PREV":{const t=yr(e),n=t===e.currentIndex;return{...e,currentIndex:t,...n?{}:F,isPaused:n?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:V(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:ce(r.payload)};case"MEDIA_VOLUME_SYNC":{const{volume:t,muted:n}=r.payload,a=V(t);return a===e.volume&&n===e.muted?e:{...e,volume:a,muted:n}}default:return e}}const Vr={"--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 Br({children:e,initialTracks:r=[],initialIndex:t=0,initialPlaylistMeta:n=null,initialShuffle:a=!1,initialRepeatMode:u="off",initialPaused:i=!0,initialVolume:o=1,initialMuted:c=!1,initialPlaybackRate:p=1,initialStateKey:g,locale:x,className:f,style:m,onTrackChange:k,onPlay:M,onPause:R,onQueueEnd:L,onError:D}){var be;const I=d.useRef(null),[l,b]=d.useReducer(Ur,void 0,()=>nr({tracks:r,currentIndex:t,playlistMeta:n,isPaused:i,isShuffled:a,repeatMode:u,volume:o,muted:c,playbackRate:p})),de=d.useRef(l),fe=d.useRef({tracks:r,currentIndex:t,playlistMeta:n,isPaused:i,isShuffled:a,repeatMode:u,volume:o,muted:c,playbackRate:p});fe.current={tracks:r,currentIndex:t,playlistMeta:n,isPaused:i,isShuffled:a,repeatMode:u,volume:o,muted:c,playbackRate:p};const G=d.useRef(void 0);d.useEffect(()=>{if(g===void 0){G.current=void 0;return}if(G.current===void 0){G.current=g;return}if(G.current===g)return;G.current=g;const y=fe.current;b({type:"INIT",payload:{tracks:y.tracks,currentIndex:y.currentIndex,playlistMeta:y.playlistMeta,isPaused:y.isPaused,isShuffled:y.isShuffled,repeatMode:y.repeatMode,volume:y.volume,muted:y.muted,playbackRate:y.playbackRate}})},[g]),d.useEffect(()=>{de.current=l},[l]);const $=l.tracks[l.currentIndex]??null;d.useEffect(()=>{k==null||k($,l.currentIndex)},[$,l.currentIndex,k]),d.useEffect(()=>{l.errorMessage&&(D==null||D(l.errorMessage))},[l.errorMessage,D]);const O=d.useRef(void 0);d.useEffect(()=>{if(O.current===void 0){O.current=l.isPaused;return}O.current!==l.isPaused&&(l.isPaused?R==null||R():M==null||M()),O.current=l.isPaused},[l.isPaused,R,M]);const _=d.useCallback(()=>{b({type:"PLAY"})},[]),j=d.useCallback(()=>{var y;b({type:"PAUSE"}),(y=I.current)==null||y.pause()},[]),Y=d.useCallback(()=>{l.isPaused?_():j()},[j,_,l.isPaused]),Q=d.useCallback(y=>{const v=I.current;v&&Number.isFinite(y)&&(v.currentTime=Math.max(0,y))},[]),X=d.useCallback(y=>{b({type:"SET_VOLUME",payload:V(y)})},[]),W=d.useCallback(y=>{b({type:"SET_MUTED",payload:y})},[]),q=d.useCallback(()=>{b({type:"TOGGLE_MUTE"})},[]),z=d.useCallback(y=>{b({type:"SET_PLAYBACK_RATE",payload:ce(y)})},[]),H=d.useCallback(()=>{b({type:"NEXT"})},[]),K=d.useCallback(()=>{b({type:"PREV"})},[]),J=d.useCallback(y=>{b({type:"SET_REPEAT",payload:y})},[]),Z=d.useCallback(()=>{b({type:"CYCLE_REPEAT"})},[]),ee=d.useCallback(()=>{b({type:"TOGGLE_SHUFFLE"})},[]),re=d.useCallback((y,v)=>{b({type:"SET_QUEUE",payload:{tracks:y,currentIndex:v}})},[]),te=d.useCallback(y=>{b({type:"SET_INDEX",payload:{index:y,autoPlay:!0}})},[]),ne=d.useCallback(y=>{b({type:"SET_INDEX",payload:{index:y,autoPlay:!1}})},[]),ae=d.useCallback(y=>{b({type:"SET_PLAYLIST_META",payload:y})},[]),ue=d.useCallback(y=>{b({type:"INIT",payload:y})},[]),ar=(be=l.tracks[l.currentIndex])==null?void 0:be.fileUrl;d.useEffect(()=>{const y=I.current;y&&(l.isPaused?y.pause():y.play().catch(v=>{const se=v instanceof Error?v.message:typeof v=="string"?v:"Playback failed (e.g. autoplay blocked or unavailable source)";b({type:"MEDIA_ERROR",payload:{message:se}})}))},[l.isPaused,ar]);const ie=d.useCallback(()=>{const y=pr(de.current);if(y.kind==="replay_same"){const se=I.current;se&&(se.currentTime=0),b({type:"PLAY"});return}if(y.kind==="stop"){b({type:"PAUSE"}),L==null||L();return}const v=y.nextIndex;b({type:"SET_INDEX",payload:{index:v,autoPlay:!0}})},[L]),ur=d.useMemo(()=>({state:l,dispatch:b,audioRef:I,notifyEnded:ie,init:ue,play:_,pause:j,togglePlayPause:Y,seek:Q,setVolume:X,setMuted:W,toggleMute:q,setPlaybackRate:z,next:H,prev:K,setRepeatMode:J,cycleRepeat:Z,toggleShuffle:ee,setQueue:re,playTrackAt:te,selectTrackAt:ne,setPlaylistMeta:ae}),[Z,b,ue,H,ie,j,_,te,ne,K,Q,W,z,re,J,ae,X,l,q,Y,ee]),ir=d.useMemo(()=>({tracks:l.tracks,currentIndex:l.currentIndex,isPaused:l.isPaused,isShuffled:l.isShuffled,repeatMode:l.repeatMode,originalTracks:l.originalTracks,playlistMeta:l.playlistMeta,init:ue,play:_,pause:j,togglePlayPause:Y,next:H,prev:K,setRepeatMode:J,cycleRepeat:Z,toggleShuffle:ee,setQueue:re,playTrackAt:te,selectTrackAt:ne,setPlaylistMeta:ae,dispatch:b}),[l.tracks,l.currentIndex,l.isPaused,l.isShuffled,l.repeatMode,l.originalTracks,l.playlistMeta,ue,_,j,Y,H,K,J,Z,ee,re,te,ne,ae,b]),sr=d.useMemo(()=>({currentTime:l.currentTime,duration:l.duration,bufferedFraction:l.bufferedFraction,isBuffering:l.isBuffering,errorMessage:l.errorMessage,volume:l.volume,muted:l.muted,playbackRate:l.playbackRate,seek:Q,setVolume:X,setMuted:W,toggleMute:q,setPlaybackRate:z,audioRef:I,notifyEnded:ie,dispatch:b}),[l.currentTime,l.duration,l.bufferedFraction,l.isBuffering,l.errorMessage,l.volume,l.muted,l.playbackRate,Q,X,W,q,z,I,ie,b]),or=le(l),lr=d.useMemo(()=>({...Vr,...m}),[m]);return s.jsx(Cr,{locale:x,children:s.jsx(Te.Provider,{value:ir,children:s.jsx(Ee.Provider,{value:sr,children:s.jsx(he.Provider,{value:ur,children:s.jsx("div",{className:f,style:lr,"data-ginger-playback":or,children:e})})})})})}const $r={Provider:Br,Player:dr,Current:{Title:kr,Artist:Mr,Album:Pr,Description:vr,Copyright:Tr,Genre:Er,Label:Rr,Isrc:Ir,TrackNumber:Ar,Year:Re,Lyrics:Ie,FileUrl:Ae,Artwork:Se,QueueIndex:Ce,QueueLength:Ge,QueuePosition:_e,Elapsed:je,Duration:Ne,Remaining:we,Progress:Le,TimeRail:De,BufferRail:Fe,PlaybackState:Ue,ErrorMessage:Ve},Queue:{Title:Nr,Subtitle:wr,Description:Lr,Copyright:Dr,Artwork:tr},Control:{PlayPause:Qe,Repeat:Xe,Next:We,Previous:qe,Shuffle:ze,SeekBar:He,Volume:Ke,Mute:Je,PlaybackRate:Ze},Playlist:jr};function Or(){const e=P(),r=A();return d.useMemo(()=>{const t=B(e,r);return{state:t,currentTrack:E(t),playbackUi:le(t),duration:w(t),remaining:Me(t),progress:ye(t),artworkUrl:Pe(t),albumLine:ve(t),play:e.play,pause:e.pause,togglePlayPause:e.togglePlayPause,seek:r.seek,setVolume:r.setVolume,setMuted:r.setMuted,toggleMute:r.toggleMute,setPlaybackRate:r.setPlaybackRate,next:e.next,prev:e.prev,setRepeatMode:e.setRepeatMode,cycleRepeat:e.cycleRepeat,toggleShuffle:e.toggleShuffle,setQueue:e.setQueue,playTrackAt:e.playTrackAt,selectTrackAt:e.selectTrackAt,setPlaylistMeta:e.setPlaylistMeta,init:e.init,audioRef:r.audioRef,dispatch:e.dispatch}},[e,r])}exports.Ginger=$r;exports.clampPlaybackRate=ce;exports.clampVolume=V;exports.defaultGingerLocale=U;exports.derivePlaybackUiState=le;exports.gingerStateFromContextValues=B;exports.gingerStateFromContexts=hr;exports.useGinger=Or;exports.useGingerLocale=T;exports.useGingerMedia=A;exports.useGingerPlayback=P;exports.useGingerState=h;exports.usePlayPauseBinding=Ye;exports.useSeekBarBinding=$e;exports.useVolumeSlider=Oe;
2
2
  //# sourceMappingURL=index.cjs.map