@lucaismyname/ginger 0.0.1 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +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,2CAoEtG"}
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"}
@@ -1,4 +1,4 @@
1
- import { ButtonHTMLAttributes, CSSProperties, InputHTMLAttributes, ReactNode } from 'react';
1
+ import { ButtonHTMLAttributes, CSSProperties, InputHTMLAttributes, ReactNode, SelectHTMLAttributes } from 'react';
2
2
  export type PlayPauseProps = ButtonHTMLAttributes<HTMLButtonElement> & {
3
3
  /** Optional labels; still headless—defaults are text for a11y */
4
4
  playLabel?: ReactNode;
@@ -35,4 +35,27 @@ export declare function SeekBar({ inputStyle, style, ...rest }: SeekBarProps): i
35
35
  export declare namespace SeekBar {
36
36
  var displayName: string;
37
37
  }
38
+ export type VolumeProps = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "onChange"> & {
39
+ inputStyle?: CSSProperties;
40
+ };
41
+ export declare function Volume({ inputStyle, style, ...rest }: VolumeProps): import("react/jsx-runtime").JSX.Element;
42
+ export declare namespace Volume {
43
+ var displayName: string;
44
+ }
45
+ export type MuteProps = ButtonHTMLAttributes<HTMLButtonElement> & {
46
+ muteLabel?: ReactNode;
47
+ unmuteLabel?: ReactNode;
48
+ };
49
+ export declare function Mute({ muteLabel, unmuteLabel, type, ...rest }: MuteProps): import("react/jsx-runtime").JSX.Element;
50
+ export declare namespace Mute {
51
+ var displayName: string;
52
+ }
53
+ export type PlaybackRateProps = Omit<SelectHTMLAttributes<HTMLSelectElement>, "value" | "onChange"> & {
54
+ /** Playback speed options (default: 0.5 … 2) */
55
+ rates?: readonly number[];
56
+ };
57
+ export declare function PlaybackRate({ rates, style, ...rest }: PlaybackRateProps): import("react/jsx-runtime").JSX.Element;
58
+ export declare namespace PlaybackRate {
59
+ var displayName: string;
60
+ }
38
61
  //# sourceMappingURL=Controls.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Controls.d.ts","sourceRoot":"","sources":["../../../src/components/controls/Controls.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIjG,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"}
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,13 +1,38 @@
1
- import { CSSProperties, HTMLAttributes, ReactNode } from 'react';
1
+ import { ButtonHTMLAttributes, CSSProperties, HTMLAttributes, LiHTMLAttributes, ReactNode } from 'react';
2
2
  import { Track } from '../../types';
3
- export type GingerPlaylistProps = HTMLAttributes<HTMLUListElement> & {
3
+ export type GingerPlaylistConfig = {
4
+ playOnSelect: boolean;
5
+ };
6
+ export type GingerPlaylistProps = Omit<HTMLAttributes<HTMLUListElement>, "children"> & {
7
+ children?: ReactNode;
4
8
  rowStyle?: CSSProperties;
9
+ /**
10
+ * Used only in **auto** mode (no custom `children`). Ignored when you pass custom `children`
11
+ * (manual mode); use `Ginger.Playlist.Track` for each row instead.
12
+ */
5
13
  renderTrack?: (track: Track, index: number, isActive: boolean) => ReactNode;
6
14
  /** When true (default), clicking a row selects that index and starts playback */
7
15
  playOnSelect?: boolean;
8
16
  };
9
- export declare function GingerPlaylist({ rowStyle, renderTrack, playOnSelect, style, ...rest }: GingerPlaylistProps): import("react/jsx-runtime").JSX.Element;
17
+ /**
18
+ * - **Auto mode** (no `children`): maps `state.tracks` to rows (optional `renderTrack`).
19
+ * - **Manual mode** (`children` defined): renders `<ul>{children}</ul>`; map `state.tracks` yourself
20
+ * with `Ginger.Playlist.Track` for each index.
21
+ */
22
+ export declare function GingerPlaylist({ children, rowStyle, renderTrack, playOnSelect, style, ...rest }: GingerPlaylistProps): import("react/jsx-runtime").JSX.Element;
10
23
  export declare namespace GingerPlaylist {
11
24
  var displayName: string;
12
25
  }
26
+ export type GingerPlaylistTrackProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type"> & {
27
+ index: number;
28
+ /** Optional wrapper for the row; defaults to a plain `<li>` */
29
+ liProps?: LiHTMLAttributes<HTMLLIElement>;
30
+ };
31
+ export declare function GingerPlaylistTrack({ index, className, style, children, liProps, onClick, ...buttonRest }: GingerPlaylistTrackProps): import("react/jsx-runtime").JSX.Element;
32
+ export declare namespace GingerPlaylistTrack {
33
+ var displayName: string;
34
+ }
35
+ export declare const GingerPlaylistCompound: typeof GingerPlaylist & {
36
+ Track: typeof GingerPlaylistTrack;
37
+ };
13
38
  //# sourceMappingURL=GingerPlaylist.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GingerPlaylist.d.ts","sourceRoot":"","sources":["../../../src/components/playlist/GingerPlaylist.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,gBAAgB,CAAC,GAAG;IACnE,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,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,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,WAAW,EACX,YAAmB,EACnB,KAAK,EACL,GAAG,IAAI,EACR,EAAE,mBAAmB,2CAmDrB;yBAzDe,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;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"}
@@ -11,6 +11,8 @@ export type GingerContextValue = {
11
11
  seek: (timeSeconds: number) => void;
12
12
  setVolume: (volume: number) => void;
13
13
  setMuted: (muted: boolean) => void;
14
+ toggleMute: () => void;
15
+ setPlaybackRate: (rate: number) => void;
14
16
  next: () => void;
15
17
  prev: () => void;
16
18
  setRepeatMode: (mode: RepeatMode) => 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,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,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,3 +1,3 @@
1
1
  import { GingerProviderProps } from '../types';
2
- export declare function GingerProvider({ children, initialTracks, initialIndex, initialPlaylistMeta, initialShuffle, initialRepeatMode, initialPaused, 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, 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,SAAS,EACT,KAAK,EACL,aAAa,EACb,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,GACR,EAAE,mBAAmB,2CA8MrB"}
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,2CAkNrB"}
@@ -1,4 +1,6 @@
1
1
  import { GingerAction, GingerState, RepeatMode, Track } from '../types';
2
+ export declare function clampVolume(v: number): number;
3
+ export declare function clampPlaybackRate(r: number): number;
2
4
  export declare function createInitialState(params: {
3
5
  tracks: Track[];
4
6
  currentIndex?: number;
@@ -6,6 +8,9 @@ export declare function createInitialState(params: {
6
8
  isPaused?: boolean;
7
9
  isShuffled?: boolean;
8
10
  repeatMode?: RepeatMode;
11
+ volume?: number;
12
+ muted?: boolean;
13
+ playbackRate?: number;
9
14
  }): GingerState;
10
15
  export declare function gingerReducer(state: GingerState, action: GingerAction): GingerState;
11
16
  //# sourceMappingURL=playbackReducer.d.ts.map
@@ -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;AAY7E,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;CACzB,GAAG,WAAW,CAsBd;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CAgInF"}
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"}
package/dist/ginger.d.ts CHANGED
@@ -1,52 +1,56 @@
1
1
  import { GingerPlayer } from './audio/GingerPlayer';
2
- import { GingerPlaylist } from './components/playlist/GingerPlaylist';
3
2
  import { GingerProvider } from './context/GingerProvider';
4
3
  import * as Current from "./components/current";
5
4
  import * as Control from "./components/controls/Controls";
6
5
  import * as Queue from "./components/queue/QueueDisplay";
7
6
  export declare const Ginger: {
8
- readonly Provider: typeof GingerProvider;
9
- readonly Player: typeof GingerPlayer;
10
- readonly Current: {
11
- readonly Title: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
12
- readonly Artist: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
13
- readonly Album: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
14
- readonly Description: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
15
- readonly Copyright: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
16
- readonly Genre: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
17
- readonly Label: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
18
- readonly Isrc: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
19
- readonly TrackNumber: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
20
- readonly Year: typeof Current.Year;
21
- readonly Lyrics: typeof Current.Lyrics;
22
- readonly FileUrl: typeof Current.FileUrl;
23
- readonly Artwork: typeof Current.Artwork;
24
- readonly QueueIndex: typeof Current.QueueIndex;
25
- readonly QueueLength: typeof Current.QueueLength;
26
- readonly QueuePosition: typeof Current.QueuePosition;
27
- readonly Elapsed: typeof Current.Elapsed;
28
- readonly Duration: typeof Current.Duration;
29
- readonly Remaining: typeof Current.Remaining;
30
- readonly Progress: typeof Current.Progress;
31
- readonly TimeRail: typeof Current.TimeRail;
32
- readonly PlaybackState: typeof Current.PlaybackState;
33
- readonly ErrorMessage: typeof Current.ErrorMessage;
7
+ Provider: typeof GingerProvider;
8
+ Player: typeof GingerPlayer;
9
+ Current: {
10
+ Title: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
11
+ Artist: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
12
+ Album: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
13
+ Description: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
14
+ Copyright: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
15
+ Genre: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
16
+ Label: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
17
+ Isrc: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
18
+ TrackNumber: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
19
+ Year: typeof Current.Year;
20
+ Lyrics: typeof Current.Lyrics;
21
+ FileUrl: typeof Current.FileUrl;
22
+ Artwork: typeof Current.Artwork;
23
+ QueueIndex: typeof Current.QueueIndex;
24
+ QueueLength: typeof Current.QueueLength;
25
+ QueuePosition: typeof Current.QueuePosition;
26
+ Elapsed: typeof Current.Elapsed;
27
+ Duration: typeof Current.Duration;
28
+ Remaining: typeof Current.Remaining;
29
+ Progress: typeof Current.Progress;
30
+ TimeRail: typeof Current.TimeRail;
31
+ PlaybackState: typeof Current.PlaybackState;
32
+ ErrorMessage: typeof Current.ErrorMessage;
34
33
  };
35
- readonly Queue: {
36
- readonly Title: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
37
- readonly Subtitle: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
38
- readonly Description: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
39
- readonly Copyright: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
40
- readonly Artwork: typeof Queue.Artwork;
34
+ Queue: {
35
+ Title: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
36
+ Subtitle: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
37
+ Description: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
38
+ Copyright: (props: import('./components/current/createTextDisplay').TextDisplayProps) => import('react').ReactElement | null;
39
+ Artwork: typeof Queue.Artwork;
41
40
  };
42
- readonly Control: {
43
- readonly PlayPause: typeof Control.PlayPause;
44
- readonly Repeat: typeof Control.Repeat;
45
- readonly Next: typeof Control.Next;
46
- readonly Previous: typeof Control.Previous;
47
- readonly Shuffle: typeof Control.Shuffle;
48
- readonly SeekBar: typeof Control.SeekBar;
41
+ Control: {
42
+ PlayPause: typeof Control.PlayPause;
43
+ Repeat: typeof Control.Repeat;
44
+ Next: typeof Control.Next;
45
+ Previous: typeof Control.Previous;
46
+ Shuffle: typeof Control.Shuffle;
47
+ SeekBar: typeof Control.SeekBar;
48
+ Volume: typeof Control.Volume;
49
+ Mute: typeof Control.Mute;
50
+ PlaybackRate: typeof Control.PlaybackRate;
51
+ };
52
+ Playlist: typeof import('./components/playlist/GingerPlaylist').GingerPlaylist & {
53
+ Track: typeof import('./components/playlist/GingerPlaylist').GingerPlaylistTrack;
49
54
  };
50
- readonly Playlist: typeof GingerPlaylist;
51
55
  };
52
56
  //# sourceMappingURL=ginger.d.ts.map
@@ -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;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,KAAK,KAAK,MAAM,iCAAiC,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CT,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+ClB,CAAC"}
@@ -13,6 +13,8 @@ export declare function useGinger(): {
13
13
  seek: (timeSeconds: number) => void;
14
14
  setVolume: (volume: number) => void;
15
15
  setMuted: (muted: boolean) => void;
16
+ toggleMute: () => void;
17
+ setPlaybackRate: (rate: number) => void;
16
18
  next: () => void;
17
19
  prev: () => void;
18
20
  setRepeatMode: (mode: import('..').RepeatMode) => void;
@@ -22,6 +24,7 @@ export declare function useGinger(): {
22
24
  playTrackAt: (index: number) => void;
23
25
  selectTrackAt: (index: number) => void;
24
26
  setPlaylistMeta: (meta: import('..').PlaylistMeta | null) => void;
25
- dispatch: import('react').Dispatch<import('../types').GingerAction>;
27
+ audioRef: import('react').MutableRefObject<HTMLAudioElement | null>;
28
+ dispatch: import('react').Dispatch<import('..').GingerAction>;
26
29
  };
27
30
  //# 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;;;;;;;;;;;;;;;;;;;;;;;;;EAmDxB"}
1
+ {"version":3,"file":"useGinger.d.ts","sourceRoot":"","sources":["../../src/hooks/useGinger.ts"],"names":[],"mappings":"AAYA,wBAAgB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyDxB"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),p=require("react"),J=p.createContext(null);function y(){const e=p.useContext(J);if(!e)throw new Error("Ginger components must be used within <Ginger.Provider>");return e}function H(e){const{buffered:r,duration:n}=e;return!(n>0)||r.length===0?0:Math.min(1,r.end(r.length-1)/n)}function Re({className:e,style:r,preload:n="metadata",crossOrigin:t}){var d;const{audioRef:i,dispatch:u,state:s,notifyEnded:l}=y(),c=((d=s.tracks[s.currentIndex])==null?void 0:d.fileUrl)??"";return p.useEffect(()=>{const o=i.current;if(o){if(!c){o.removeAttribute("src");return}o.getAttribute("src")!==c&&(o.src=c,o.load())}},[i,s.currentIndex,s.tracks,c]),a.jsx("audio",{ref:i,className:e,style:r,preload:n,crossOrigin:t,controls:!1,onTimeUpdate:o=>{const g=o.currentTarget;u({type:"MEDIA_TIME_UPDATE",payload:{currentTime:g.currentTime,duration:g.duration,bufferedFraction:H(g)}})},onLoadedMetadata:o=>{const g=o.currentTarget;u({type:"MEDIA_LOADED_METADATA",payload:{duration:g.duration,bufferedFraction:H(g)}})},onEnded:()=>l(),onPlay:()=>u({type:"MEDIA_PLAY"}),onPause:()=>u({type:"MEDIA_PAUSE"}),onWaiting:()=>u({type:"MEDIA_WAITING"}),onCanPlay:()=>u({type:"MEDIA_CANPLAY"}),onError:()=>{var m;const o=i.current,g=(m=o==null?void 0:o.error)==null?void 0:m.code;u({type:"MEDIA_ERROR",payload:{message:g===1?"MEDIA_ERR_ABORTED":g===2?"MEDIA_ERR_NETWORK":g===3?"MEDIA_ERR_DECODE":g===4?"MEDIA_ERR_SRC_NOT_SUPPORTED":"MEDIA_ERR_UNKNOWN"}})}})}function I(e,r){return r<=0?0:Math.max(0,Math.min(r-1,e))}function Z(e,r){if(e.length<=1)return[...e];const n=e[r];if(!n)return[...e];const t=e.filter((i,u)=>u!==r);for(let i=t.length-1;i>0;i--){const u=Math.floor(Math.random()*(i+1));[t[i],t[u]]=[t[u],t[i]]}return[n,...t]}function je(e,r){const n=e.findIndex(t=>t.fileUrl===r);return n===-1?0:n}function Ge(e){const{tracks:r,currentIndex:n,repeatMode:t}=e,i=r.length;return i===0?{kind:"stop",nextIndex:0}:t==="one"?{kind:"replay_same"}:n<i-1?{kind:"advance",nextIndex:n+1}:t==="all"?{kind:"wrap",nextIndex:0}:{kind:"stop",nextIndex:I(n,i)}}function _e(e){const{tracks:r,currentIndex:n,repeatMode:t}=e,i=r.length;return i===0?0:n<i-1?n+1:t==="all"?0:I(n,i)}function De(e){const{tracks:r,currentIndex:n,repeatMode:t}=e,i=r.length;return i===0?0:n>0?n-1:t==="all"?i-1:0}function Ne(e){return e==="off"?"all":e==="all"?"one":"off"}function we(e,r){return(e==null?void 0:e.artworkUrl)??r??void 0}function Ue(e,r){return(e==null?void 0:e.album)??r??void 0}function A(e){return e.tracks[e.currentIndex]??null}function ee(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 C(e){var t;const r=e.duration;if(Number.isFinite(r)&&r>0)return r;const n=(t=e.tracks[e.currentIndex])==null?void 0:t.durationSeconds;return typeof n=="number"&&Number.isFinite(n)&&n>0?n:0}function re(e){const n=C(e)-e.currentTime;return Number.isFinite(n)?Math.max(0,n):0}function G(e){const r=C(e);return r>0?Math.min(1,Math.max(0,e.currentTime/r)):0}function ne(e){var n;const r=A(e);return we(r,(n=e.playlistMeta)==null?void 0:n.artworkUrl)}function te(e){var n;const r=A(e);return Ue(r,(n=e.playlistMeta)==null?void 0:n.subtitle)}function T(e,r){function n(t){const{state:i}=y(),s=(r(i)??"").trim(),{className:l,style:c,fallback:d,empty:o,children:g}=t;if(!s){const k=o??d??null;return k?a.jsx("span",{className:l,style:c,children:k}):null}return g?a.jsx("span",{className:l,style:c,children:g(s,i)}):a.jsx("span",{className:l,style:c,children:s})}return n.displayName=e,n}function E(e,r){return T(e,n=>r(A(n)))}const Fe=E("Ginger.Current.Title",e=>e==null?void 0:e.title),Le=E("Ginger.Current.Artist",e=>e==null?void 0:e.artist),Qe=T("Ginger.Current.Album",e=>te(e)),Be=E("Ginger.Current.Description",e=>e==null?void 0:e.description),$e=T("Ginger.Current.Copyright",e=>{var n;const r=A(e);return(r==null?void 0:r.copyright)??((n=e.playlistMeta)==null?void 0:n.copyright)}),Oe=E("Ginger.Current.Genre",e=>e==null?void 0:e.genre),Ye=E("Ginger.Current.Label",e=>e==null?void 0:e.label),Ve=E("Ginger.Current.Isrc",e=>e==null?void 0:e.isrc),Xe=E("Ginger.Current.TrackNumber",e=>(e==null?void 0:e.trackNumber)!=null?String(e.trackNumber):void 0);function ie({className:e,style:r,fallback:n,empty:t,children:i,format:u}){var d;const{state:s}=y(),l=(d=A(s))==null?void 0:d.year;if(typeof l!="number"||!Number.isFinite(l)){const o=t??n??null;return o?a.jsx("span",{className:e,style:r,children:o}):null}const c=u?u(l):String(l);return i?a.jsx("span",{className:e,style:r,children:i(c,s)}):a.jsx("span",{className:e,style:r,children:c})}ie.displayName="Ginger.Current.Year";function ue({className:e,style:r,fallback:n,empty:t,children:i,preserveWhitespace:u=!0}){var o;const{state:s}=y(),l=((o=A(s))==null?void 0:o.lyrics)??"",c=u?l.replace(/^\s+|\s+$/g,""):l.trim();if(!c){const g=t??n??null;return g?a.jsx("span",{className:e,style:r,children:g}):null}const d=u?{whiteSpace:"pre-wrap"}:void 0;return i?a.jsx("span",{className:e,style:{...d,...r},children:i(c,s)}):a.jsx("span",{className:e,style:{...d,...r},children:c})}ue.displayName="Ginger.Current.Lyrics";function se({visible:e=!1,className:r,style:n,fallback:t,empty:i,children:u}){var c;const{state:s}=y();if(!e)return null;const l=((c=A(s))==null?void 0:c.fileUrl)??"";if(!l){const d=i??t??null;return d?a.jsx("span",{className:r,style:n,children:d}):null}return u?a.jsx("span",{className:r,style:n,children:u(l,s)}):a.jsx("span",{className:r,style:n,children:l})}se.displayName="Ginger.Current.FileUrl";function ae({className:e,style:r,fallback:n,empty:t,sizes:i,loading:u,onError:s,decoding:l,imgStyle:c}){const{state:d}=y(),o=A(d),g=ne(d);if(!g){const m=t??n??null;return m?a.jsx("span",{className:e,style:r,children:m}):null}const k=[o==null?void 0:o.title,o==null?void 0:o.artist].filter(Boolean).join(" — ")||"Artwork";return a.jsx("span",{className:e,style:{display:"inline-block",background:"var(--ginger-artwork-bg, #f3f4f6)",borderRadius:"var(--ginger-artwork-radius, 6px)",overflow:"hidden",...r},children:a.jsx("img",{src:g,alt:k,sizes:i,loading:u,decoding:l,onError:s,style:{display:"block",width:"100%",height:"100%",objectFit:"cover",...c}})})}ae.displayName="Ginger.Current.Artwork";function le({base:e=0,className:r,style:n,fallback:t,empty:i,children:u}){const{state:s}=y();if(s.tracks.length===0){const d=i??t??null;return d?a.jsx("span",{className:r,style:n,children:d}):null}const c=String(s.currentIndex+e);return u?a.jsx("span",{className:r,style:n,children:u(c,s)}):a.jsx("span",{className:r,style:n,children:c})}le.displayName="Ginger.Current.QueueIndex";function oe({className:e,style:r,fallback:n,empty:t,children:i}){const{state:u}=y(),s=String(u.tracks.length);if(u.tracks.length===0){const l=t??n??null;return l?a.jsx("span",{className:e,style:r,children:l}):null}return i?a.jsx("span",{className:e,style:r,children:i(s,u)}):a.jsx("span",{className:e,style:r,children:s})}oe.displayName="Ginger.Current.QueueLength";function ce({base:e=0,separator:r=" / ",className:n,style:t,fallback:i,empty:u,children:s}){const{state:l}=y(),c=l.tracks.length;if(c===0){const k=u??i??null;return k?a.jsx("span",{className:n,style:t,children:k}):null}const d=String(l.currentIndex+e),o=String(c),g=`${d}${r}${o}`;return s?a.jsx("span",{className:n,style:t,children:s({index:d,length:o,label:g},l)}):a.jsx("span",{className:n,style:t,children:g})}ce.displayName="Ginger.Current.QueuePosition";function We(e){if(!Number.isFinite(e)||e<0)return"0:00";const r=Math.floor(e%60);return`${Math.floor(e/60)}:${r.toString().padStart(2,"0")}`}function _(e,r,n){const{className:t,style:i,fallback:u,empty:s,children:l,format:c=We}=n;if(!(e>=0)||!Number.isFinite(e)){const o=s??u??null;return o?a.jsx("span",{className:t,style:i,children:o}):null}const d=c(e);return l?a.jsx("span",{className:t,style:i,children:l(d,r)}):a.jsx("span",{className:t,style:i,children:d})}function de(e){const{state:r}=y();return _(r.currentTime,r,e)}de.displayName="Ginger.Current.Elapsed";function fe(e){const{state:r}=y();return _(C(r),r,e)}fe.displayName="Ginger.Current.Duration";function pe(e){const{state:r}=y();return _(re(r),r,e)}pe.displayName="Ginger.Current.Remaining";function ge({className:e,style:r,fallback:n,empty:t,children:i}){const{state:u}=y(),s=C(u),l=G(u);if(!(s>0)){const c=t??n??null;return c?a.jsx("span",{className:e,style:r,children:c}):null}return i?a.jsx("span",{className:e,style:r,children:i({fraction:l,currentTime:u.currentTime,duration:s},u)}):a.jsx("span",{className:e,style:r,children:`${Math.round(l*100)}%`})}ge.displayName="Ginger.Current.Progress";function ye({className:e,style:r,height:n=4}){const{state:t}=y(),i=`${Math.round(G(t)*100)}%`;return a.jsx("div",{className:e,style:{width:"100%",height:n,background:"var(--ginger-muted-color, #e5e7eb)",borderRadius:999,overflow:"hidden",...r},"aria-hidden":!0,children:a.jsx("div",{style:{width:i,height:"100%",background:"var(--ginger-primary-color, #111827)"}})})}ye.displayName="Ginger.Current.TimeRail";function xe({className:e,style:r,fallback:n,empty:t,children:i}){const{state:u}=y(),s=ee(u);return i?a.jsx("span",{className:e,style:r,children:i(s,u)}):a.jsx("span",{className:e,style:r,children:s})}xe.displayName="Ginger.Current.PlaybackState";function he({className:e,style:r,fallback:n,empty:t,children:i}){const{state:u}=y(),s=u.errorMessage??"";if(!s){const l=t??n??null;return l?a.jsx("span",{className:e,style:r,children:l}):null}return i?a.jsx("span",{className:e,style:r,children:i(s,u)}):a.jsx("span",{className:e,style:r,children:s})}he.displayName="Ginger.Current.ErrorMessage";function me({playLabel:e="Play",pauseLabel:r="Pause",type:n="button",...t}){const{state:i,togglePlayPause:u}=y();return a.jsx("button",{type:n,"aria-label":i.isPaused?"Play":"Pause",onClick:u,...t,children:i.isPaused?e:r})}me.displayName="Ginger.Control.PlayPause";const K={off:"Repeat off",all:"Repeat all",one:"Repeat one"};function be({type:e="button",...r}){const{state:n,cycleRepeat:t}=y();return a.jsx("button",{type:e,"aria-label":K[n.repeatMode],onClick:t,...r,children:K[n.repeatMode]})}be.displayName="Ginger.Control.Repeat";function ke({type:e="button",children:r="Next",...n}){const{next:t}=y();return a.jsx("button",{type:e,"aria-label":"Next track",onClick:t,...n,children:r})}ke.displayName="Ginger.Control.Next";function Pe({type:e="button",children:r="Previous",...n}){const{prev:t}=y();return a.jsx("button",{type:e,"aria-label":"Previous track",onClick:t,...n,children:r})}Pe.displayName="Ginger.Control.Previous";function Me({type:e="button",children:r="Shuffle",...n}){const{state:t,toggleShuffle:i}=y();return a.jsx("button",{type:e,"aria-pressed":t.isShuffled,"aria-label":"Shuffle",onClick:i,...n,children:r})}Me.displayName="Ginger.Control.Shuffle";function Ae({inputStyle:e,style:r,...n}){const{state:t,seek:i}=y(),u=Number.isFinite(t.duration)&&t.duration>0?t.duration:0,s=u>0?t.currentTime:0;return a.jsx("input",{type:"range",min:0,max:u>0?u:1,step:"any",value:Number.isFinite(s)?s:0,"aria-label":"Seek",onChange:l=>i(Number(l.currentTarget.value)),style:{width:"100%",...r,...e},...n})}Ae.displayName="Ginger.Control.SeekBar";function Te({rowStyle:e,renderTrack:r,playOnSelect:n=!0,style:t,...i}){const{state:u,playTrackAt:s,selectTrackAt:l}=y();return a.jsx("ul",{style:{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)",...t},...i,children:u.tracks.map((c,d)=>{const o=d===u.currentIndex;return a.jsx("li",{children:a.jsx("button",{type:"button",onClick:()=>{n?s(d):l(d)},style:{width:"100%",textAlign:"left",border:"none",background:o?"rgba(17, 24, 39, 0.06)":"transparent",color:"inherit",font:"inherit",cursor:"pointer",padding:"var(--ginger-playlist-row-padding, 6px 8px)",...e},children:r?r(c,d,o):a.jsxs("span",{children:[c.title,c.artist?` — ${c.artist}`:""]})})},`${c.fileUrl}-${d}`)})})}Te.displayName="Ginger.Playlist";const qe=T("Ginger.Queue.Title",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.title}),ze=T("Ginger.Queue.Subtitle",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.subtitle}),He=T("Ginger.Queue.Description",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.description}),Ke=T("Ginger.Queue.Copyright",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.copyright});function Ee({className:e,style:r,fallback:n,empty:t,imgStyle:i}){var c,d;const{state:u}=y(),s=(c=u.playlistMeta)==null?void 0:c.artworkUrl;if(!s){const o=t??n??null;return o?a.jsx("span",{className:e,style:r,children:o}):null}const l=((d=u.playlistMeta)==null?void 0:d.title)??"Playlist artwork";return a.jsx("span",{className:e,style:{display:"inline-block",background:"var(--ginger-artwork-bg, #f3f4f6)",borderRadius:"var(--ginger-artwork-radius, 6px)",overflow:"hidden",...r},children:a.jsx("img",{src:s,alt:l,style:{display:"block",width:"100%",height:"100%",objectFit:"cover",...i}})})}Ee.displayName="Ginger.Queue.Artwork";const S={currentTime:0,duration:0,bufferedFraction:0,isBuffering:!1,errorMessage:null};function Ie(e){const r=[...e.tracks];let n=I(e.currentIndex??0,r.length),t=null,i=r;return e.isShuffled&&r.length>1&&(t=[...r],i=Z(r,n),n=0),{tracks:i,currentIndex:n,isPaused:e.isPaused??!0,isShuffled:!!(e.isShuffled&&i.length>1),repeatMode:e.repeatMode??"off",originalTracks:t,playlistMeta:e.playlistMeta??null,...S}}function Je(e,r){switch(r.type){case"INIT":{const{tracks:n,currentIndex:t,playlistMeta:i,isPaused:u,isShuffled:s,repeatMode:l}=r.payload;return Ie({tracks:n,currentIndex:t,playlistMeta:i??null,isPaused:u??!0,isShuffled:s??!1,repeatMode:l??"off"})}case"SET_QUEUE":{const{tracks:n,currentIndex:t}=r.payload,i=[...n],u=I(t??e.currentIndex,i.length);return{...e,tracks:i,currentIndex:u,...S}}case"SET_INDEX":{const n=I(r.payload.index,e.tracks.length),t=r.payload.autoPlay,i=t===!0?!1:t===!1?!0:e.isPaused;return{...e,currentIndex:n,...S,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:Ne(e.repeatMode)};case"TOGGLE_SHUFFLE":{if(e.tracks.length<=1)return{...e,isShuffled:!1,originalTracks:null};if(!e.isShuffled){const s=[...e.tracks],l=Z(s,e.currentIndex);return{...e,isShuffled:!0,originalTracks:s,tracks:l,currentIndex:0}}const n=e.originalTracks?[...e.originalTracks]:[...e.tracks],t=e.tracks[e.currentIndex],i=(t==null?void 0:t.fileUrl)??"",u=je(n,i);return{...e,isShuffled:!1,originalTracks:null,tracks:n,currentIndex:I(u,n.length)}}case"NEXT":{const n=_e(e),t=n===e.currentIndex;return{...e,currentIndex:n,...t?{}:S,isPaused:t?e.isPaused:!1}}case"PREV":{const n=De(e),t=n===e.currentIndex;return{...e,currentIndex:n,...t?{}:S,isPaused:t?e.isPaused:!1}}case"MEDIA_TIME_UPDATE":return{...e,currentTime:r.payload.currentTime,duration:Number.isFinite(r.payload.duration)?r.payload.duration:e.duration,bufferedFraction:r.payload.bufferedFraction,isBuffering:!1};case"MEDIA_LOADED_METADATA":return{...e,duration:Number.isFinite(r.payload.duration)?r.payload.duration:e.duration,bufferedFraction:r.payload.bufferedFraction,errorMessage:null};case"SET_PLAYLIST_META":return{...e,playlistMeta:r.payload};case"MEDIA_ERROR":return{...e,errorMessage:r.payload.message,isPaused:!0,isBuffering:!1};case"MEDIA_WAITING":return{...e,isBuffering:!0};case"MEDIA_CANPLAY":return{...e,isBuffering:!1,errorMessage:null};case"MEDIA_PLAY":return{...e,isPaused:!1,isBuffering:!1};case"MEDIA_PAUSE":return{...e,isPaused:!0};case"RESET_MEDIA_TIMES":return{...e,currentTime:0,duration:0,bufferedFraction:0};default:return e}}const Ze={"--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 er({children:e,initialTracks:r=[],initialIndex:n=0,initialPlaylistMeta:t=null,initialShuffle:i=!1,initialRepeatMode:u="off",initialPaused:s=!0,className:l,style:c,onTrackChange:d,onPlay:o,onPause:g,onQueueEnd:k,onError:m}){var z;const P=p.useRef(null),[x,b]=p.useReducer(Je,void 0,()=>Ie({tracks:r,currentIndex:n,playlistMeta:t,isPaused:s,isShuffled:i,repeatMode:u})),D=x.tracks[x.currentIndex]??null;p.useEffect(()=>{d==null||d(D,x.currentIndex)},[D,x.currentIndex,d]),p.useEffect(()=>{x.errorMessage&&(m==null||m(x.errorMessage))},[x.errorMessage,m]);const v=p.useRef(void 0);p.useEffect(()=>{if(v.current===void 0){v.current=x.isPaused;return}v.current!==x.isPaused&&(x.isPaused?g==null||g():o==null||o()),v.current=x.isPaused},[x.isPaused,g,o]);const R=p.useCallback(()=>{var f;b({type:"PLAY"}),(f=P.current)==null||f.play().catch(h=>{b({type:"PAUSE"});const M=h instanceof Error?h.message:"Playback failed";m==null||m(M)})},[m]),j=p.useCallback(()=>{var f;b({type:"PAUSE"}),(f=P.current)==null||f.pause()},[]),N=p.useCallback(()=>{x.isPaused?R():j()},[j,R,x.isPaused]),w=p.useCallback(f=>{const h=P.current;h&&Number.isFinite(f)&&(h.currentTime=Math.max(0,f))},[]),U=p.useCallback(f=>{const h=P.current;h&&(h.volume=Math.min(1,Math.max(0,f)))},[]),F=p.useCallback(f=>{const h=P.current;h&&(h.muted=f)},[]),L=p.useCallback(()=>{b({type:"NEXT"})},[]),Q=p.useCallback(()=>{b({type:"PREV"})},[]),B=p.useCallback(f=>{b({type:"SET_REPEAT",payload:f})},[]),$=p.useCallback(()=>{b({type:"CYCLE_REPEAT"})},[]),O=p.useCallback(()=>{b({type:"TOGGLE_SHUFFLE"})},[]),Y=p.useCallback((f,h)=>{b({type:"SET_QUEUE",payload:{tracks:f,currentIndex:h}})},[]),V=p.useCallback(f=>{b({type:"SET_INDEX",payload:{index:f,autoPlay:!0}}),queueMicrotask(()=>{var h;(h=P.current)==null||h.play().catch(()=>{})})},[]),X=p.useCallback(f=>{b({type:"SET_INDEX",payload:{index:f,autoPlay:!1}})},[]),W=p.useCallback(f=>{b({type:"SET_PLAYLIST_META",payload:f})},[]),Se=(z=x.tracks[x.currentIndex])==null?void 0:z.fileUrl;p.useEffect(()=>{const f=P.current;f&&(x.isPaused?f.pause():f.play().catch(h=>{b({type:"PAUSE"});const M=h instanceof Error?h.message:"Playback failed";m==null||m(M)}))},[x.isPaused,Se,m]);const q=p.useCallback(()=>{const f=Ge(x);if(f.kind==="replay_same"){const M=P.current;M&&(M.currentTime=0,M.play().catch(()=>{})),b({type:"PLAY"});return}if(f.kind==="stop"){b({type:"PAUSE"}),k==null||k();return}const h=f.nextIndex;b({type:"SET_INDEX",payload:{index:h,autoPlay:!0}}),queueMicrotask(()=>{var M;(M=P.current)==null||M.play().catch(()=>{})})},[k,x]),Ce=p.useMemo(()=>({state:x,dispatch:b,audioRef:P,notifyEnded:q,play:R,pause:j,togglePlayPause:N,seek:w,setVolume:U,setMuted:F,next:L,prev:Q,setRepeatMode:B,cycleRepeat:$,toggleShuffle:O,setQueue:Y,playTrackAt:V,selectTrackAt:X,setPlaylistMeta:W}),[$,b,L,q,j,R,V,X,Q,w,F,Y,B,W,U,x,N,O]),ve=p.useMemo(()=>({...Ze,...c}),[c]);return a.jsx(J.Provider,{value:Ce,children:a.jsx("div",{className:l,style:ve,children:e})})}const rr={Provider:er,Player:Re,Current:{Title:Fe,Artist:Le,Album:Qe,Description:Be,Copyright:$e,Genre:Oe,Label:Ye,Isrc:Ve,TrackNumber:Xe,Year:ie,Lyrics:ue,FileUrl:se,Artwork:ae,QueueIndex:le,QueueLength:oe,QueuePosition:ce,Elapsed:de,Duration:fe,Remaining:pe,Progress:ge,TimeRail:ye,PlaybackState:xe,ErrorMessage:he},Queue:{Title:qe,Subtitle:ze,Description:He,Copyright:Ke,Artwork:Ee},Control:{PlayPause:me,Repeat:be,Next:ke,Previous:Pe,Shuffle:Me,SeekBar:Ae},Playlist:Te};function nr(){const e=y(),{state:r}=e;return p.useMemo(()=>({state:r,currentTrack:A(r),playbackUi:ee(r),duration:C(r),remaining:re(r),progress:G(r),artworkUrl:ne(r),albumLine:te(r),play:e.play,pause:e.pause,togglePlayPause:e.togglePlayPause,seek:e.seek,setVolume:e.setVolume,setMuted:e.setMuted,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.setPlaylistMeta,e.setQueue,e.setRepeatMode,e.setVolume,e.togglePlayPause,e.toggleShuffle,r])}exports.Ginger=rr;exports.useGinger=nr;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),f=require("react"),le=f.createContext(null);function y(){const e=f.useContext(le);if(!e)throw new Error("Ginger components must be used within <Ginger.Provider>");return e}function ue(e){const{buffered:r,duration:t}=e;return!(t>0)||r.length===0?0:Math.min(1,r.end(r.length-1)/t)}function Ve({className:e,style:r,preload:t="metadata",crossOrigin:n}){var m;const{audioRef:i,dispatch:u,state:a,notifyEnded:o}=y(),c=((m=a.tracks[a.currentIndex])==null?void 0:m.fileUrl)??"",d=f.useRef({currentTime:-1,duration:-1,bufferedFraction:-1}),p=(l,b=!1)=>{const k={currentTime:l.currentTime,duration:l.duration,bufferedFraction:ue(l)},P=d.current,M=Math.abs(k.currentTime-P.currentTime)>=.25||Math.abs(k.duration-P.duration)>=.01||Math.abs(k.bufferedFraction-P.bufferedFraction)>=.01;!b&&!M||(d.current=k,u({type:"MEDIA_TIME_UPDATE",payload:k}))};return f.useEffect(()=>{const l=i.current;l&&(l.volume=a.volume,l.muted=a.muted,l.playbackRate=a.playbackRate)},[i,a.volume,a.muted,a.playbackRate]),f.useEffect(()=>{const l=i.current;if(l){if(!c){l.removeAttribute("src"),d.current={currentTime:-1,duration:-1,bufferedFraction:-1};return}l.getAttribute("src")!==c&&(l.src=c,l.load(),d.current={currentTime:-1,duration:-1,bufferedFraction:-1})}},[i,a.currentIndex,a.tracks,c]),s.jsx("audio",{ref:i,className:e,style:r,preload:t,crossOrigin:n,controls:!1,playsInline:!0,onTimeUpdate:l=>{p(l.currentTarget)},onLoadedMetadata:l=>{const b=l.currentTarget;d.current={currentTime:-1,duration:-1,bufferedFraction:-1},u({type:"MEDIA_LOADED_METADATA",payload:{duration:b.duration,bufferedFraction:ue(b)}})},onSeeking:l=>p(l.currentTarget,!0),onSeeked:l=>p(l.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:l=>p(l.currentTarget,!0),onVolumeChange:l=>{const b=l.currentTarget;u({type:"MEDIA_VOLUME_SYNC",payload:{volume:b.volume,muted:b.muted}})},onError:()=>{var P;const l=i.current,b=(P=l==null?void 0:l.error)==null?void 0:P.code;u({type:"MEDIA_ERROR",payload:{message:b===1?"MEDIA_ERR_ABORTED":b===2?"MEDIA_ERR_NETWORK":b===3?"MEDIA_ERR_DECODE":b===4?"MEDIA_ERR_SRC_NOT_SUPPORTED":"MEDIA_ERR_UNKNOWN"}})}})}function R(e,r){return r<=0?0:Math.max(0,Math.min(r-1,e))}function oe(e,r){if(e.length<=1)return[...e];const t=e[r];if(!t)return[...e];const n=e.filter((i,u)=>u!==r);for(let i=n.length-1;i>0;i--){const u=Math.floor(Math.random()*(i+1));[n[i],n[u]]=[n[u],n[i]]}return[t,...n]}function ae(e){return e?e.id!=null&&e.id!==""?`id:${e.id}`:`file:${e.fileUrl}`:""}function Qe(e,r){const t=ae(r);if(!t)return 0;const n=e.findIndex(i=>ae(i)===t);return n===-1?0:n}function Xe(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:R(t,i)}}function We(e){const{tracks:r,currentIndex:t,repeatMode:n}=e,i=r.length;return i===0?0:t<i-1?t+1:n==="all"?0:R(t,i)}function Ke(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 ze(e){return e==="off"?"all":e==="all"?"one":"off"}function qe(e,r){return(e==null?void 0:e.artworkUrl)??r??void 0}function He(e,r){return(e==null?void 0:e.album)??r??void 0}function E(e){return e.tracks[e.currentIndex]??null}function ce(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 C(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 de(e){const t=C(e)-e.currentTime;return Number.isFinite(t)?Math.max(0,t):0}function U(e){const r=C(e);return r>0?Math.min(1,Math.max(0,e.currentTime/r)):0}function fe(e){var t;const r=E(e);return qe(r,(t=e.playlistMeta)==null?void 0:t.artworkUrl)}function pe(e){var t;const r=E(e);return He(r,(t=e.playlistMeta)==null?void 0:t.subtitle)}function A(e,r){function t(n){const{state:i}=y(),a=(r(i)??"").trim(),{className:o,style:c,fallback:d,empty:p,children:m}=n;if(!a){const l=p??d??null;return l?s.jsx("span",{className:o,style:c,children:l}):null}return m?s.jsx("span",{className:o,style:c,children:m(a,i)}):s.jsx("span",{className:o,style:c,children:a})}return t.displayName=e,t}function v(e,r){return A(e,t=>r(E(t)))}const Je=v("Ginger.Current.Title",e=>e==null?void 0:e.title),Ze=v("Ginger.Current.Artist",e=>e==null?void 0:e.artist),er=A("Ginger.Current.Album",e=>pe(e)),rr=v("Ginger.Current.Description",e=>e==null?void 0:e.description),tr=A("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)}),nr=v("Ginger.Current.Genre",e=>e==null?void 0:e.genre),ir=v("Ginger.Current.Label",e=>e==null?void 0:e.label),ur=v("Ginger.Current.Isrc",e=>e==null?void 0:e.isrc),ar=v("Ginger.Current.TrackNumber",e=>(e==null?void 0:e.trackNumber)!=null?String(e.trackNumber):void 0);function ge({className:e,style:r,fallback:t,empty:n,children:i,format:u}){var d;const{state:a}=y(),o=(d=E(a))==null?void 0:d.year;if(typeof o!="number"||!Number.isFinite(o)){const p=n??t??null;return p?s.jsx("span",{className:e,style:r,children:p}):null}const c=u?u(o):String(o);return i?s.jsx("span",{className:e,style:r,children:i(c,a)}):s.jsx("span",{className:e,style:r,children:c})}ge.displayName="Ginger.Current.Year";function ye({className:e,style:r,fallback:t,empty:n,children:i,preserveWhitespace:u=!0}){var p;const{state:a}=y(),o=((p=E(a))==null?void 0:p.lyrics)??"",c=u?o.replace(/^\s+|\s+$/g,""):o.trim();if(!c){const m=n??t??null;return m?s.jsx("span",{className:e,style:r,children:m}):null}const d=u?{whiteSpace:"pre-wrap"}:void 0;return i?s.jsx("span",{className:e,style:{...d,...r},children:i(c,a)}):s.jsx("span",{className:e,style:{...d,...r},children:c})}ye.displayName="Ginger.Current.Lyrics";function me({visible:e=!1,className:r,style:t,fallback:n,empty:i,children:u}){var c;const{state:a}=y();if(!e)return null;const o=((c=E(a))==null?void 0:c.fileUrl)??"";if(!o){const d=i??n??null;return d?s.jsx("span",{className:r,style:t,children:d}):null}return u?s.jsx("span",{className:r,style:t,children:u(o,a)}):s.jsx("span",{className:r,style:t,children:o})}me.displayName="Ginger.Current.FileUrl";function be({className:e,style:r,fallback:t,empty:n,sizes:i,loading:u,onError:a,decoding:o,imgStyle:c}){const{state:d}=y(),p=E(d),m=fe(d);if(!m){const b=n??t??null;return b?s.jsx("span",{className:e,style:r,children:b}):null}const l=[p==null?void 0:p.title,p==null?void 0:p.artist].filter(Boolean).join(" — ")||"Artwork";return s.jsx("span",{className:e,style:{display:"inline-block",background:"var(--ginger-artwork-bg, transparent)",borderRadius:"var(--ginger-artwork-radius, 0)",overflow:"hidden",...r},children:s.jsx("img",{src:m,alt:l,sizes:i,loading:u,decoding:o,onError:a,style:{display:"block",width:"100%",height:"100%",objectFit:"cover",...c}})})}be.displayName="Ginger.Current.Artwork";function xe({base:e=0,className:r,style:t,fallback:n,empty:i,children:u}){const{state:a}=y();if(a.tracks.length===0){const d=i??n??null;return d?s.jsx("span",{className:r,style:t,children:d}):null}const c=String(a.currentIndex+e);return u?s.jsx("span",{className:r,style:t,children:u(c,a)}):s.jsx("span",{className:r,style:t,children:c})}xe.displayName="Ginger.Current.QueueIndex";function he({className:e,style:r,fallback:t,empty:n,children:i}){const{state:u}=y(),a=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 i?s.jsx("span",{className:e,style:r,children:i(a,u)}):s.jsx("span",{className:e,style:r,children:a})}he.displayName="Ginger.Current.QueueLength";function ke({base:e=0,separator:r=" / ",className:t,style:n,fallback:i,empty:u,children:a}){const{state:o}=y(),c=o.tracks.length;if(c===0){const l=u??i??null;return l?s.jsx("span",{className:t,style:n,children:l}):null}const d=String(o.currentIndex+e),p=String(c),m=`${d}${r}${p}`;return a?s.jsx("span",{className:t,style:n,children:a({index:d,length:p,label:m},o)}):s.jsx("span",{className:t,style:n,children:m})}ke.displayName="Ginger.Current.QueuePosition";function sr(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:u,empty:a,children:o,format:c=sr}=t;if(!(e>=0)||!Number.isFinite(e)){const p=a??u??null;return p?s.jsx("span",{className:n,style:i,children:p}):null}const d=c(e);return o?s.jsx("span",{className:n,style:i,children:o(d,r)}):s.jsx("span",{className:n,style:i,children:d})}function Pe(e){const{state:r}=y();return L(r.currentTime,r,e)}Pe.displayName="Ginger.Current.Elapsed";function Me(e){const{state:r}=y();return L(C(r),r,e)}Me.displayName="Ginger.Current.Duration";function Te(e){const{state:r}=y();return L(de(r),r,e)}Te.displayName="Ginger.Current.Remaining";function Ee({className:e,style:r,fallback:t,empty:n,children:i}){const{state:u}=y(),a=C(u),o=U(u);if(!(a>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:o,currentTime:u.currentTime,duration:a},u)}):s.jsx("span",{className:e,style:r,children:`${Math.round(o*100)}%`})}Ee.displayName="Ginger.Current.Progress";function Ae({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)"}})})}Ae.displayName="Ginger.Current.TimeRail";function ve({className:e,style:r,fallback:t,empty:n,children:i}){const{state:u}=y(),a=ce(u);return i?s.jsx("span",{className:e,style:r,children:i(a,u)}):s.jsx("span",{className:e,style:r,children:a})}ve.displayName="Ginger.Current.PlaybackState";function Re({className:e,style:r,fallback:t,empty:n,children:i}){const{state:u}=y(),a=u.errorMessage??"";if(!a){const o=n??t??null;return o?s.jsx("span",{className:e,style:r,children:o}):null}return i?s.jsx("span",{className:e,style:r,children:i(a,u)}):s.jsx("span",{className:e,style:r,children:a})}Re.displayName="Ginger.Current.ErrorMessage";function Ie({playLabel:e="Play",pauseLabel:r="Pause",type:t="button",...n}){const{state:i,togglePlayPause:u}=y();return s.jsx("button",{type:t,"aria-label":i.isPaused?"Play":"Pause",onClick:u,...n,children:i.isPaused?e:r})}Ie.displayName="Ginger.Control.PlayPause";const se={off:"Repeat off",all:"Repeat all",one:"Repeat one"};function Se({type:e="button",...r}){const{state:t,cycleRepeat:n}=y();return s.jsx("button",{type:e,"aria-label":se[t.repeatMode],onClick:n,...r,children:se[t.repeatMode]})}Se.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 je({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})}je.displayName="Ginger.Control.Previous";function Ge({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})}Ge.displayName="Ginger.Control.Shuffle";function _e({inputStyle:e,style:r,...t}){const{state:n,seek:i}=y(),u=Number.isFinite(n.duration)&&n.duration>0?n.duration:0,a=u>0?n.currentTime:0;return s.jsx("input",{type:"range",min:0,max:u>0?u:1,step:"any",value:Number.isFinite(a)?a:0,"aria-label":"Seek",onChange:o=>i(Number(o.currentTarget.value)),style:{width:"100%",...r,...e},...t})}_e.displayName="Ginger.Control.SeekBar";function Ne({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:u=>i(Number(u.currentTarget.value)),style:{width:"100%",...r,...e},...t})}Ne.displayName="Ginger.Control.Volume";function De({muteLabel:e="Mute",unmuteLabel:r="Unmute",type:t="button",...n}){const{state:i,toggleMute:u}=y();return s.jsx("button",{type:t,"aria-pressed":i.muted,"aria-label":i.muted?"Unmute":"Mute",onClick:u,...n,children:i.muted?r:e})}De.displayName="Ginger.Control.Mute";const lr=[.5,.75,1,1.25,1.5,2];function we({rates:e=lr,style:r,...t}){const{state:n,setPlaybackRate:i}=y(),u=f.useMemo(()=>Array.from(new Set([...e,n.playbackRate])).sort((a,o)=>a-o),[e,n.playbackRate]);return s.jsx("select",{"aria-label":"Playback speed",value:String(n.playbackRate),style:r,onChange:a=>i(Number(a.currentTarget.value)),...t,children:u.map(a=>s.jsx("option",{value:String(a),children:a===1?"1× normal":`${a}×`},a))})}we.displayName="Ginger.Control.PlaybackRate";const w=f.createContext(null);function or(){const e=f.useContext(w);if(!e)throw new Error("Ginger.Playlist.Track must be used inside <Ginger.Playlist>");return e}function Ue({children:e,rowStyle:r,renderTrack:t,playOnSelect:n=!0,style:i,...u}){const{state:a,playTrackAt:o,selectTrackAt:c}=y(),d={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:d,...u,children:e})}):s.jsx(w.Provider,{value:{playOnSelect:n},children:s.jsx("ul",{style:d,...u,children:a.tracks.map((m,l)=>{const b=l===a.currentIndex;return s.jsx("li",{children:s.jsx("button",{type:"button",onClick:()=>{n?o(l):c(l)},style:{width:"100%",textAlign:"left",border:"none",background:b?"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(m,l,b):s.jsxs("span",{children:[m.title,m.artist?` — ${m.artist}`:""]})})},`${m.fileUrl}-${l}`)})})})}Ue.displayName="Ginger.Playlist";function Le({index:e,className:r,style:t,children:n,liProps:i,onClick:u,...a}){const{playOnSelect:o}=or(),{state:c,playTrackAt:d,selectTrackAt:p}=y(),m=e===c.currentIndex,l=c.tracks[e],b=l!=null?s.jsxs("span",{children:[l.title,l.artist?` — ${l.artist}`:""]}):null;return s.jsx("li",{...i,children:s.jsx("button",{type:"button","aria-current":m?"true":void 0,"data-ginger-active":m||void 0,className:r,style:{width:"100%",textAlign:"left",border:"none",background:m?"rgba(17, 24, 39, 0.06)":"transparent",color:"inherit",font:"inherit",cursor:"pointer",padding:"var(--ginger-playlist-row-padding, 6px 8px)",...t},...a,onClick:k=>{u==null||u(k),!k.defaultPrevented&&(o?d(e):p(e))},children:n??b})})}Le.displayName="Ginger.Playlist.Track";const cr=Object.assign(Ue,{Track:Le}),dr=A("Ginger.Queue.Title",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.title}),fr=A("Ginger.Queue.Subtitle",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.subtitle}),pr=A("Ginger.Queue.Description",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.description}),gr=A("Ginger.Queue.Copyright",e=>{var r;return(r=e.playlistMeta)==null?void 0:r.copyright});function Fe({className:e,style:r,fallback:t,empty:n,imgStyle:i}){var c,d;const{state:u}=y(),a=(c=u.playlistMeta)==null?void 0:c.artworkUrl;if(!a){const p=n??t??null;return p?s.jsx("span",{className:e,style:r,children:p}):null}const o=((d=u.playlistMeta)==null?void 0:d.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:a,alt:o,style:{display:"block",width:"100%",height:"100%",objectFit:"cover",...i}})})}Fe.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 S={currentTime:0,duration:0,bufferedFraction:0,isBuffering:!1,errorMessage:null},yr={...S,volume:1,muted:!1,playbackRate:1};function Oe(e){const r=[...e.tracks];let t=R(e.currentIndex??0,r.length),n=null,i=r;return e.isShuffled&&r.length>1&&(n=[...r],i=oe(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,...yr,volume:D(e.volume??1),muted:e.muted??!1,playbackRate:F(e.playbackRate??1)}}function mr(e,r){switch(r.type){case"INIT":{const{tracks:t,currentIndex:n,playlistMeta:i,isPaused:u,isShuffled:a,repeatMode:o,volume:c,muted:d,playbackRate:p}=r.payload;return Oe({tracks:t,currentIndex:n,playlistMeta:i??null,isPaused:u??!0,isShuffled:a??!1,repeatMode:o??"off",volume:c,muted:d,playbackRate:p})}case"SET_QUEUE":{const{tracks:t,currentIndex:n}=r.payload,i=[...t],u=R(n??e.currentIndex,i.length);return{...e,tracks:i,currentIndex:u,isShuffled:!1,originalTracks:null,...S}}case"SET_INDEX":{const t=R(r.payload.index,e.tracks.length),n=r.payload.autoPlay,i=n===!0?!1:n===!1?!0:e.isPaused;return{...e,currentIndex:t,...S,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:ze(e.repeatMode)};case"TOGGLE_SHUFFLE":{if(e.tracks.length<=1)return{...e,isShuffled:!1,originalTracks:null};if(!e.isShuffled){const u=[...e.tracks],a=oe(u,e.currentIndex);return{...e,isShuffled:!0,originalTracks:u,tracks:a,currentIndex:0}}const t=e.originalTracks?[...e.originalTracks]:[...e.tracks],n=e.tracks[e.currentIndex],i=Qe(t,n);return{...e,isShuffled:!1,originalTracks:null,tracks:t,currentIndex:R(i,t.length)}}case"NEXT":{const t=We(e),n=t===e.currentIndex;return{...e,currentIndex:t,...n?{}:S,isPaused:n?e.isPaused:!1}}case"PREV":{const t=Ke(e),n=t===e.currentIndex;return{...e,currentIndex:t,...n?{}:S,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 br={"--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 xr({children:e,initialTracks:r=[],initialIndex:t=0,initialPlaylistMeta:n=null,initialShuffle:i=!1,initialRepeatMode:u="off",initialPaused:a=!0,initialVolume:o=1,initialMuted:c=!1,initialPlaybackRate:d=1,className:p,style:m,onTrackChange:l,onPlay:b,onPause:k,onQueueEnd:P,onError:M}){var ie;const I=f.useRef(null),[x,h]=f.useReducer(mr,void 0,()=>Oe({tracks:r,currentIndex:t,playlistMeta:n,isPaused:a,isShuffled:i,repeatMode:u,volume:o,muted:c,playbackRate:d})),O=f.useRef(x);f.useEffect(()=>{O.current=x},[x]);const $=x.tracks[x.currentIndex]??null;f.useEffect(()=>{l==null||l($,x.currentIndex)},[$,x.currentIndex,l]),f.useEffect(()=>{x.errorMessage&&(M==null||M(x.errorMessage))},[x.errorMessage,M]);const j=f.useRef(void 0);f.useEffect(()=>{if(j.current===void 0){j.current=x.isPaused;return}j.current!==x.isPaused&&(x.isPaused?k==null||k():b==null||b()),j.current=x.isPaused},[x.isPaused,k,b]);const G=f.useCallback(()=>{h({type:"PLAY"})},[]),_=f.useCallback(()=>{var g;h({type:"PAUSE"}),(g=I.current)==null||g.pause()},[]),Y=f.useCallback(()=>{x.isPaused?G():_()},[_,G,x.isPaused]),B=f.useCallback(g=>{const T=I.current;T&&Number.isFinite(g)&&(T.currentTime=Math.max(0,g))},[]),V=f.useCallback(g=>{h({type:"SET_VOLUME",payload:D(g)})},[]),Q=f.useCallback(g=>{h({type:"SET_MUTED",payload:g})},[]),X=f.useCallback(()=>{h({type:"TOGGLE_MUTE"})},[]),W=f.useCallback(g=>{h({type:"SET_PLAYBACK_RATE",payload:F(g)})},[]),K=f.useCallback(()=>{h({type:"NEXT"})},[]),z=f.useCallback(()=>{h({type:"PREV"})},[]),q=f.useCallback(g=>{h({type:"SET_REPEAT",payload:g})},[]),H=f.useCallback(()=>{h({type:"CYCLE_REPEAT"})},[]),J=f.useCallback(()=>{h({type:"TOGGLE_SHUFFLE"})},[]),Z=f.useCallback((g,T)=>{h({type:"SET_QUEUE",payload:{tracks:g,currentIndex:T}})},[]),ee=f.useCallback(g=>{h({type:"SET_INDEX",payload:{index:g,autoPlay:!0}})},[]),re=f.useCallback(g=>{h({type:"SET_INDEX",payload:{index:g,autoPlay:!1}})},[]),te=f.useCallback(g=>{h({type:"SET_PLAYLIST_META",payload:g})},[]),$e=(ie=x.tracks[x.currentIndex])==null?void 0:ie.fileUrl;f.useEffect(()=>{const g=I.current;g&&(x.isPaused?g.pause():g.play().catch(T=>{h({type:"PAUSE"});const N=T instanceof Error?T.message:"Playback failed";M==null||M(N)}))},[x.isPaused,$e,M]);const ne=f.useCallback(()=>{const g=Xe(O.current);if(g.kind==="replay_same"){const N=I.current;N&&(N.currentTime=0),h({type:"PLAY"});return}if(g.kind==="stop"){h({type:"PAUSE"}),P==null||P();return}const T=g.nextIndex;h({type:"SET_INDEX",payload:{index:T,autoPlay:!0}})},[P]),Ye=f.useMemo(()=>({state:x,dispatch:h,audioRef:I,notifyEnded:ne,play:G,pause:_,togglePlayPause:Y,seek:B,setVolume:V,setMuted:Q,toggleMute:X,setPlaybackRate:W,next:K,prev:z,setRepeatMode:q,cycleRepeat:H,toggleShuffle:J,setQueue:Z,playTrackAt:ee,selectTrackAt:re,setPlaylistMeta:te}),[H,h,K,ne,_,G,ee,re,z,B,Q,W,Z,q,te,V,x,X,Y,J]),Be=f.useMemo(()=>({...br,...m}),[m]);return s.jsx(le.Provider,{value:Ye,children:s.jsx("div",{className:p,style:Be,children:e})})}const hr={Provider:xr,Player:Ve,Current:{Title:Je,Artist:Ze,Album:er,Description:rr,Copyright:tr,Genre:nr,Label:ir,Isrc:ur,TrackNumber:ar,Year:ge,Lyrics:ye,FileUrl:me,Artwork:be,QueueIndex:xe,QueueLength:he,QueuePosition:ke,Elapsed:Pe,Duration:Me,Remaining:Te,Progress:Ee,TimeRail:Ae,PlaybackState:ve,ErrorMessage:Re},Queue:{Title:dr,Subtitle:fr,Description:pr,Copyright:gr,Artwork:Fe},Control:{PlayPause:Ie,Repeat:Se,Next:Ce,Previous:je,Shuffle:Ge,SeekBar:_e,Volume:Ne,Mute:De,PlaybackRate:we},Playlist:cr};function kr(){const e=y(),{state:r}=e;return f.useMemo(()=>({state:r,currentTrack:E(r),playbackUi:ce(r),duration:C(r),remaining:de(r),progress:U(r),artworkUrl:fe(r),albumLine:pe(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,audioRef:e.audioRef,dispatch:e.dispatch}),[e.audioRef,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=hr;exports.useGinger=kr;
2
2
  //# sourceMappingURL=index.cjs.map