@lucaismyname/ginger 0.0.41 → 0.0.42

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 (50) hide show
  1. package/README.md +7 -1
  2. package/dist/client.cjs +1 -1
  3. package/dist/client.js +4 -4
  4. package/dist/crossfade/crossfadeGraph.d.ts +47 -0
  5. package/dist/crossfade/crossfadeGraph.d.ts.map +1 -0
  6. package/dist/crossfade/index.cjs +2 -0
  7. package/dist/crossfade/index.cjs.map +1 -0
  8. package/dist/crossfade/index.d.ts +5 -0
  9. package/dist/crossfade/index.d.ts.map +1 -0
  10. package/dist/crossfade/index.js +124 -0
  11. package/dist/crossfade/index.js.map +1 -0
  12. package/dist/crossfade/useGingerCrossfade.d.ts +66 -0
  13. package/dist/crossfade/useGingerCrossfade.d.ts.map +1 -0
  14. package/dist/equalizer/index.cjs +1 -1
  15. package/dist/equalizer/index.js +1 -1
  16. package/dist/{ginger-CgHqHrrG.js → ginger-B2DgE-2a.js} +5 -4
  17. package/dist/{ginger-CgHqHrrG.js.map → ginger-B2DgE-2a.js.map} +1 -1
  18. package/dist/ginger-Dv3iO_xQ.cjs +2 -0
  19. package/dist/{ginger-DFdZGaMi.cjs.map → ginger-Dv3iO_xQ.cjs.map} +1 -1
  20. package/dist/index.cjs +1 -1
  21. package/dist/index.js +4 -4
  22. package/dist/remote/index.cjs +1 -1
  23. package/dist/remote/index.js +1 -1
  24. package/dist/selectors-BT3WSsKN.js +42 -0
  25. package/dist/selectors-BT3WSsKN.js.map +1 -0
  26. package/dist/selectors-CEGlYoFu.cjs +2 -0
  27. package/dist/selectors-CEGlYoFu.cjs.map +1 -0
  28. package/dist/spatial/index.cjs +1 -1
  29. package/dist/spatial/index.js +1 -1
  30. package/dist/testing/index.cjs +1 -1
  31. package/dist/testing/index.js +1 -1
  32. package/dist/transitions-CmNkf3sd.js +90 -0
  33. package/dist/transitions-CmNkf3sd.js.map +1 -0
  34. package/dist/transitions-Dx08t68T.cjs +2 -0
  35. package/dist/transitions-Dx08t68T.cjs.map +1 -0
  36. package/dist/{useGinger-BXgia32v.cjs → useGinger-4uvPoChz.cjs} +2 -2
  37. package/dist/{useGinger-BXgia32v.cjs.map → useGinger-4uvPoChz.cjs.map} +1 -1
  38. package/dist/{useGinger-hpp2pAGY.js → useGinger-Dz0cPyD1.js} +2 -2
  39. package/dist/{useGinger-hpp2pAGY.js.map → useGinger-Dz0cPyD1.js.map} +1 -1
  40. package/dist/useGingerChapterProgress-D2pdmyjg.cjs +2 -0
  41. package/dist/{useGingerChapterProgress-COLWYX2-.cjs.map → useGingerChapterProgress-D2pdmyjg.cjs.map} +1 -1
  42. package/dist/{useGingerChapterProgress-Jj_zfnds.js → useGingerChapterProgress-wxAmN_uo.js} +25 -24
  43. package/dist/{useGingerChapterProgress-Jj_zfnds.js.map → useGingerChapterProgress-wxAmN_uo.js.map} +1 -1
  44. package/package.json +6 -1
  45. package/dist/ginger-DFdZGaMi.cjs +0 -2
  46. package/dist/selectors-BalBCc7X.js +0 -127
  47. package/dist/selectors-BalBCc7X.js.map +0 -1
  48. package/dist/selectors-YXnP8Y8g.cjs +0 -2
  49. package/dist/selectors-YXnP8Y8g.cjs.map +0 -1
  50. package/dist/useGingerChapterProgress-COLWYX2-.cjs +0 -2
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ginger-DFdZGaMi.cjs"),s=require("./useGinger-BXgia32v.cjs"),r=require("./useGingerChapterProgress-COLWYX2-.cjs"),i=require("./liveAudioGraph-0cpHD_Ic.cjs"),n=require("./selectors-YXnP8Y8g.cjs"),a=require("./GingerSplitContexts-C7puo0M7.cjs");exports.Chapters=e.Chapters;exports.Ginger=e.Ginger;exports.LyricsSynced=e.LyricsSynced;exports.Pause=e.Pause;exports.Play=e.Play;exports.RepeatGlyph=e.RepeatGlyph;exports.ShuffleIcon=e.ShuffleIcon;exports.SkipBack=e.SkipBack;exports.SkipForward=e.SkipForward;exports.Volume2=e.Volume2;exports.VolumeX=e.VolumeX;exports.Wrapper=e.Wrapper;exports.clampPlaybackRate=e.clampPlaybackRate;exports.clampVolume=e.clampVolume;exports.defaultGingerLocale=e.defaultGingerLocale;exports.parseLrc=e.parseLrc;exports.useGingerChapters=e.useGingerChapters;exports.useGingerLocale=e.useGingerLocale;exports.useGingerLyricsSync=e.useGingerLyricsSync;exports.usePlayPauseBinding=e.usePlayPauseBinding;exports.useSeekBarBinding=e.useSeekBarBinding;exports.useVolumeSlider=e.useVolumeSlider;exports.useGinger=s.useGinger;exports.createGingerStore=r.createGingerStore;exports.useGingerChapterProgress=r.useGingerChapterProgress;exports.useGingerDebugLog=r.useGingerDebugLog;exports.useGingerKeyboardShortcuts=r.useGingerKeyboardShortcuts;exports.useGingerLiveAnalyzer=r.useGingerLiveAnalyzer;exports.useGingerPlaybackHistory=r.useGingerPlaybackHistory;exports.useGingerSleepTimer=r.useGingerSleepTimer;exports.useGingerVolumeFade=r.useGingerVolumeFade;exports.useNextTrackPrefetch=r.useNextTrackPrefetch;exports.useSeekDrag=r.useSeekDrag;exports.attachLiveAnalyser=i.attachLiveAnalyser;exports.detachLiveAnalyser=i.detachLiveAnalyser;exports.setProcessingChain=i.setProcessingChain;exports.derivePlaybackUiState=n.derivePlaybackUiState;exports.gingerStateFromContextValues=a.gingerStateFromContextValues;exports.gingerStateFromContexts=a.gingerStateFromContexts;exports.useGingerMedia=a.useGingerMedia;exports.useGingerPlayback=a.useGingerPlayback;exports.useGingerState=a.useGingerState;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ginger-Dv3iO_xQ.cjs"),s=require("./useGinger-4uvPoChz.cjs"),r=require("./useGingerChapterProgress-D2pdmyjg.cjs"),i=require("./liveAudioGraph-0cpHD_Ic.cjs"),n=require("./selectors-CEGlYoFu.cjs"),a=require("./GingerSplitContexts-C7puo0M7.cjs");exports.Chapters=e.Chapters;exports.Ginger=e.Ginger;exports.LyricsSynced=e.LyricsSynced;exports.Pause=e.Pause;exports.Play=e.Play;exports.RepeatGlyph=e.RepeatGlyph;exports.ShuffleIcon=e.ShuffleIcon;exports.SkipBack=e.SkipBack;exports.SkipForward=e.SkipForward;exports.Volume2=e.Volume2;exports.VolumeX=e.VolumeX;exports.Wrapper=e.Wrapper;exports.clampPlaybackRate=e.clampPlaybackRate;exports.clampVolume=e.clampVolume;exports.defaultGingerLocale=e.defaultGingerLocale;exports.parseLrc=e.parseLrc;exports.useGingerChapters=e.useGingerChapters;exports.useGingerLocale=e.useGingerLocale;exports.useGingerLyricsSync=e.useGingerLyricsSync;exports.usePlayPauseBinding=e.usePlayPauseBinding;exports.useSeekBarBinding=e.useSeekBarBinding;exports.useVolumeSlider=e.useVolumeSlider;exports.useGinger=s.useGinger;exports.createGingerStore=r.createGingerStore;exports.useGingerChapterProgress=r.useGingerChapterProgress;exports.useGingerDebugLog=r.useGingerDebugLog;exports.useGingerKeyboardShortcuts=r.useGingerKeyboardShortcuts;exports.useGingerLiveAnalyzer=r.useGingerLiveAnalyzer;exports.useGingerPlaybackHistory=r.useGingerPlaybackHistory;exports.useGingerSleepTimer=r.useGingerSleepTimer;exports.useGingerVolumeFade=r.useGingerVolumeFade;exports.useNextTrackPrefetch=r.useNextTrackPrefetch;exports.useSeekDrag=r.useSeekDrag;exports.attachLiveAnalyser=i.attachLiveAnalyser;exports.detachLiveAnalyser=i.detachLiveAnalyser;exports.setProcessingChain=i.setProcessingChain;exports.derivePlaybackUiState=n.derivePlaybackUiState;exports.gingerStateFromContextValues=a.gingerStateFromContextValues;exports.gingerStateFromContexts=a.gingerStateFromContexts;exports.useGingerMedia=a.useGingerMedia;exports.useGingerPlayback=a.useGingerPlayback;exports.useGingerState=a.useGingerState;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import { C as s, G as r, L as i, P as t, a as u, R as n, S as o, b as g, c, V as l, d as p, W as G, e as m, f as y, g as S, p as d, u as f, h, i as P, j as k, k as L, l as b } from "./ginger-CgHqHrrG.js";
2
- import { u as C } from "./useGinger-hpp2pAGY.js";
3
- import { c as v, u as B, a as F, b as A, d as R, e as D, f as T, g as W, h as j, i as w } from "./useGingerChapterProgress-Jj_zfnds.js";
1
+ import { C as s, G as r, L as i, P as t, a as u, R as n, S as o, b as g, c, V as l, d as p, W as G, e as m, f as y, g as S, p as d, u as f, h, i as P, j as k, k as L, l as b } from "./ginger-B2DgE-2a.js";
2
+ import { u as C } from "./useGinger-Dz0cPyD1.js";
3
+ import { c as v, u as B, a as F, b as A, d as R, e as D, f as T, g as W, h as j, i as w } from "./useGingerChapterProgress-wxAmN_uo.js";
4
4
  import { a as H, d as I, s as K } from "./liveAudioGraph-DvPaxBCP.js";
5
- import { d as N } from "./selectors-BalBCc7X.js";
5
+ import { d as N } from "./selectors-BT3WSsKN.js";
6
6
  import { g as X, a as q, u as E, b as J, c as O } from "./GingerSplitContexts-BzBExb95.js";
7
7
  export {
8
8
  s as Chapters,
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),U=require("../useGinger-BXgia32v.cjs"),C="ginger-remote",B=u=>u==="off"||u==="all"||u==="one",j=u=>u==="playlist"||u==="single";function x(u){if(!u||typeof u!="object")return!1;const e=u;if(!Array.isArray(e.tracks))return!1;for(const d of e.tracks){if(!d||typeof d!="object")return!1;const E=d;if(typeof E.title!="string"||typeof E.fileUrl!="string")return!1}return!(e.currentIndex!==void 0&&typeof e.currentIndex!="number"||e.isPaused!==void 0&&typeof e.isPaused!="boolean"||e.isShuffled!==void 0&&typeof e.isShuffled!="boolean"||e.repeatMode!==void 0&&!B(e.repeatMode)||e.playbackMode!==void 0&&!j(e.playbackMode)||e.volume!==void 0&&typeof e.volume!="number"||e.muted!==void 0&&typeof e.muted!="boolean"||e.playbackRate!==void 0&&typeof e.playbackRate!="number"||e.playlistMeta!==void 0&&e.playlistMeta!==null&&typeof e.playlistMeta!="object")}function F(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`ginger-tab-${Math.random().toString(36).slice(2)}`}function q(u={}){const{channelName:e=C,heartbeatMs:d=2e3,electionTimeoutMs:E=300}=u,{state:a,init:M}=U.useGinger(),t=c.useRef("");t.current===""&&(t.current=F());const[p,b]=c.useState("pending"),[_,T]=c.useState(0),[O,w]=c.useState(null),r=c.useRef(p);r.current=p;const S=c.useRef(M);S.current=M;const k=c.useRef(null),l=c.useRef(new Set),R=c.useRef(Date.now()),m=c.useRef(null),i=c.useRef(null),A=c.useRef(null),g=c.useCallback(s=>{var o;(o=k.current)==null||o.postMessage(s)},[]),y=c.useCallback(()=>{m.current&&(clearTimeout(m.current),m.current=null)},[]),N=c.useCallback(()=>{i.current&&(clearInterval(i.current),i.current=null)},[]);c.useEffect(()=>{if(typeof window>"u"||typeof BroadcastChannel>"u"){w("BroadcastChannel is not available in this environment");return}w(null);const s=new BroadcastChannel(e);k.current=s,l.current=new Set([t.current]);const o=I=>{s.postMessage(I)},v=()=>{i.current&&clearInterval(i.current),i.current=setInterval(()=>{const I=t.current;l.current.add(I);const n=l.current.size;T(n),o({type:"HEARTBEAT",tabId:I,connectedCount:n})},d)},h=()=>{y(),N(),b("follower"),r.current="follower"},H=()=>{y(),b("leader"),r.current="leader",l.current.add(t.current),o({type:"LEADER_ANNOUNCE",tabId:t.current}),v()},D=()=>{y(),m.current=setTimeout(()=>{r.current==="pending"&&(b("leader"),r.current="leader",l.current.add(t.current),o({type:"LEADER_ANNOUNCE",tabId:t.current}),v())},E)},L=I=>{const n=I.data;if(!n||typeof n!="object"||!("type"in n))return;const f=t.current;switch(n.type){case"PING":{l.current.add(n.tabId),r.current==="leader"&&o({type:"PONG",tabId:f,leaderTabId:f});break}case"PONG":{n.leaderTabId&&n.leaderTabId!==f&&(h(),R.current=Date.now());break}case"LEADER_ANNOUNCE":{if(n.tabId===f)break;l.current.add(n.tabId),n.tabId<f?(h(),R.current=Date.now()):n.tabId>f&&(r.current==="pending"||r.current==="leader")&&H();break}case"LEADER_RESIGN":{if(n.tabId===f)break;R.current=Date.now(),r.current==="follower"&&(b("pending"),r.current="pending",o({type:"PING",tabId:f}),D());break}case"HEARTBEAT":{r.current==="follower"&&(R.current=Date.now(),T(n.connectedCount));break}case"STATE_SNAPSHOT":{if(r.current==="follower"&&n.tabId!==f){if(process.env.NODE_ENV!=="production"&&!x(n.snapshot)){console.warn("[@lucaismyname/ginger] ignored STATE_SNAPSHOT: invalid GingerInitPayload");break}S.current(n.snapshot)}break}}};s.addEventListener("message",L),o({type:"PING",tabId:t.current}),m.current=setTimeout(()=>{r.current==="pending"&&(b("leader"),r.current="leader",l.current.add(t.current),o({type:"LEADER_ANNOUNCE",tabId:t.current}),v())},E),A.current=setInterval(()=>{r.current==="follower"&&Date.now()-R.current>d*2&&(b("pending"),r.current="pending",o({type:"PING",tabId:t.current}),D())},d);const P=()=>{r.current==="leader"&&o({type:"LEADER_RESIGN",tabId:t.current})};return window.addEventListener("pagehide",P),()=>{window.removeEventListener("pagehide",P),y(),N(),A.current&&(clearInterval(A.current),A.current=null),s.removeEventListener("message",L),r.current==="leader"&&o({type:"LEADER_RESIGN",tabId:t.current}),s.close(),k.current=null}},[e,y,E,d,N]),c.useEffect(()=>{if(p!=="leader")return;const s={tracks:a.tracks,currentIndex:a.currentIndex,playlistMeta:a.playlistMeta,isPaused:a.isPaused,isShuffled:!1,repeatMode:a.repeatMode,playbackMode:a.playbackMode,volume:a.volume,muted:a.muted,playbackRate:a.playbackRate};g({type:"STATE_SNAPSHOT",tabId:t.current,snapshot:s})},[p,a.tracks,a.currentIndex,a.isPaused,a.repeatMode,a.playbackMode,a.playlistMeta,a.volume,a.muted,a.playbackRate,g]);const G=c.useCallback(()=>{y(),N(),b("leader"),r.current="leader",l.current.add(t.current),g({type:"LEADER_ANNOUNCE",tabId:t.current}),i.current&&clearInterval(i.current),i.current=setInterval(()=>{const s=t.current;l.current.add(s);const o=l.current.size;T(o),g({type:"HEARTBEAT",tabId:s,connectedCount:o})},d)},[y,d,g,N]);return{isLeader:p==="leader",isFollower:p==="follower",isPending:p==="pending",connectedTabs:_,claimLeadership:G,error:O}}exports.DEFAULT_REMOTE_CHANNEL_NAME=C;exports.useGingerRemote=q;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),U=require("../useGinger-4uvPoChz.cjs"),C="ginger-remote",B=u=>u==="off"||u==="all"||u==="one",j=u=>u==="playlist"||u==="single";function x(u){if(!u||typeof u!="object")return!1;const e=u;if(!Array.isArray(e.tracks))return!1;for(const d of e.tracks){if(!d||typeof d!="object")return!1;const E=d;if(typeof E.title!="string"||typeof E.fileUrl!="string")return!1}return!(e.currentIndex!==void 0&&typeof e.currentIndex!="number"||e.isPaused!==void 0&&typeof e.isPaused!="boolean"||e.isShuffled!==void 0&&typeof e.isShuffled!="boolean"||e.repeatMode!==void 0&&!B(e.repeatMode)||e.playbackMode!==void 0&&!j(e.playbackMode)||e.volume!==void 0&&typeof e.volume!="number"||e.muted!==void 0&&typeof e.muted!="boolean"||e.playbackRate!==void 0&&typeof e.playbackRate!="number"||e.playlistMeta!==void 0&&e.playlistMeta!==null&&typeof e.playlistMeta!="object")}function F(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`ginger-tab-${Math.random().toString(36).slice(2)}`}function q(u={}){const{channelName:e=C,heartbeatMs:d=2e3,electionTimeoutMs:E=300}=u,{state:a,init:M}=U.useGinger(),t=c.useRef("");t.current===""&&(t.current=F());const[p,b]=c.useState("pending"),[_,T]=c.useState(0),[O,w]=c.useState(null),r=c.useRef(p);r.current=p;const S=c.useRef(M);S.current=M;const k=c.useRef(null),l=c.useRef(new Set),R=c.useRef(Date.now()),m=c.useRef(null),i=c.useRef(null),A=c.useRef(null),g=c.useCallback(s=>{var o;(o=k.current)==null||o.postMessage(s)},[]),y=c.useCallback(()=>{m.current&&(clearTimeout(m.current),m.current=null)},[]),N=c.useCallback(()=>{i.current&&(clearInterval(i.current),i.current=null)},[]);c.useEffect(()=>{if(typeof window>"u"||typeof BroadcastChannel>"u"){w("BroadcastChannel is not available in this environment");return}w(null);const s=new BroadcastChannel(e);k.current=s,l.current=new Set([t.current]);const o=I=>{s.postMessage(I)},v=()=>{i.current&&clearInterval(i.current),i.current=setInterval(()=>{const I=t.current;l.current.add(I);const n=l.current.size;T(n),o({type:"HEARTBEAT",tabId:I,connectedCount:n})},d)},h=()=>{y(),N(),b("follower"),r.current="follower"},H=()=>{y(),b("leader"),r.current="leader",l.current.add(t.current),o({type:"LEADER_ANNOUNCE",tabId:t.current}),v()},D=()=>{y(),m.current=setTimeout(()=>{r.current==="pending"&&(b("leader"),r.current="leader",l.current.add(t.current),o({type:"LEADER_ANNOUNCE",tabId:t.current}),v())},E)},L=I=>{const n=I.data;if(!n||typeof n!="object"||!("type"in n))return;const f=t.current;switch(n.type){case"PING":{l.current.add(n.tabId),r.current==="leader"&&o({type:"PONG",tabId:f,leaderTabId:f});break}case"PONG":{n.leaderTabId&&n.leaderTabId!==f&&(h(),R.current=Date.now());break}case"LEADER_ANNOUNCE":{if(n.tabId===f)break;l.current.add(n.tabId),n.tabId<f?(h(),R.current=Date.now()):n.tabId>f&&(r.current==="pending"||r.current==="leader")&&H();break}case"LEADER_RESIGN":{if(n.tabId===f)break;R.current=Date.now(),r.current==="follower"&&(b("pending"),r.current="pending",o({type:"PING",tabId:f}),D());break}case"HEARTBEAT":{r.current==="follower"&&(R.current=Date.now(),T(n.connectedCount));break}case"STATE_SNAPSHOT":{if(r.current==="follower"&&n.tabId!==f){if(process.env.NODE_ENV!=="production"&&!x(n.snapshot)){console.warn("[@lucaismyname/ginger] ignored STATE_SNAPSHOT: invalid GingerInitPayload");break}S.current(n.snapshot)}break}}};s.addEventListener("message",L),o({type:"PING",tabId:t.current}),m.current=setTimeout(()=>{r.current==="pending"&&(b("leader"),r.current="leader",l.current.add(t.current),o({type:"LEADER_ANNOUNCE",tabId:t.current}),v())},E),A.current=setInterval(()=>{r.current==="follower"&&Date.now()-R.current>d*2&&(b("pending"),r.current="pending",o({type:"PING",tabId:t.current}),D())},d);const P=()=>{r.current==="leader"&&o({type:"LEADER_RESIGN",tabId:t.current})};return window.addEventListener("pagehide",P),()=>{window.removeEventListener("pagehide",P),y(),N(),A.current&&(clearInterval(A.current),A.current=null),s.removeEventListener("message",L),r.current==="leader"&&o({type:"LEADER_RESIGN",tabId:t.current}),s.close(),k.current=null}},[e,y,E,d,N]),c.useEffect(()=>{if(p!=="leader")return;const s={tracks:a.tracks,currentIndex:a.currentIndex,playlistMeta:a.playlistMeta,isPaused:a.isPaused,isShuffled:!1,repeatMode:a.repeatMode,playbackMode:a.playbackMode,volume:a.volume,muted:a.muted,playbackRate:a.playbackRate};g({type:"STATE_SNAPSHOT",tabId:t.current,snapshot:s})},[p,a.tracks,a.currentIndex,a.isPaused,a.repeatMode,a.playbackMode,a.playlistMeta,a.volume,a.muted,a.playbackRate,g]);const G=c.useCallback(()=>{y(),N(),b("leader"),r.current="leader",l.current.add(t.current),g({type:"LEADER_ANNOUNCE",tabId:t.current}),i.current&&clearInterval(i.current),i.current=setInterval(()=>{const s=t.current;l.current.add(s);const o=l.current.size;T(o),g({type:"HEARTBEAT",tabId:s,connectedCount:o})},d)},[y,d,g,N]);return{isLeader:p==="leader",isFollower:p==="follower",isPending:p==="pending",connectedTabs:_,claimLeadership:G,error:O}}exports.DEFAULT_REMOTE_CHANNEL_NAME=C;exports.useGingerRemote=q;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,5 +1,5 @@
1
1
  import { useRef as f, useState as M, useCallback as T, useEffect as O } from "react";
2
- import { u as B } from "../useGinger-hpp2pAGY.js";
2
+ import { u as B } from "../useGinger-Dz0cPyD1.js";
3
3
  const j = "ginger-remote", F = (o) => o === "off" || o === "all" || o === "one", z = (o) => o === "playlist" || o === "single";
4
4
  function V(o) {
5
5
  if (!o || typeof o != "object") return !1;
@@ -0,0 +1,42 @@
1
+ import { r as o, a as c } from "./transitions-CmNkf3sd.js";
2
+ function u(r) {
3
+ return r.tracks[r.currentIndex] ?? null;
4
+ }
5
+ function s(r) {
6
+ return r.errorMessage ? "error" : r.tracks.length === 0 ? "idle" : r.isBuffering ? "loading" : r.isPaused ? Number.isFinite(r.duration) && r.duration > 0 && r.currentTime >= r.duration - 0.05 ? "ended" : "paused" : "playing";
7
+ }
8
+ function t(r) {
9
+ var i;
10
+ const e = r.duration;
11
+ if (Number.isFinite(e) && e > 0) return e;
12
+ const n = (i = r.tracks[r.currentIndex]) == null ? void 0 : i.durationSeconds;
13
+ return typeof n == "number" && Number.isFinite(n) && n > 0 ? n : 0;
14
+ }
15
+ function f(r) {
16
+ const n = t(r) - r.currentTime;
17
+ return Number.isFinite(n) ? Math.max(0, n) : 0;
18
+ }
19
+ function d(r) {
20
+ const e = t(r);
21
+ return e > 0 ? Math.min(1, Math.max(0, r.currentTime / e)) : 0;
22
+ }
23
+ function l(r) {
24
+ var n;
25
+ const e = u(r);
26
+ return o(e, (n = r.playlistMeta) == null ? void 0 : n.artworkUrl);
27
+ }
28
+ function m(r) {
29
+ var n;
30
+ const e = u(r);
31
+ return c(e, (n = r.playlistMeta) == null ? void 0 : n.subtitle);
32
+ }
33
+ export {
34
+ l as a,
35
+ t as b,
36
+ s as d,
37
+ f as e,
38
+ u as g,
39
+ d as p,
40
+ m as r
41
+ };
42
+ //# sourceMappingURL=selectors-BT3WSsKN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors-BT3WSsKN.js","sources":["../src/internal/selectors.ts"],"sourcesContent":["import { resolveAlbumLine, resolveArtworkUrl } from \"../core/transitions\";\nimport type { GingerState, PlaybackUiState, Track } from \"../types\";\n\nexport function getCurrentTrack(state: GingerState): Track | null {\n const t = state.tracks[state.currentIndex];\n return t ?? null;\n}\n\nexport function derivePlaybackUiState(state: GingerState): PlaybackUiState {\n if (state.errorMessage) return \"error\";\n if (state.tracks.length === 0) return \"idle\";\n if (state.isBuffering) return \"loading\";\n if (!state.isPaused) return \"playing\";\n if (\n Number.isFinite(state.duration) &&\n state.duration > 0 &&\n state.currentTime >= state.duration - 0.05\n ) {\n return \"ended\";\n }\n return \"paused\";\n}\n\nexport function effectiveDuration(state: GingerState): number {\n const d = state.duration;\n if (Number.isFinite(d) && d > 0) return d;\n const hint = state.tracks[state.currentIndex]?.durationSeconds;\n if (typeof hint === \"number\" && Number.isFinite(hint) && hint > 0) return hint;\n return 0;\n}\n\nexport function effectiveRemaining(state: GingerState): number {\n const dur = effectiveDuration(state);\n const rem = dur - state.currentTime;\n return Number.isFinite(rem) ? Math.max(0, rem) : 0;\n}\n\nexport function progressFraction(state: GingerState): number {\n const dur = effectiveDuration(state);\n if (!(dur > 0)) return 0;\n return Math.min(1, Math.max(0, state.currentTime / dur));\n}\n\nexport function resolvedArtwork(state: GingerState): string | undefined {\n const track = getCurrentTrack(state);\n return resolveArtworkUrl(track, state.playlistMeta?.artworkUrl);\n}\n\nexport function resolvedAlbumLine(state: GingerState): string | undefined {\n const track = getCurrentTrack(state);\n return resolveAlbumLine(track, state.playlistMeta?.subtitle);\n}\n"],"names":["getCurrentTrack","state","derivePlaybackUiState","effectiveDuration","d","hint","_a","effectiveRemaining","rem","progressFraction","dur","resolvedArtwork","track","resolveArtworkUrl","resolvedAlbumLine","resolveAlbumLine"],"mappings":";AAGO,SAASA,EAAgBC,GAAkC;AAEhE,SADUA,EAAM,OAAOA,EAAM,YAAY,KAC7B;AACd;AAEO,SAASC,EAAsBD,GAAqC;AACzE,SAAIA,EAAM,eAAqB,UAC3BA,EAAM,OAAO,WAAW,IAAU,SAClCA,EAAM,cAAoB,YACzBA,EAAM,WAET,OAAO,SAASA,EAAM,QAAQ,KAC9BA,EAAM,WAAW,KACjBA,EAAM,eAAeA,EAAM,WAAW,OAE/B,UAEF,WARqB;AAS9B;AAEO,SAASE,EAAkBF,GAA4B;;AAC5D,QAAMG,IAAIH,EAAM;AAChB,MAAI,OAAO,SAASG,CAAC,KAAKA,IAAI,EAAG,QAAOA;AACxC,QAAMC,KAAOC,IAAAL,EAAM,OAAOA,EAAM,YAAY,MAA/B,gBAAAK,EAAkC;AAC/C,SAAI,OAAOD,KAAS,YAAY,OAAO,SAASA,CAAI,KAAKA,IAAO,IAAUA,IACnE;AACT;AAEO,SAASE,EAAmBN,GAA4B;AAE7D,QAAMO,IADML,EAAkBF,CAAK,IACjBA,EAAM;AACxB,SAAO,OAAO,SAASO,CAAG,IAAI,KAAK,IAAI,GAAGA,CAAG,IAAI;AACnD;AAEO,SAASC,EAAiBR,GAA4B;AAC3D,QAAMS,IAAMP,EAAkBF,CAAK;AACnC,SAAMS,IAAM,IACL,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGT,EAAM,cAAcS,CAAG,CAAC,IADhC;AAEzB;AAEO,SAASC,EAAgBV,GAAwC;;AACtE,QAAMW,IAAQZ,EAAgBC,CAAK;AACnC,SAAOY,EAAkBD,IAAON,IAAAL,EAAM,iBAAN,gBAAAK,EAAoB,UAAU;AAChE;AAEO,SAASQ,EAAkBb,GAAwC;;AACxE,QAAMW,IAAQZ,EAAgBC,CAAK;AACnC,SAAOc,EAAiBH,IAAON,IAAAL,EAAM,iBAAN,gBAAAK,EAAoB,QAAQ;AAC7D;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const o=require("./transitions-Dx08t68T.cjs");function i(r){return r.tracks[r.currentIndex]??null}function c(r){return r.errorMessage?"error":r.tracks.length===0?"idle":r.isBuffering?"loading":r.isPaused?Number.isFinite(r.duration)&&r.duration>0&&r.currentTime>=r.duration-.05?"ended":"paused":"playing"}function t(r){var u;const n=r.duration;if(Number.isFinite(n)&&n>0)return n;const e=(u=r.tracks[r.currentIndex])==null?void 0:u.durationSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>0?e:0}function a(r){const e=t(r)-r.currentTime;return Number.isFinite(e)?Math.max(0,e):0}function f(r){const n=t(r);return n>0?Math.min(1,Math.max(0,r.currentTime/n)):0}function s(r){var e;const n=i(r);return o.resolveArtworkUrl(n,(e=r.playlistMeta)==null?void 0:e.artworkUrl)}function d(r){var e;const n=i(r);return o.resolveAlbumLine(n,(e=r.playlistMeta)==null?void 0:e.subtitle)}exports.derivePlaybackUiState=c;exports.effectiveDuration=t;exports.effectiveRemaining=a;exports.getCurrentTrack=i;exports.progressFraction=f;exports.resolvedAlbumLine=d;exports.resolvedArtwork=s;
2
+ //# sourceMappingURL=selectors-CEGlYoFu.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors-CEGlYoFu.cjs","sources":["../src/internal/selectors.ts"],"sourcesContent":["import { resolveAlbumLine, resolveArtworkUrl } from \"../core/transitions\";\nimport type { GingerState, PlaybackUiState, Track } from \"../types\";\n\nexport function getCurrentTrack(state: GingerState): Track | null {\n const t = state.tracks[state.currentIndex];\n return t ?? null;\n}\n\nexport function derivePlaybackUiState(state: GingerState): PlaybackUiState {\n if (state.errorMessage) return \"error\";\n if (state.tracks.length === 0) return \"idle\";\n if (state.isBuffering) return \"loading\";\n if (!state.isPaused) return \"playing\";\n if (\n Number.isFinite(state.duration) &&\n state.duration > 0 &&\n state.currentTime >= state.duration - 0.05\n ) {\n return \"ended\";\n }\n return \"paused\";\n}\n\nexport function effectiveDuration(state: GingerState): number {\n const d = state.duration;\n if (Number.isFinite(d) && d > 0) return d;\n const hint = state.tracks[state.currentIndex]?.durationSeconds;\n if (typeof hint === \"number\" && Number.isFinite(hint) && hint > 0) return hint;\n return 0;\n}\n\nexport function effectiveRemaining(state: GingerState): number {\n const dur = effectiveDuration(state);\n const rem = dur - state.currentTime;\n return Number.isFinite(rem) ? Math.max(0, rem) : 0;\n}\n\nexport function progressFraction(state: GingerState): number {\n const dur = effectiveDuration(state);\n if (!(dur > 0)) return 0;\n return Math.min(1, Math.max(0, state.currentTime / dur));\n}\n\nexport function resolvedArtwork(state: GingerState): string | undefined {\n const track = getCurrentTrack(state);\n return resolveArtworkUrl(track, state.playlistMeta?.artworkUrl);\n}\n\nexport function resolvedAlbumLine(state: GingerState): string | undefined {\n const track = getCurrentTrack(state);\n return resolveAlbumLine(track, state.playlistMeta?.subtitle);\n}\n"],"names":["getCurrentTrack","state","derivePlaybackUiState","effectiveDuration","d","hint","_a","effectiveRemaining","rem","progressFraction","dur","resolvedArtwork","track","resolveArtworkUrl","resolvedAlbumLine","resolveAlbumLine"],"mappings":"2DAGO,SAASA,EAAgBC,EAAkC,CAEhE,OADUA,EAAM,OAAOA,EAAM,YAAY,GAC7B,IACd,CAEO,SAASC,EAAsBD,EAAqC,CACzE,OAAIA,EAAM,aAAqB,QAC3BA,EAAM,OAAO,SAAW,EAAU,OAClCA,EAAM,YAAoB,UACzBA,EAAM,SAET,OAAO,SAASA,EAAM,QAAQ,GAC9BA,EAAM,SAAW,GACjBA,EAAM,aAAeA,EAAM,SAAW,IAE/B,QAEF,SARqB,SAS9B,CAEO,SAASE,EAAkBF,EAA4B,OAC5D,MAAMG,EAAIH,EAAM,SAChB,GAAI,OAAO,SAASG,CAAC,GAAKA,EAAI,EAAG,OAAOA,EACxC,MAAMC,GAAOC,EAAAL,EAAM,OAAOA,EAAM,YAAY,IAA/B,YAAAK,EAAkC,gBAC/C,OAAI,OAAOD,GAAS,UAAY,OAAO,SAASA,CAAI,GAAKA,EAAO,EAAUA,EACnE,CACT,CAEO,SAASE,EAAmBN,EAA4B,CAE7D,MAAMO,EADML,EAAkBF,CAAK,EACjBA,EAAM,YACxB,OAAO,OAAO,SAASO,CAAG,EAAI,KAAK,IAAI,EAAGA,CAAG,EAAI,CACnD,CAEO,SAASC,EAAiBR,EAA4B,CAC3D,MAAMS,EAAMP,EAAkBF,CAAK,EACnC,OAAMS,EAAM,EACL,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGT,EAAM,YAAcS,CAAG,CAAC,EADhC,CAEzB,CAEO,SAASC,EAAgBV,EAAwC,OACtE,MAAMW,EAAQZ,EAAgBC,CAAK,EACnC,OAAOY,EAAAA,kBAAkBD,GAAON,EAAAL,EAAM,eAAN,YAAAK,EAAoB,UAAU,CAChE,CAEO,SAASQ,EAAkBb,EAAwC,OACxE,MAAMW,EAAQZ,EAAgBC,CAAK,EACnC,OAAOc,EAAAA,iBAAiBH,GAAON,EAAAL,EAAM,eAAN,YAAAK,EAAoB,QAAQ,CAC7D"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react"),d=require("../liveAudioGraph-0cpHD_Ic.cjs"),k=require("../useGinger-BXgia32v.cjs");function M(t,o,c,l){t.positionX.value=o,t.positionY.value=c,t.positionZ.value=l}function R(t,o,c,l){t.listener.positionX.value=o,t.listener.positionY.value=c,t.listener.positionZ.value=l}function q(t={}){const{enabled:o=!0,panningModel:c="HRTF",distanceModel:l="inverse",refDistance:g=1,position:S=[0,0,0],listenerPosition:A=[0,0,0]}=t,{audioRef:p}=k.useGinger(),[G,v]=r.useState(null),u=r.useRef(null),f=r.useRef(null),[P,h,m]=S,[b,y,C]=A;r.useEffect(()=>{const n=p.current;if(!(!n||typeof window>"u")){if(!o){d.setProcessingChain(n,[]),u.current=null,f.current=null;return}try{const e=d.attachLiveAnalyser(n,{fftSize:32,smoothingTimeConstant:0,minDecibels:-100,maxDecibels:0}),{context:s,id:i}=e,a=s.createPanner();a.panningModel=c,a.distanceModel=l,a.refDistance=g,M(a,P,h,m),R(s,b,y,C),u.current=a,f.current=s,d.setProcessingChain(n,[a]),d.detachLiveAnalyser(n,i),v(null)}catch(e){const s=e instanceof Error?e.message:"Failed to create spatial panner";v(s),u.current=null,f.current=null}return()=>{const e=p.current;e&&d.setProcessingChain(e,[]),u.current=null,f.current=null}}},[o,c,l,g,P,h,m,b,y,C,p]);const x=r.useCallback((n,e,s)=>{const i=u.current;i&&M(i,n,e,s)},[]),D=r.useCallback((n,e,s)=>{const i=f.current;i&&R(i,n,e,s)},[]),L=r.useCallback(n=>{const e=u.current;e&&(e.panningModel=n)},[]);return{setSourcePosition:x,setListenerPosition:D,setPanningModel:L,error:G}}exports.useGingerSpatialAudio=q;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react"),d=require("../liveAudioGraph-0cpHD_Ic.cjs"),k=require("../useGinger-4uvPoChz.cjs");function M(t,o,c,l){t.positionX.value=o,t.positionY.value=c,t.positionZ.value=l}function R(t,o,c,l){t.listener.positionX.value=o,t.listener.positionY.value=c,t.listener.positionZ.value=l}function q(t={}){const{enabled:o=!0,panningModel:c="HRTF",distanceModel:l="inverse",refDistance:g=1,position:S=[0,0,0],listenerPosition:A=[0,0,0]}=t,{audioRef:p}=k.useGinger(),[G,v]=r.useState(null),u=r.useRef(null),f=r.useRef(null),[P,h,m]=S,[b,y,C]=A;r.useEffect(()=>{const n=p.current;if(!(!n||typeof window>"u")){if(!o){d.setProcessingChain(n,[]),u.current=null,f.current=null;return}try{const e=d.attachLiveAnalyser(n,{fftSize:32,smoothingTimeConstant:0,minDecibels:-100,maxDecibels:0}),{context:s,id:i}=e,a=s.createPanner();a.panningModel=c,a.distanceModel=l,a.refDistance=g,M(a,P,h,m),R(s,b,y,C),u.current=a,f.current=s,d.setProcessingChain(n,[a]),d.detachLiveAnalyser(n,i),v(null)}catch(e){const s=e instanceof Error?e.message:"Failed to create spatial panner";v(s),u.current=null,f.current=null}return()=>{const e=p.current;e&&d.setProcessingChain(e,[]),u.current=null,f.current=null}}},[o,c,l,g,P,h,m,b,y,C,p]);const x=r.useCallback((n,e,s)=>{const i=u.current;i&&M(i,n,e,s)},[]),D=r.useCallback((n,e,s)=>{const i=f.current;i&&R(i,n,e,s)},[]),L=r.useCallback(n=>{const e=u.current;e&&(e.panningModel=n)},[]);return{setSourcePosition:x,setListenerPosition:D,setPanningModel:L,error:G}}exports.useGingerSpatialAudio=q;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,6 +1,6 @@
1
1
  import { useState as X, useRef as R, useEffect as Y, useCallback as p } from "react";
2
2
  import { s as d, a as Z, d as w } from "../liveAudioGraph-DvPaxBCP.js";
3
- import { u as F } from "../useGinger-hpp2pAGY.js";
3
+ import { u as F } from "../useGinger-Dz0cPyD1.js";
4
4
  function b(t, o, i, c) {
5
5
  t.positionX.value = o, t.positionY.value = i, t.positionZ.value = c;
6
6
  }
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Al=require("react/jsx-runtime"),Xi=require("react"),yt=require("react-dom"),Il=require("../ginger-DFdZGaMi.cjs");function Pc(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const ur=Pc(Xi);function Tc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var wi={exports:{}},ne={};/**
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Al=require("react/jsx-runtime"),Xi=require("react"),yt=require("react-dom"),Il=require("../ginger-Dv3iO_xQ.cjs");function Pc(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const ur=Pc(Xi);function Tc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var wi={exports:{}},ne={};/**
2
2
  * @license React
3
3
  * react-dom-test-utils.production.min.js
4
4
  *
@@ -2,7 +2,7 @@ import { jsxs as Rc, jsx as Pc } from "react/jsx-runtime";
2
2
  import * as ur from "react";
3
3
  import Us from "react";
4
4
  import yt from "react-dom";
5
- import { G as Ml } from "../ginger-CgHqHrrG.js";
5
+ import { G as Ml } from "../ginger-B2DgE-2a.js";
6
6
  function Tc(e) {
7
7
  return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
8
8
  }
@@ -0,0 +1,90 @@
1
+ function l(n, e) {
2
+ return e <= 0 ? 0 : Math.max(0, Math.min(e - 1, n));
3
+ }
4
+ function d(n, e) {
5
+ if (n.length <= 1) return [...n];
6
+ const t = n[e];
7
+ if (!t) return [...n];
8
+ const r = n.filter((i, u) => u !== e);
9
+ for (let i = r.length - 1; i > 0; i--) {
10
+ const u = Math.floor(Math.random() * (i + 1));
11
+ [r[i], r[u]] = [r[u], r[i]];
12
+ }
13
+ return [t, ...r];
14
+ }
15
+ function a(n) {
16
+ return n ? n.id != null && n.id !== "" ? `id:${n.id}` : `file:${n.fileUrl}` : "";
17
+ }
18
+ function h(n, e) {
19
+ var f, s;
20
+ if (!e) return 0;
21
+ const t = n.findIndex((o) => o === e);
22
+ if (t !== -1) return t;
23
+ const r = a(e);
24
+ if (!r) return 0;
25
+ const i = [];
26
+ for (let o = 0; o < n.length; o += 1)
27
+ a(n[o]) === r && i.push(o);
28
+ if (i.length === 0) return 0;
29
+ if (i.length === 1) return i[0];
30
+ const u = typeof globalThis < "u" && "process" in globalThis ? (s = (f = globalThis.process) == null ? void 0 : f.env) == null ? void 0 : s.NODE_ENV : void 0;
31
+ return u != null && u !== "production" && console.warn(
32
+ "[@lucaismyname/ginger] Ambiguous track identity: multiple queue rows share the same fileUrl without a unique `id`. Resolving to the first match."
33
+ ), i[0];
34
+ }
35
+ function c(n, e, t) {
36
+ const r = [...n], i = Math.max(0, Math.min(r.length, t ?? r.length));
37
+ return r.splice(i, 0, e), r;
38
+ }
39
+ function p(n, e) {
40
+ if (e < 0 || e >= n.length) return [...n];
41
+ const t = [...n];
42
+ return t.splice(e, 1), t;
43
+ }
44
+ function g(n, e, t) {
45
+ if (e === t || e < 0 || e >= n.length || t < 0 || t >= n.length)
46
+ return [...n];
47
+ const r = [...n], [i] = r.splice(e, 1);
48
+ return i ? (r.splice(t, 0, i), r) : [...n];
49
+ }
50
+ function m(n, e, t) {
51
+ return c(n, t, Math.max(0, Math.min(n.length, e + 1)));
52
+ }
53
+ function x(n) {
54
+ const { tracks: e, currentIndex: t, repeatMode: r, playbackMode: i } = n, u = e.length;
55
+ return u === 0 ? { kind: "stop", nextIndex: 0 } : r === "one" ? { kind: "replay_same" } : i === "single" ? { kind: "stop", nextIndex: l(t, u) } : t < u - 1 ? { kind: "advance", nextIndex: t + 1 } : r === "all" ? { kind: "wrap", nextIndex: 0 } : { kind: "stop", nextIndex: l(t, u) };
56
+ }
57
+ function M(n) {
58
+ const { tracks: e, currentIndex: t, repeatMode: r, playbackMode: i } = n, u = e.length;
59
+ return u === 0 ? 0 : i === "single" ? l(t, u) : t < u - 1 ? t + 1 : r === "all" ? 0 : l(t, u);
60
+ }
61
+ function y(n) {
62
+ const { tracks: e, currentIndex: t, repeatMode: r, playbackMode: i } = n, u = e.length;
63
+ return u === 0 ? 0 : i === "single" ? l(t, u) : t > 0 ? t - 1 : r === "all" ? u - 1 : 0;
64
+ }
65
+ function v(n) {
66
+ return n === "off" ? "all" : n === "all" ? "one" : "off";
67
+ }
68
+ function b(n, e) {
69
+ return (n == null ? void 0 : n.artworkUrl) ?? e ?? void 0;
70
+ }
71
+ function T(n, e) {
72
+ return (n == null ? void 0 : n.album) ?? e ?? void 0;
73
+ }
74
+ export {
75
+ T as a,
76
+ M as b,
77
+ x as c,
78
+ y as d,
79
+ l as e,
80
+ h as f,
81
+ v as g,
82
+ m as h,
83
+ p as i,
84
+ c as j,
85
+ g as m,
86
+ b as r,
87
+ d as s,
88
+ a as t
89
+ };
90
+ //# sourceMappingURL=transitions-CmNkf3sd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitions-CmNkf3sd.js","sources":["../src/core/queue.ts","../src/core/transitions.ts"],"sourcesContent":["import type { Track } from \"../types\";\n\nexport function clampIndex(index: number, length: number): number {\n if (length <= 0) return 0;\n return Math.max(0, Math.min(length - 1, index));\n}\n\nexport function shuffleWithAnchor(tracks: Track[], anchorIndex: number): Track[] {\n if (tracks.length <= 1) return [...tracks];\n const anchor = tracks[anchorIndex];\n if (!anchor) return [...tracks];\n const rest = tracks.filter((_, i) => i !== anchorIndex);\n for (let i = rest.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [rest[i], rest[j]] = [rest[j]!, rest[i]!];\n }\n return [anchor, ...rest];\n}\n\nexport function trackIdentity(track: Track | null | undefined): string {\n if (!track) return \"\";\n return track.id != null && track.id !== \"\" ? `id:${track.id}` : `file:${track.fileUrl}`;\n}\n\nexport function findIndexByTrackIdentity(\n tracks: Track[],\n target: Track | null | undefined,\n): number {\n if (!target) return 0;\n const byRef = tracks.findIndex((t) => t === target);\n if (byRef !== -1) return byRef;\n\n const identity = trackIdentity(target);\n if (!identity) return 0;\n\n const matches: number[] = [];\n for (let i = 0; i < tracks.length; i += 1) {\n if (trackIdentity(tracks[i]) === identity) matches.push(i);\n }\n if (matches.length === 0) return 0;\n if (matches.length === 1) return matches[0]!;\n\n const nodeEnv =\n typeof globalThis !== \"undefined\" && \"process\" in globalThis\n ? (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV\n : undefined;\n if (nodeEnv != null && nodeEnv !== \"production\") {\n console.warn(\n \"[@lucaismyname/ginger] Ambiguous track identity: multiple queue rows share the same fileUrl without a unique `id`. Resolving to the first match.\",\n );\n }\n return matches[0]!;\n}\n\nexport function insertTrackAt(tracks: Track[], track: Track, index?: number): Track[] {\n const next = [...tracks];\n const at = Math.max(0, Math.min(next.length, index ?? next.length));\n next.splice(at, 0, track);\n return next;\n}\n\nexport function removeTrackAt(tracks: Track[], index: number): Track[] {\n if (index < 0 || index >= tracks.length) return [...tracks];\n const next = [...tracks];\n next.splice(index, 1);\n return next;\n}\n\nexport function moveTrack(tracks: Track[], fromIndex: number, toIndex: number): Track[] {\n if (\n fromIndex === toIndex ||\n fromIndex < 0 ||\n fromIndex >= tracks.length ||\n toIndex < 0 ||\n toIndex >= tracks.length\n ) {\n return [...tracks];\n }\n const next = [...tracks];\n const [item] = next.splice(fromIndex, 1);\n if (!item) return [...tracks];\n next.splice(toIndex, 0, item);\n return next;\n}\n\nexport function addNextTrack(tracks: Track[], currentIndex: number, track: Track): Track[] {\n return insertTrackAt(tracks, track, Math.max(0, Math.min(tracks.length, currentIndex + 1)));\n}\n","import type { GingerState, RepeatMode, Track } from \"../types\";\nimport { clampIndex } from \"./queue\";\n\n/** Fields used by next/prev/ended navigation; avoids coupling helpers to full `GingerState`. */\nexport type GingerPlaybackNavigationSlice = Pick<\n GingerState,\n \"tracks\" | \"currentIndex\" | \"repeatMode\" | \"playbackMode\"\n>;\n\nexport type EndedTransition =\n | { kind: \"replay_same\" }\n | { kind: \"advance\"; nextIndex: number }\n | { kind: \"wrap\"; nextIndex: number }\n | { kind: \"stop\"; nextIndex: number };\n\nexport function computeEndedTransition(state: GingerPlaybackNavigationSlice): EndedTransition {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return { kind: \"stop\", nextIndex: 0 };\n if (repeatMode === \"one\") return { kind: \"replay_same\" };\n if (playbackMode === \"single\") return { kind: \"stop\", nextIndex: clampIndex(currentIndex, len) };\n if (currentIndex < len - 1) return { kind: \"advance\", nextIndex: currentIndex + 1 };\n if (repeatMode === \"all\") return { kind: \"wrap\", nextIndex: 0 };\n return { kind: \"stop\", nextIndex: clampIndex(currentIndex, len) };\n}\n\nexport function computeNextIndex(state: GingerPlaybackNavigationSlice): number {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return 0;\n if (playbackMode === \"single\") return clampIndex(currentIndex, len);\n if (currentIndex < len - 1) return currentIndex + 1;\n if (repeatMode === \"all\") return 0;\n return clampIndex(currentIndex, len);\n}\n\nexport function computePrevIndex(state: GingerPlaybackNavigationSlice): number {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return 0;\n if (playbackMode === \"single\") return clampIndex(currentIndex, len);\n if (currentIndex > 0) return currentIndex - 1;\n if (repeatMode === \"all\") return len - 1;\n return 0;\n}\n\nexport function cycleRepeatMode(mode: RepeatMode): RepeatMode {\n if (mode === \"off\") return \"all\";\n if (mode === \"all\") return \"one\";\n return \"off\";\n}\n\nexport function resolveArtworkUrl(\n track: Track | null,\n playlistArtwork?: string | null,\n): string | undefined {\n return track?.artworkUrl ?? playlistArtwork ?? undefined;\n}\n\nexport function resolveAlbumLine(\n track: Track | null,\n playlistSubtitle?: string | null,\n): string | undefined {\n return track?.album ?? playlistSubtitle ?? undefined;\n}\n"],"names":["clampIndex","index","length","shuffleWithAnchor","tracks","anchorIndex","anchor","rest","_","i","j","trackIdentity","track","findIndexByTrackIdentity","target","_a","_b","byRef","t","identity","matches","nodeEnv","insertTrackAt","next","at","removeTrackAt","moveTrack","fromIndex","toIndex","item","addNextTrack","currentIndex","computeEndedTransition","state","repeatMode","playbackMode","len","computeNextIndex","computePrevIndex","cycleRepeatMode","mode","resolveArtworkUrl","playlistArtwork","resolveAlbumLine","playlistSubtitle"],"mappings":"AAEO,SAASA,EAAWC,GAAeC,GAAwB;AAChE,SAAIA,KAAU,IAAU,IACjB,KAAK,IAAI,GAAG,KAAK,IAAIA,IAAS,GAAGD,CAAK,CAAC;AAChD;AAEO,SAASE,EAAkBC,GAAiBC,GAA8B;AAC/E,MAAID,EAAO,UAAU,EAAG,QAAO,CAAC,GAAGA,CAAM;AACzC,QAAME,IAASF,EAAOC,CAAW;AACjC,MAAI,CAACC,EAAQ,QAAO,CAAC,GAAGF,CAAM;AAC9B,QAAMG,IAAOH,EAAO,OAAO,CAACI,GAAGC,MAAMA,MAAMJ,CAAW;AACtD,WAAS,IAAIE,EAAK,SAAS,GAAG,IAAI,GAAG,KAAK;AACxC,UAAMG,IAAI,KAAK,MAAM,KAAK,YAAY,IAAI,EAAE;AAC5C,KAACH,EAAK,CAAC,GAAGA,EAAKG,CAAC,CAAC,IAAI,CAACH,EAAKG,CAAC,GAAIH,EAAK,CAAC,CAAE;AAAA,EAC1C;AACA,SAAO,CAACD,GAAQ,GAAGC,CAAI;AACzB;AAEO,SAASI,EAAcC,GAAyC;AACrE,SAAKA,IACEA,EAAM,MAAM,QAAQA,EAAM,OAAO,KAAK,MAAMA,EAAM,EAAE,KAAK,QAAQA,EAAM,OAAO,KADlE;AAErB;AAEO,SAASC,EACdT,GACAU,GACQ;AAzBH,MAAAC,GAAAC;AA0BL,MAAI,CAACF,EAAQ,QAAO;AACpB,QAAMG,IAAQb,EAAO,UAAU,CAACc,MAAMA,MAAMJ,CAAM;AAClD,MAAIG,MAAU,GAAI,QAAOA;AAEzB,QAAME,IAAWR,EAAcG,CAAM;AACrC,MAAI,CAACK,EAAU,QAAO;AAEtB,QAAMC,IAAoB,CAAA;AAC1B,WAASX,IAAI,GAAGA,IAAIL,EAAO,QAAQK,KAAK;AACtC,IAAIE,EAAcP,EAAOK,CAAC,CAAC,MAAMU,KAAUC,EAAQ,KAAKX,CAAC;AAE3D,MAAIW,EAAQ,WAAW,EAAG,QAAO;AACjC,MAAIA,EAAQ,WAAW,EAAG,QAAOA,EAAQ,CAAC;AAE1C,QAAMC,IACJ,OAAO,aAAe,OAAe,aAAa,cAC7CL,KAAAD,IAAA,WAA6D,YAA7D,gBAAAA,EAAsE,QAAtE,gBAAAC,EAA2E,WAC5E;AACN,SAAIK,KAAW,QAAQA,MAAY,gBACjC,QAAQ;AAAA,IACN;AAAA,EAAA,GAGGD,EAAQ,CAAC;AAClB;AAEO,SAASE,EAAclB,GAAiBQ,GAAcX,GAAyB;AACpF,QAAMsB,IAAO,CAAC,GAAGnB,CAAM,GACjBoB,IAAK,KAAK,IAAI,GAAG,KAAK,IAAID,EAAK,QAAQtB,KAASsB,EAAK,MAAM,CAAC;AAClE,SAAAA,EAAK,OAAOC,GAAI,GAAGZ,CAAK,GACjBW;AACT;AAEO,SAASE,EAAcrB,GAAiBH,GAAwB;AACrE,MAAIA,IAAQ,KAAKA,KAASG,EAAO,OAAQ,QAAO,CAAC,GAAGA,CAAM;AAC1D,QAAMmB,IAAO,CAAC,GAAGnB,CAAM;AACvB,SAAAmB,EAAK,OAAOtB,GAAO,CAAC,GACbsB;AACT;AAEO,SAASG,EAAUtB,GAAiBuB,GAAmBC,GAA0B;AACtF,MACED,MAAcC,KACdD,IAAY,KACZA,KAAavB,EAAO,UACpBwB,IAAU,KACVA,KAAWxB,EAAO;AAElB,WAAO,CAAC,GAAGA,CAAM;AAEnB,QAAMmB,IAAO,CAAC,GAAGnB,CAAM,GACjB,CAACyB,CAAI,IAAIN,EAAK,OAAOI,GAAW,CAAC;AACvC,SAAKE,KACLN,EAAK,OAAOK,GAAS,GAAGC,CAAI,GACrBN,KAFW,CAAC,GAAGnB,CAAM;AAG9B;AAEO,SAAS0B,EAAa1B,GAAiB2B,GAAsBnB,GAAuB;AACzF,SAAOU,EAAclB,GAAQQ,GAAO,KAAK,IAAI,GAAG,KAAK,IAAIR,EAAO,QAAQ2B,IAAe,CAAC,CAAC,CAAC;AAC5F;ACxEO,SAASC,EAAuBC,GAAuD;AAC5F,QAAM,EAAE,QAAA7B,GAAQ,cAAA2B,GAAc,YAAAG,GAAY,cAAAC,MAAiBF,GACrDG,IAAMhC,EAAO;AACnB,SAAIgC,MAAQ,IAAU,EAAE,MAAM,QAAQ,WAAW,EAAA,IAC7CF,MAAe,QAAc,EAAE,MAAM,cAAA,IACrCC,MAAiB,WAAiB,EAAE,MAAM,QAAQ,WAAWnC,EAAW+B,GAAcK,CAAG,EAAA,IACzFL,IAAeK,IAAM,IAAU,EAAE,MAAM,WAAW,WAAWL,IAAe,EAAA,IAC5EG,MAAe,QAAc,EAAE,MAAM,QAAQ,WAAW,EAAA,IACrD,EAAE,MAAM,QAAQ,WAAWlC,EAAW+B,GAAcK,CAAG,EAAA;AAChE;AAEO,SAASC,EAAiBJ,GAA8C;AAC7E,QAAM,EAAE,QAAA7B,GAAQ,cAAA2B,GAAc,YAAAG,GAAY,cAAAC,MAAiBF,GACrDG,IAAMhC,EAAO;AACnB,SAAIgC,MAAQ,IAAU,IAClBD,MAAiB,WAAiBnC,EAAW+B,GAAcK,CAAG,IAC9DL,IAAeK,IAAM,IAAUL,IAAe,IAC9CG,MAAe,QAAc,IAC1BlC,EAAW+B,GAAcK,CAAG;AACrC;AAEO,SAASE,EAAiBL,GAA8C;AAC7E,QAAM,EAAE,QAAA7B,GAAQ,cAAA2B,GAAc,YAAAG,GAAY,cAAAC,MAAiBF,GACrDG,IAAMhC,EAAO;AACnB,SAAIgC,MAAQ,IAAU,IAClBD,MAAiB,WAAiBnC,EAAW+B,GAAcK,CAAG,IAC9DL,IAAe,IAAUA,IAAe,IACxCG,MAAe,QAAcE,IAAM,IAChC;AACT;AAEO,SAASG,EAAgBC,GAA8B;AAC5D,SAAIA,MAAS,QAAc,QACvBA,MAAS,QAAc,QACpB;AACT;AAEO,SAASC,EACd7B,GACA8B,GACoB;AACpB,UAAO9B,KAAA,gBAAAA,EAAO,eAAc8B,KAAmB;AACjD;AAEO,SAASC,EACd/B,GACAgC,GACoB;AACpB,UAAOhC,KAAA,gBAAAA,EAAO,UAASgC,KAAoB;AAC7C;"}
@@ -0,0 +1,2 @@
1
+ "use strict";function l(e,n){return n<=0?0:Math.max(0,Math.min(n-1,e))}function a(e,n){if(e.length<=1)return[...e];const t=e[n];if(!t)return[...e];const r=e.filter((i,o)=>o!==n);for(let i=r.length-1;i>0;i--){const o=Math.floor(Math.random()*(i+1));[r[i],r[o]]=[r[o],r[i]]}return[t,...r]}function f(e){return e?e.id!=null&&e.id!==""?`id:${e.id}`:`file:${e.fileUrl}`:""}function h(e,n){var c,d;if(!n)return 0;const t=e.findIndex(u=>u===n);if(t!==-1)return t;const r=f(n);if(!r)return 0;const i=[];for(let u=0;u<e.length;u+=1)f(e[u])===r&&i.push(u);if(i.length===0)return 0;if(i.length===1)return i[0];const o=typeof globalThis<"u"&&"process"in globalThis?(d=(c=globalThis.process)==null?void 0:c.env)==null?void 0:d.NODE_ENV:void 0;return o!=null&&o!=="production"&&console.warn("[@lucaismyname/ginger] Ambiguous track identity: multiple queue rows share the same fileUrl without a unique `id`. Resolving to the first match."),i[0]}function s(e,n,t){const r=[...e],i=Math.max(0,Math.min(r.length,t??r.length));return r.splice(i,0,n),r}function p(e,n){if(n<0||n>=e.length)return[...e];const t=[...e];return t.splice(n,1),t}function m(e,n,t){if(n===t||n<0||n>=e.length||t<0||t>=e.length)return[...e];const r=[...e],[i]=r.splice(n,1);return i?(r.splice(t,0,i),r):[...e]}function x(e,n,t){return s(e,t,Math.max(0,Math.min(e.length,n+1)))}function g(e){const{tracks:n,currentIndex:t,repeatMode:r,playbackMode:i}=e,o=n.length;return o===0?{kind:"stop",nextIndex:0}:r==="one"?{kind:"replay_same"}:i==="single"?{kind:"stop",nextIndex:l(t,o)}:t<o-1?{kind:"advance",nextIndex:t+1}:r==="all"?{kind:"wrap",nextIndex:0}:{kind:"stop",nextIndex:l(t,o)}}function v(e){const{tracks:n,currentIndex:t,repeatMode:r,playbackMode:i}=e,o=n.length;return o===0?0:i==="single"?l(t,o):t<o-1?t+1:r==="all"?0:l(t,o)}function y(e){const{tracks:n,currentIndex:t,repeatMode:r,playbackMode:i}=e,o=n.length;return o===0?0:i==="single"?l(t,o):t>0?t-1:r==="all"?o-1:0}function M(e){return e==="off"?"all":e==="all"?"one":"off"}function T(e,n){return(e==null?void 0:e.artworkUrl)??n??void 0}function I(e,n){return(e==null?void 0:e.album)??n??void 0}exports.addNextTrack=x;exports.clampIndex=l;exports.computeEndedTransition=g;exports.computeNextIndex=v;exports.computePrevIndex=y;exports.cycleRepeatMode=M;exports.findIndexByTrackIdentity=h;exports.insertTrackAt=s;exports.moveTrack=m;exports.removeTrackAt=p;exports.resolveAlbumLine=I;exports.resolveArtworkUrl=T;exports.shuffleWithAnchor=a;exports.trackIdentity=f;
2
+ //# sourceMappingURL=transitions-Dx08t68T.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitions-Dx08t68T.cjs","sources":["../src/core/queue.ts","../src/core/transitions.ts"],"sourcesContent":["import type { Track } from \"../types\";\n\nexport function clampIndex(index: number, length: number): number {\n if (length <= 0) return 0;\n return Math.max(0, Math.min(length - 1, index));\n}\n\nexport function shuffleWithAnchor(tracks: Track[], anchorIndex: number): Track[] {\n if (tracks.length <= 1) return [...tracks];\n const anchor = tracks[anchorIndex];\n if (!anchor) return [...tracks];\n const rest = tracks.filter((_, i) => i !== anchorIndex);\n for (let i = rest.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [rest[i], rest[j]] = [rest[j]!, rest[i]!];\n }\n return [anchor, ...rest];\n}\n\nexport function trackIdentity(track: Track | null | undefined): string {\n if (!track) return \"\";\n return track.id != null && track.id !== \"\" ? `id:${track.id}` : `file:${track.fileUrl}`;\n}\n\nexport function findIndexByTrackIdentity(\n tracks: Track[],\n target: Track | null | undefined,\n): number {\n if (!target) return 0;\n const byRef = tracks.findIndex((t) => t === target);\n if (byRef !== -1) return byRef;\n\n const identity = trackIdentity(target);\n if (!identity) return 0;\n\n const matches: number[] = [];\n for (let i = 0; i < tracks.length; i += 1) {\n if (trackIdentity(tracks[i]) === identity) matches.push(i);\n }\n if (matches.length === 0) return 0;\n if (matches.length === 1) return matches[0]!;\n\n const nodeEnv =\n typeof globalThis !== \"undefined\" && \"process\" in globalThis\n ? (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV\n : undefined;\n if (nodeEnv != null && nodeEnv !== \"production\") {\n console.warn(\n \"[@lucaismyname/ginger] Ambiguous track identity: multiple queue rows share the same fileUrl without a unique `id`. Resolving to the first match.\",\n );\n }\n return matches[0]!;\n}\n\nexport function insertTrackAt(tracks: Track[], track: Track, index?: number): Track[] {\n const next = [...tracks];\n const at = Math.max(0, Math.min(next.length, index ?? next.length));\n next.splice(at, 0, track);\n return next;\n}\n\nexport function removeTrackAt(tracks: Track[], index: number): Track[] {\n if (index < 0 || index >= tracks.length) return [...tracks];\n const next = [...tracks];\n next.splice(index, 1);\n return next;\n}\n\nexport function moveTrack(tracks: Track[], fromIndex: number, toIndex: number): Track[] {\n if (\n fromIndex === toIndex ||\n fromIndex < 0 ||\n fromIndex >= tracks.length ||\n toIndex < 0 ||\n toIndex >= tracks.length\n ) {\n return [...tracks];\n }\n const next = [...tracks];\n const [item] = next.splice(fromIndex, 1);\n if (!item) return [...tracks];\n next.splice(toIndex, 0, item);\n return next;\n}\n\nexport function addNextTrack(tracks: Track[], currentIndex: number, track: Track): Track[] {\n return insertTrackAt(tracks, track, Math.max(0, Math.min(tracks.length, currentIndex + 1)));\n}\n","import type { GingerState, RepeatMode, Track } from \"../types\";\nimport { clampIndex } from \"./queue\";\n\n/** Fields used by next/prev/ended navigation; avoids coupling helpers to full `GingerState`. */\nexport type GingerPlaybackNavigationSlice = Pick<\n GingerState,\n \"tracks\" | \"currentIndex\" | \"repeatMode\" | \"playbackMode\"\n>;\n\nexport type EndedTransition =\n | { kind: \"replay_same\" }\n | { kind: \"advance\"; nextIndex: number }\n | { kind: \"wrap\"; nextIndex: number }\n | { kind: \"stop\"; nextIndex: number };\n\nexport function computeEndedTransition(state: GingerPlaybackNavigationSlice): EndedTransition {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return { kind: \"stop\", nextIndex: 0 };\n if (repeatMode === \"one\") return { kind: \"replay_same\" };\n if (playbackMode === \"single\") return { kind: \"stop\", nextIndex: clampIndex(currentIndex, len) };\n if (currentIndex < len - 1) return { kind: \"advance\", nextIndex: currentIndex + 1 };\n if (repeatMode === \"all\") return { kind: \"wrap\", nextIndex: 0 };\n return { kind: \"stop\", nextIndex: clampIndex(currentIndex, len) };\n}\n\nexport function computeNextIndex(state: GingerPlaybackNavigationSlice): number {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return 0;\n if (playbackMode === \"single\") return clampIndex(currentIndex, len);\n if (currentIndex < len - 1) return currentIndex + 1;\n if (repeatMode === \"all\") return 0;\n return clampIndex(currentIndex, len);\n}\n\nexport function computePrevIndex(state: GingerPlaybackNavigationSlice): number {\n const { tracks, currentIndex, repeatMode, playbackMode } = state;\n const len = tracks.length;\n if (len === 0) return 0;\n if (playbackMode === \"single\") return clampIndex(currentIndex, len);\n if (currentIndex > 0) return currentIndex - 1;\n if (repeatMode === \"all\") return len - 1;\n return 0;\n}\n\nexport function cycleRepeatMode(mode: RepeatMode): RepeatMode {\n if (mode === \"off\") return \"all\";\n if (mode === \"all\") return \"one\";\n return \"off\";\n}\n\nexport function resolveArtworkUrl(\n track: Track | null,\n playlistArtwork?: string | null,\n): string | undefined {\n return track?.artworkUrl ?? playlistArtwork ?? undefined;\n}\n\nexport function resolveAlbumLine(\n track: Track | null,\n playlistSubtitle?: string | null,\n): string | undefined {\n return track?.album ?? playlistSubtitle ?? undefined;\n}\n"],"names":["clampIndex","index","length","shuffleWithAnchor","tracks","anchorIndex","anchor","rest","_","i","j","trackIdentity","track","findIndexByTrackIdentity","target","byRef","t","identity","matches","nodeEnv","_b","_a","insertTrackAt","next","at","removeTrackAt","moveTrack","fromIndex","toIndex","item","addNextTrack","currentIndex","computeEndedTransition","state","repeatMode","playbackMode","len","computeNextIndex","computePrevIndex","cycleRepeatMode","mode","resolveArtworkUrl","playlistArtwork","resolveAlbumLine","playlistSubtitle"],"mappings":"aAEO,SAASA,EAAWC,EAAeC,EAAwB,CAChE,OAAIA,GAAU,EAAU,EACjB,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAS,EAAGD,CAAK,CAAC,CAChD,CAEO,SAASE,EAAkBC,EAAiBC,EAA8B,CAC/E,GAAID,EAAO,QAAU,EAAG,MAAO,CAAC,GAAGA,CAAM,EACzC,MAAME,EAASF,EAAOC,CAAW,EACjC,GAAI,CAACC,EAAQ,MAAO,CAAC,GAAGF,CAAM,EAC9B,MAAMG,EAAOH,EAAO,OAAO,CAACI,EAAGC,IAAMA,IAAMJ,CAAW,EACtD,QAAS,EAAIE,EAAK,OAAS,EAAG,EAAI,EAAG,IAAK,CACxC,MAAMG,EAAI,KAAK,MAAM,KAAK,UAAY,EAAI,EAAE,EAC5C,CAACH,EAAK,CAAC,EAAGA,EAAKG,CAAC,CAAC,EAAI,CAACH,EAAKG,CAAC,EAAIH,EAAK,CAAC,CAAE,CAC1C,CACA,MAAO,CAACD,EAAQ,GAAGC,CAAI,CACzB,CAEO,SAASI,EAAcC,EAAyC,CACrE,OAAKA,EACEA,EAAM,IAAM,MAAQA,EAAM,KAAO,GAAK,MAAMA,EAAM,EAAE,GAAK,QAAQA,EAAM,OAAO,GADlE,EAErB,CAEO,SAASC,EACdT,EACAU,EACQ,SACR,GAAI,CAACA,EAAQ,MAAO,GACpB,MAAMC,EAAQX,EAAO,UAAWY,GAAMA,IAAMF,CAAM,EAClD,GAAIC,IAAU,GAAI,OAAOA,EAEzB,MAAME,EAAWN,EAAcG,CAAM,EACrC,GAAI,CAACG,EAAU,MAAO,GAEtB,MAAMC,EAAoB,CAAA,EAC1B,QAAST,EAAI,EAAGA,EAAIL,EAAO,OAAQK,GAAK,EAClCE,EAAcP,EAAOK,CAAC,CAAC,IAAMQ,GAAUC,EAAQ,KAAKT,CAAC,EAE3D,GAAIS,EAAQ,SAAW,EAAG,MAAO,GACjC,GAAIA,EAAQ,SAAW,EAAG,OAAOA,EAAQ,CAAC,EAE1C,MAAMC,EACJ,OAAO,WAAe,KAAe,YAAa,YAC7CC,GAAAC,EAAA,WAA6D,UAA7D,YAAAA,EAAsE,MAAtE,YAAAD,EAA2E,SAC5E,OACN,OAAID,GAAW,MAAQA,IAAY,cACjC,QAAQ,KACN,kJAAA,EAGGD,EAAQ,CAAC,CAClB,CAEO,SAASI,EAAclB,EAAiBQ,EAAcX,EAAyB,CACpF,MAAMsB,EAAO,CAAC,GAAGnB,CAAM,EACjBoB,EAAK,KAAK,IAAI,EAAG,KAAK,IAAID,EAAK,OAAQtB,GAASsB,EAAK,MAAM,CAAC,EAClE,OAAAA,EAAK,OAAOC,EAAI,EAAGZ,CAAK,EACjBW,CACT,CAEO,SAASE,EAAcrB,EAAiBH,EAAwB,CACrE,GAAIA,EAAQ,GAAKA,GAASG,EAAO,OAAQ,MAAO,CAAC,GAAGA,CAAM,EAC1D,MAAMmB,EAAO,CAAC,GAAGnB,CAAM,EACvB,OAAAmB,EAAK,OAAOtB,EAAO,CAAC,EACbsB,CACT,CAEO,SAASG,EAAUtB,EAAiBuB,EAAmBC,EAA0B,CACtF,GACED,IAAcC,GACdD,EAAY,GACZA,GAAavB,EAAO,QACpBwB,EAAU,GACVA,GAAWxB,EAAO,OAElB,MAAO,CAAC,GAAGA,CAAM,EAEnB,MAAMmB,EAAO,CAAC,GAAGnB,CAAM,EACjB,CAACyB,CAAI,EAAIN,EAAK,OAAOI,EAAW,CAAC,EACvC,OAAKE,GACLN,EAAK,OAAOK,EAAS,EAAGC,CAAI,EACrBN,GAFW,CAAC,GAAGnB,CAAM,CAG9B,CAEO,SAAS0B,EAAa1B,EAAiB2B,EAAsBnB,EAAuB,CACzF,OAAOU,EAAclB,EAAQQ,EAAO,KAAK,IAAI,EAAG,KAAK,IAAIR,EAAO,OAAQ2B,EAAe,CAAC,CAAC,CAAC,CAC5F,CCxEO,SAASC,EAAuBC,EAAuD,CAC5F,KAAM,CAAE,OAAA7B,EAAQ,aAAA2B,EAAc,WAAAG,EAAY,aAAAC,GAAiBF,EACrDG,EAAMhC,EAAO,OACnB,OAAIgC,IAAQ,EAAU,CAAE,KAAM,OAAQ,UAAW,CAAA,EAC7CF,IAAe,MAAc,CAAE,KAAM,aAAA,EACrCC,IAAiB,SAAiB,CAAE,KAAM,OAAQ,UAAWnC,EAAW+B,EAAcK,CAAG,CAAA,EACzFL,EAAeK,EAAM,EAAU,CAAE,KAAM,UAAW,UAAWL,EAAe,CAAA,EAC5EG,IAAe,MAAc,CAAE,KAAM,OAAQ,UAAW,CAAA,EACrD,CAAE,KAAM,OAAQ,UAAWlC,EAAW+B,EAAcK,CAAG,CAAA,CAChE,CAEO,SAASC,EAAiBJ,EAA8C,CAC7E,KAAM,CAAE,OAAA7B,EAAQ,aAAA2B,EAAc,WAAAG,EAAY,aAAAC,GAAiBF,EACrDG,EAAMhC,EAAO,OACnB,OAAIgC,IAAQ,EAAU,EAClBD,IAAiB,SAAiBnC,EAAW+B,EAAcK,CAAG,EAC9DL,EAAeK,EAAM,EAAUL,EAAe,EAC9CG,IAAe,MAAc,EAC1BlC,EAAW+B,EAAcK,CAAG,CACrC,CAEO,SAASE,EAAiBL,EAA8C,CAC7E,KAAM,CAAE,OAAA7B,EAAQ,aAAA2B,EAAc,WAAAG,EAAY,aAAAC,GAAiBF,EACrDG,EAAMhC,EAAO,OACnB,OAAIgC,IAAQ,EAAU,EAClBD,IAAiB,SAAiBnC,EAAW+B,EAAcK,CAAG,EAC9DL,EAAe,EAAUA,EAAe,EACxCG,IAAe,MAAcE,EAAM,EAChC,CACT,CAEO,SAASG,EAAgBC,EAA8B,CAC5D,OAAIA,IAAS,MAAc,MACvBA,IAAS,MAAc,MACpB,KACT,CAEO,SAASC,EACd7B,EACA8B,EACoB,CACpB,OAAO9B,GAAA,YAAAA,EAAO,aAAc8B,GAAmB,MACjD,CAEO,SAASC,EACd/B,EACAgC,EACoB,CACpB,OAAOhC,GAAA,YAAAA,EAAO,QAASgC,GAAoB,MAC7C"}
@@ -1,2 +1,2 @@
1
- "use strict";const c=require("react"),s=require("./GingerSplitContexts-C7puo0M7.cjs"),r=require("./selectors-YXnP8Y8g.cjs");function u(){const e=s.useGingerPlayback(),t=s.useGingerMedia();return c.useMemo(()=>{const a=s.gingerStateFromContextValues(e,t);return{state:a,currentTrack:r.getCurrentTrack(a),playbackUi:r.derivePlaybackUiState(a),duration:r.effectiveDuration(a),remaining:r.effectiveRemaining(a),progress:r.progressFraction(a),artworkUrl:r.resolvedArtwork(a),albumLine:r.resolvedAlbumLine(a),play:e.play,pause:e.pause,togglePlayPause:e.togglePlayPause,seek:t.seek,setVolume:t.setVolume,setMuted:t.setMuted,toggleMute:t.toggleMute,setPlaybackRate:t.setPlaybackRate,next:e.next,prev:e.prev,setRepeatMode:e.setRepeatMode,cycleRepeat:e.cycleRepeat,toggleShuffle:e.toggleShuffle,setQueue:e.setQueue,insertTrackAt:e.insertTrackAt,removeTrackAt:e.removeTrackAt,moveTrack:e.moveTrack,enqueueNext:e.enqueueNext,playTrackAt:e.playTrackAt,selectTrackAt:e.selectTrackAt,setPlaylistMeta:e.setPlaylistMeta,setPlaybackMode:e.setPlaybackMode,init:e.init,audioRef:t.audioRef,dispatch:e.dispatch}},[e,t])}exports.useGinger=u;
2
- //# sourceMappingURL=useGinger-BXgia32v.cjs.map
1
+ "use strict";const c=require("react"),s=require("./GingerSplitContexts-C7puo0M7.cjs"),r=require("./selectors-CEGlYoFu.cjs");function u(){const e=s.useGingerPlayback(),t=s.useGingerMedia();return c.useMemo(()=>{const a=s.gingerStateFromContextValues(e,t);return{state:a,currentTrack:r.getCurrentTrack(a),playbackUi:r.derivePlaybackUiState(a),duration:r.effectiveDuration(a),remaining:r.effectiveRemaining(a),progress:r.progressFraction(a),artworkUrl:r.resolvedArtwork(a),albumLine:r.resolvedAlbumLine(a),play:e.play,pause:e.pause,togglePlayPause:e.togglePlayPause,seek:t.seek,setVolume:t.setVolume,setMuted:t.setMuted,toggleMute:t.toggleMute,setPlaybackRate:t.setPlaybackRate,next:e.next,prev:e.prev,setRepeatMode:e.setRepeatMode,cycleRepeat:e.cycleRepeat,toggleShuffle:e.toggleShuffle,setQueue:e.setQueue,insertTrackAt:e.insertTrackAt,removeTrackAt:e.removeTrackAt,moveTrack:e.moveTrack,enqueueNext:e.enqueueNext,playTrackAt:e.playTrackAt,selectTrackAt:e.selectTrackAt,setPlaylistMeta:e.setPlaylistMeta,setPlaybackMode:e.setPlaybackMode,init:e.init,audioRef:t.audioRef,dispatch:e.dispatch}},[e,t])}exports.useGinger=u;
2
+ //# sourceMappingURL=useGinger-4uvPoChz.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useGinger-BXgia32v.cjs","sources":["../src/hooks/useGinger.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport {\n gingerStateFromContextValues,\n useGingerMedia,\n useGingerPlayback,\n} from \"../context/GingerSplitContexts\";\nimport {\n derivePlaybackUiState,\n effectiveDuration,\n effectiveRemaining,\n getCurrentTrack,\n progressFraction,\n resolvedAlbumLine,\n resolvedArtwork,\n} from \"../internal/selectors\";\n\nexport function useGinger() {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n\n return useMemo(() => {\n const state = gingerStateFromContextValues(pb, md);\n return {\n state,\n currentTrack: getCurrentTrack(state),\n playbackUi: derivePlaybackUiState(state),\n duration: effectiveDuration(state),\n remaining: effectiveRemaining(state),\n progress: progressFraction(state),\n artworkUrl: resolvedArtwork(state),\n albumLine: resolvedAlbumLine(state),\n play: pb.play,\n pause: pb.pause,\n togglePlayPause: pb.togglePlayPause,\n seek: md.seek,\n setVolume: md.setVolume,\n setMuted: md.setMuted,\n toggleMute: md.toggleMute,\n setPlaybackRate: md.setPlaybackRate,\n next: pb.next,\n prev: pb.prev,\n setRepeatMode: pb.setRepeatMode,\n cycleRepeat: pb.cycleRepeat,\n toggleShuffle: pb.toggleShuffle,\n setQueue: pb.setQueue,\n insertTrackAt: pb.insertTrackAt,\n removeTrackAt: pb.removeTrackAt,\n moveTrack: pb.moveTrack,\n enqueueNext: pb.enqueueNext,\n playTrackAt: pb.playTrackAt,\n selectTrackAt: pb.selectTrackAt,\n setPlaylistMeta: pb.setPlaylistMeta,\n setPlaybackMode: pb.setPlaybackMode,\n init: pb.init,\n audioRef: md.audioRef,\n dispatch: pb.dispatch,\n };\n }, [pb, md]);\n}\n"],"names":["useGinger","pb","useGingerPlayback","md","useGingerMedia","useMemo","state","gingerStateFromContextValues","getCurrentTrack","derivePlaybackUiState","effectiveDuration","effectiveRemaining","progressFraction","resolvedArtwork","resolvedAlbumLine"],"mappings":"4HAgBO,SAASA,GAAY,CAC1B,MAAMC,EAAKC,EAAAA,kBAAA,EACLC,EAAKC,EAAAA,eAAA,EAEX,OAAOC,EAAAA,QAAQ,IAAM,CACnB,MAAMC,EAAQC,EAAAA,6BAA6BN,EAAIE,CAAE,EACjD,MAAO,CACL,MAAAG,EACA,aAAcE,EAAAA,gBAAgBF,CAAK,EACnC,WAAYG,EAAAA,sBAAsBH,CAAK,EACvC,SAAUI,EAAAA,kBAAkBJ,CAAK,EACjC,UAAWK,EAAAA,mBAAmBL,CAAK,EACnC,SAAUM,EAAAA,iBAAiBN,CAAK,EAChC,WAAYO,EAAAA,gBAAgBP,CAAK,EACjC,UAAWQ,EAAAA,kBAAkBR,CAAK,EAClC,KAAML,EAAG,KACT,MAAOA,EAAG,MACV,gBAAiBA,EAAG,gBACpB,KAAME,EAAG,KACT,UAAWA,EAAG,UACd,SAAUA,EAAG,SACb,WAAYA,EAAG,WACf,gBAAiBA,EAAG,gBACpB,KAAMF,EAAG,KACT,KAAMA,EAAG,KACT,cAAeA,EAAG,cAClB,YAAaA,EAAG,YAChB,cAAeA,EAAG,cAClB,SAAUA,EAAG,SACb,cAAeA,EAAG,cAClB,cAAeA,EAAG,cAClB,UAAWA,EAAG,UACd,YAAaA,EAAG,YAChB,YAAaA,EAAG,YAChB,cAAeA,EAAG,cAClB,gBAAiBA,EAAG,gBACpB,gBAAiBA,EAAG,gBACpB,KAAMA,EAAG,KACT,SAAUE,EAAG,SACb,SAAUF,EAAG,QAAA,CAEjB,EAAG,CAACA,EAAIE,CAAE,CAAC,CACb"}
1
+ {"version":3,"file":"useGinger-4uvPoChz.cjs","sources":["../src/hooks/useGinger.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport {\n gingerStateFromContextValues,\n useGingerMedia,\n useGingerPlayback,\n} from \"../context/GingerSplitContexts\";\nimport {\n derivePlaybackUiState,\n effectiveDuration,\n effectiveRemaining,\n getCurrentTrack,\n progressFraction,\n resolvedAlbumLine,\n resolvedArtwork,\n} from \"../internal/selectors\";\n\nexport function useGinger() {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n\n return useMemo(() => {\n const state = gingerStateFromContextValues(pb, md);\n return {\n state,\n currentTrack: getCurrentTrack(state),\n playbackUi: derivePlaybackUiState(state),\n duration: effectiveDuration(state),\n remaining: effectiveRemaining(state),\n progress: progressFraction(state),\n artworkUrl: resolvedArtwork(state),\n albumLine: resolvedAlbumLine(state),\n play: pb.play,\n pause: pb.pause,\n togglePlayPause: pb.togglePlayPause,\n seek: md.seek,\n setVolume: md.setVolume,\n setMuted: md.setMuted,\n toggleMute: md.toggleMute,\n setPlaybackRate: md.setPlaybackRate,\n next: pb.next,\n prev: pb.prev,\n setRepeatMode: pb.setRepeatMode,\n cycleRepeat: pb.cycleRepeat,\n toggleShuffle: pb.toggleShuffle,\n setQueue: pb.setQueue,\n insertTrackAt: pb.insertTrackAt,\n removeTrackAt: pb.removeTrackAt,\n moveTrack: pb.moveTrack,\n enqueueNext: pb.enqueueNext,\n playTrackAt: pb.playTrackAt,\n selectTrackAt: pb.selectTrackAt,\n setPlaylistMeta: pb.setPlaylistMeta,\n setPlaybackMode: pb.setPlaybackMode,\n init: pb.init,\n audioRef: md.audioRef,\n dispatch: pb.dispatch,\n };\n }, [pb, md]);\n}\n"],"names":["useGinger","pb","useGingerPlayback","md","useGingerMedia","useMemo","state","gingerStateFromContextValues","getCurrentTrack","derivePlaybackUiState","effectiveDuration","effectiveRemaining","progressFraction","resolvedArtwork","resolvedAlbumLine"],"mappings":"4HAgBO,SAASA,GAAY,CAC1B,MAAMC,EAAKC,EAAAA,kBAAA,EACLC,EAAKC,EAAAA,eAAA,EAEX,OAAOC,EAAAA,QAAQ,IAAM,CACnB,MAAMC,EAAQC,EAAAA,6BAA6BN,EAAIE,CAAE,EACjD,MAAO,CACL,MAAAG,EACA,aAAcE,EAAAA,gBAAgBF,CAAK,EACnC,WAAYG,EAAAA,sBAAsBH,CAAK,EACvC,SAAUI,EAAAA,kBAAkBJ,CAAK,EACjC,UAAWK,EAAAA,mBAAmBL,CAAK,EACnC,SAAUM,EAAAA,iBAAiBN,CAAK,EAChC,WAAYO,EAAAA,gBAAgBP,CAAK,EACjC,UAAWQ,EAAAA,kBAAkBR,CAAK,EAClC,KAAML,EAAG,KACT,MAAOA,EAAG,MACV,gBAAiBA,EAAG,gBACpB,KAAME,EAAG,KACT,UAAWA,EAAG,UACd,SAAUA,EAAG,SACb,WAAYA,EAAG,WACf,gBAAiBA,EAAG,gBACpB,KAAMF,EAAG,KACT,KAAMA,EAAG,KACT,cAAeA,EAAG,cAClB,YAAaA,EAAG,YAChB,cAAeA,EAAG,cAClB,SAAUA,EAAG,SACb,cAAeA,EAAG,cAClB,cAAeA,EAAG,cAClB,UAAWA,EAAG,UACd,YAAaA,EAAG,YAChB,YAAaA,EAAG,YAChB,cAAeA,EAAG,cAClB,gBAAiBA,EAAG,gBACpB,gBAAiBA,EAAG,gBACpB,KAAMA,EAAG,KACT,SAAUE,EAAG,SACb,SAAUF,EAAG,QAAA,CAEjB,EAAG,CAACA,EAAIE,CAAE,CAAC,CACb"}
@@ -1,6 +1,6 @@
1
1
  import { useMemo as r } from "react";
2
2
  import { b as s, u as o, g as u } from "./GingerSplitContexts-BzBExb95.js";
3
- import { r as l, a as c, p as i, e as n, b as g, d as k, g as p } from "./selectors-BalBCc7X.js";
3
+ import { r as l, a as c, p as i, e as n, b as g, d as k, g as p } from "./selectors-BT3WSsKN.js";
4
4
  function f() {
5
5
  const e = s(), t = o();
6
6
  return r(() => {
@@ -45,4 +45,4 @@ function f() {
45
45
  export {
46
46
  f as u
47
47
  };
48
- //# sourceMappingURL=useGinger-hpp2pAGY.js.map
48
+ //# sourceMappingURL=useGinger-Dz0cPyD1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useGinger-hpp2pAGY.js","sources":["../src/hooks/useGinger.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport {\n gingerStateFromContextValues,\n useGingerMedia,\n useGingerPlayback,\n} from \"../context/GingerSplitContexts\";\nimport {\n derivePlaybackUiState,\n effectiveDuration,\n effectiveRemaining,\n getCurrentTrack,\n progressFraction,\n resolvedAlbumLine,\n resolvedArtwork,\n} from \"../internal/selectors\";\n\nexport function useGinger() {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n\n return useMemo(() => {\n const state = gingerStateFromContextValues(pb, md);\n return {\n state,\n currentTrack: getCurrentTrack(state),\n playbackUi: derivePlaybackUiState(state),\n duration: effectiveDuration(state),\n remaining: effectiveRemaining(state),\n progress: progressFraction(state),\n artworkUrl: resolvedArtwork(state),\n albumLine: resolvedAlbumLine(state),\n play: pb.play,\n pause: pb.pause,\n togglePlayPause: pb.togglePlayPause,\n seek: md.seek,\n setVolume: md.setVolume,\n setMuted: md.setMuted,\n toggleMute: md.toggleMute,\n setPlaybackRate: md.setPlaybackRate,\n next: pb.next,\n prev: pb.prev,\n setRepeatMode: pb.setRepeatMode,\n cycleRepeat: pb.cycleRepeat,\n toggleShuffle: pb.toggleShuffle,\n setQueue: pb.setQueue,\n insertTrackAt: pb.insertTrackAt,\n removeTrackAt: pb.removeTrackAt,\n moveTrack: pb.moveTrack,\n enqueueNext: pb.enqueueNext,\n playTrackAt: pb.playTrackAt,\n selectTrackAt: pb.selectTrackAt,\n setPlaylistMeta: pb.setPlaylistMeta,\n setPlaybackMode: pb.setPlaybackMode,\n init: pb.init,\n audioRef: md.audioRef,\n dispatch: pb.dispatch,\n };\n }, [pb, md]);\n}\n"],"names":["useGinger","pb","useGingerPlayback","md","useGingerMedia","useMemo","state","gingerStateFromContextValues","getCurrentTrack","derivePlaybackUiState","effectiveDuration","effectiveRemaining","progressFraction","resolvedArtwork","resolvedAlbumLine"],"mappings":";;;AAgBO,SAASA,IAAY;AAC1B,QAAMC,IAAKC,EAAA,GACLC,IAAKC,EAAA;AAEX,SAAOC,EAAQ,MAAM;AACnB,UAAMC,IAAQC,EAA6BN,GAAIE,CAAE;AACjD,WAAO;AAAA,MACL,OAAAG;AAAA,MACA,cAAcE,EAAgBF,CAAK;AAAA,MACnC,YAAYG,EAAsBH,CAAK;AAAA,MACvC,UAAUI,EAAkBJ,CAAK;AAAA,MACjC,WAAWK,EAAmBL,CAAK;AAAA,MACnC,UAAUM,EAAiBN,CAAK;AAAA,MAChC,YAAYO,EAAgBP,CAAK;AAAA,MACjC,WAAWQ,EAAkBR,CAAK;AAAA,MAClC,MAAML,EAAG;AAAA,MACT,OAAOA,EAAG;AAAA,MACV,iBAAiBA,EAAG;AAAA,MACpB,MAAME,EAAG;AAAA,MACT,WAAWA,EAAG;AAAA,MACd,UAAUA,EAAG;AAAA,MACb,YAAYA,EAAG;AAAA,MACf,iBAAiBA,EAAG;AAAA,MACpB,MAAMF,EAAG;AAAA,MACT,MAAMA,EAAG;AAAA,MACT,eAAeA,EAAG;AAAA,MAClB,aAAaA,EAAG;AAAA,MAChB,eAAeA,EAAG;AAAA,MAClB,UAAUA,EAAG;AAAA,MACb,eAAeA,EAAG;AAAA,MAClB,eAAeA,EAAG;AAAA,MAClB,WAAWA,EAAG;AAAA,MACd,aAAaA,EAAG;AAAA,MAChB,aAAaA,EAAG;AAAA,MAChB,eAAeA,EAAG;AAAA,MAClB,iBAAiBA,EAAG;AAAA,MACpB,iBAAiBA,EAAG;AAAA,MACpB,MAAMA,EAAG;AAAA,MACT,UAAUE,EAAG;AAAA,MACb,UAAUF,EAAG;AAAA,IAAA;AAAA,EAEjB,GAAG,CAACA,GAAIE,CAAE,CAAC;AACb;"}
1
+ {"version":3,"file":"useGinger-Dz0cPyD1.js","sources":["../src/hooks/useGinger.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport {\n gingerStateFromContextValues,\n useGingerMedia,\n useGingerPlayback,\n} from \"../context/GingerSplitContexts\";\nimport {\n derivePlaybackUiState,\n effectiveDuration,\n effectiveRemaining,\n getCurrentTrack,\n progressFraction,\n resolvedAlbumLine,\n resolvedArtwork,\n} from \"../internal/selectors\";\n\nexport function useGinger() {\n const pb = useGingerPlayback();\n const md = useGingerMedia();\n\n return useMemo(() => {\n const state = gingerStateFromContextValues(pb, md);\n return {\n state,\n currentTrack: getCurrentTrack(state),\n playbackUi: derivePlaybackUiState(state),\n duration: effectiveDuration(state),\n remaining: effectiveRemaining(state),\n progress: progressFraction(state),\n artworkUrl: resolvedArtwork(state),\n albumLine: resolvedAlbumLine(state),\n play: pb.play,\n pause: pb.pause,\n togglePlayPause: pb.togglePlayPause,\n seek: md.seek,\n setVolume: md.setVolume,\n setMuted: md.setMuted,\n toggleMute: md.toggleMute,\n setPlaybackRate: md.setPlaybackRate,\n next: pb.next,\n prev: pb.prev,\n setRepeatMode: pb.setRepeatMode,\n cycleRepeat: pb.cycleRepeat,\n toggleShuffle: pb.toggleShuffle,\n setQueue: pb.setQueue,\n insertTrackAt: pb.insertTrackAt,\n removeTrackAt: pb.removeTrackAt,\n moveTrack: pb.moveTrack,\n enqueueNext: pb.enqueueNext,\n playTrackAt: pb.playTrackAt,\n selectTrackAt: pb.selectTrackAt,\n setPlaylistMeta: pb.setPlaylistMeta,\n setPlaybackMode: pb.setPlaybackMode,\n init: pb.init,\n audioRef: md.audioRef,\n dispatch: pb.dispatch,\n };\n }, [pb, md]);\n}\n"],"names":["useGinger","pb","useGingerPlayback","md","useGingerMedia","useMemo","state","gingerStateFromContextValues","getCurrentTrack","derivePlaybackUiState","effectiveDuration","effectiveRemaining","progressFraction","resolvedArtwork","resolvedAlbumLine"],"mappings":";;;AAgBO,SAASA,IAAY;AAC1B,QAAMC,IAAKC,EAAA,GACLC,IAAKC,EAAA;AAEX,SAAOC,EAAQ,MAAM;AACnB,UAAMC,IAAQC,EAA6BN,GAAIE,CAAE;AACjD,WAAO;AAAA,MACL,OAAAG;AAAA,MACA,cAAcE,EAAgBF,CAAK;AAAA,MACnC,YAAYG,EAAsBH,CAAK;AAAA,MACvC,UAAUI,EAAkBJ,CAAK;AAAA,MACjC,WAAWK,EAAmBL,CAAK;AAAA,MACnC,UAAUM,EAAiBN,CAAK;AAAA,MAChC,YAAYO,EAAgBP,CAAK;AAAA,MACjC,WAAWQ,EAAkBR,CAAK;AAAA,MAClC,MAAML,EAAG;AAAA,MACT,OAAOA,EAAG;AAAA,MACV,iBAAiBA,EAAG;AAAA,MACpB,MAAME,EAAG;AAAA,MACT,WAAWA,EAAG;AAAA,MACd,UAAUA,EAAG;AAAA,MACb,YAAYA,EAAG;AAAA,MACf,iBAAiBA,EAAG;AAAA,MACpB,MAAMF,EAAG;AAAA,MACT,MAAMA,EAAG;AAAA,MACT,eAAeA,EAAG;AAAA,MAClB,aAAaA,EAAG;AAAA,MAChB,eAAeA,EAAG;AAAA,MAClB,UAAUA,EAAG;AAAA,MACb,eAAeA,EAAG;AAAA,MAClB,eAAeA,EAAG;AAAA,MAClB,WAAWA,EAAG;AAAA,MACd,aAAaA,EAAG;AAAA,MAChB,aAAaA,EAAG;AAAA,MAChB,eAAeA,EAAG;AAAA,MAClB,iBAAiBA,EAAG;AAAA,MACpB,iBAAiBA,EAAG;AAAA,MACpB,MAAMA,EAAG;AAAA,MACT,UAAUE,EAAG;AAAA,MACb,UAAUF,EAAG;AAAA,IAAA;AAAA,EAEjB,GAAG,CAACA,GAAIE,CAAE,CAAC;AACb;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const t=require("react"),H=require("./useGinger-4uvPoChz.cjs"),N=require("./liveAudioGraph-0cpHD_Ic.cjs"),w=require("./GingerSplitContexts-C7puo0M7.cjs"),z=require("./selectors-CEGlYoFu.cjs"),X=require("./transitions-Dx08t68T.cjs"),D=require("./ginger-Dv3iO_xQ.cjs"),q=new Uint8Array(0),C=new Uint8Array(0);function O(s={}){const{enabled:e=!0,fftSize:r=2048,smoothingTimeConstant:n=.8,minDecibels:u=-100,maxDecibels:c=-30}=s,{audioRef:a,state:o}=H.useGinger(),d=t.useMemo(()=>({fftSize:r,smoothingTimeConstant:n,minDecibels:u,maxDecibels:c}),[r,n,u,c]),[l,m]=t.useState(0),[f,i]=t.useState(null),[h,R]=t.useState(!1),[S,p]=t.useState({frequencyBinCount:0,sampleRate:0}),g=t.useRef(q),v=t.useRef(C),E=t.useCallback(async()=>{const x=y.current;x&&x.state==="suspended"&&await x.resume()},[]),y=t.useRef(null),I=t.useRef(null);return t.useLayoutEffect(()=>{if(!e||typeof window>"u")return;let x=!1,b=null,A=null,T=0;const F=()=>{const k=y.current;k&&R(k.state==="suspended")},V=()=>{if(x)return;const k=I.current,P=g.current,M=v.current;k&&P.length>0&&M.length>0&&(k.getByteFrequencyData(P),k.getByteTimeDomainData(M),m(G=>G+1)),T=requestAnimationFrame(V)},B=()=>{const k=a.current;if(!k||x)return"no-element";try{const{id:P,context:M,analyser:G}=N.attachLiveAnalyser(k,d);b=P,A=k,y.current=M,I.current=G,R(M.state==="suspended"),i(null),M.addEventListener("statechange",F);const L=G.frequencyBinCount,U=G.fftSize;return g.current=new Uint8Array(L),v.current=new Uint8Array(U),p({frequencyBinCount:L,sampleRate:M.sampleRate}),T=requestAnimationFrame(V),"ok"}catch(P){const M=P instanceof Error?P.message:"Failed to attach live analyser";return i(M),y.current=null,I.current=null,g.current=q,v.current=C,p({frequencyBinCount:0,sampleRate:0}),"error"}},K=B();if(K!=="ok"){let k=0;const P=120;let M=0;const G=()=>{if(x)return;const L=B();L==="ok"||L==="error"||(M+=1,!(M>=P)&&(k=requestAnimationFrame(G)))};return K==="no-element"&&(k=requestAnimationFrame(G)),()=>{var L;x=!0,cancelAnimationFrame(k),cancelAnimationFrame(T),b!=null&&A&&N.detachLiveAnalyser(A,b),(L=y.current)==null||L.removeEventListener("statechange",F),y.current=null,I.current=null,g.current=q,v.current=C}}return()=>{var k;x=!0,cancelAnimationFrame(T),b!=null&&A&&N.detachLiveAnalyser(A,b),(k=y.current)==null||k.removeEventListener("statechange",F),y.current=null,I.current=null,g.current=q,v.current=C,p({frequencyBinCount:0,sampleRate:0})}},[e,a,d,o.currentIndex]),{frequencyData:g.current,timeDomainData:v.current,frequencyBinCount:S.frequencyBinCount,sampleRate:S.sampleRate,isSuspended:h,error:f,resume:E,frame:l}}function Y(s=!0,e={}){const{togglePlayPause:r,next:n,prev:u}=w.useGingerPlayback(),{toggleMute:c,seek:a,currentTime:o,duration:d}=w.useGingerMedia(),{mute:l,seekForward:m,seekBackward:f}=e;t.useEffect(()=>{if(!s||typeof window>"u")return;const i=(e.playPause??" ").toLowerCase(),h=(e.next??"ArrowRight").toLowerCase(),R=(e.previous??"ArrowLeft").toLowerCase(),S=l==null?void 0:l.toLowerCase(),p=m==null?void 0:m.toLowerCase(),g=f==null?void 0:f.toLowerCase(),v=e.seekSeconds??5,E=y=>{const I=y.target;if(I&&(["INPUT","TEXTAREA","SELECT"].includes(I.tagName)||I.isContentEditable))return;const x=y.key.toLowerCase();if(x===i)y.preventDefault(),r();else if(x===h)y.preventDefault(),n();else if(x===R)y.preventDefault(),u();else if(S&&x===S)y.preventDefault(),c();else if(p&&x===p){y.preventDefault();const b=d>0?d:Number.POSITIVE_INFINITY;a(Math.min(b,o+v))}else g&&x===g&&(y.preventDefault(),a(Math.max(0,o-v)))};return window.addEventListener("keydown",E),()=>window.removeEventListener("keydown",E)},[e.next,e.playPause,e.previous,e.seekSeconds,o,d,s,l,n,u,a,f,m,c,r])}function _(s){const{durationMs:e,stopAfterTracks:r,respectPause:n=!0,enabled:u=!0,onFire:c}=s,{currentIndex:a,pause:o,isPaused:d}=w.useGingerPlayback(),l=t.useRef(r??0),m=t.useRef(a),f=t.useRef(e??0),i=t.useRef(null);t.useEffect(()=>{l.current=r??0},[r]);const h=t.useRef(e);t.useEffect(()=>{h.current!==e&&(f.current=e??0,h.current=e)},[e]),t.useEffect(()=>{if(!u||!e||e<=0){f.current=e??0,i.current=null;return}if(n&&d){if(i.current!==null){const S=Date.now()-i.current;f.current=Math.max(0,f.current-S),i.current=null}return}i.current=Date.now();const R=setTimeout(()=>{f.current=0,i.current=null,o(),c==null||c()},f.current);return()=>{if(clearTimeout(R),i.current!==null){const S=Date.now()-i.current;f.current=Math.max(0,f.current-S),i.current=null}}},[e,u,d,c,o,n]),t.useEffect(()=>{if(!u||!r||r<=0)return;const R=m.current;m.current=a,a!==R&&(l.current-=1,l.current<=0&&(o(),c==null||c()))},[a,u,c,o,r])}function j(s=!1){const e=w.useGingerState(),r=t.useRef(e);t.useEffect(()=>{if(!s||typeof console>"u")return;const n=r.current;n!==e&&console.debug("[ginger]",{from:{currentIndex:n.currentIndex,isPaused:n.isPaused,currentTime:n.currentTime,repeatMode:n.repeatMode},to:{currentIndex:e.currentIndex,isPaused:e.isPaused,currentTime:e.currentTime,repeatMode:e.repeatMode}}),r.current=e},[s,e])}function J(s){return Math.max(0,Math.min(1,s))}function Q(s){const e=w.useGingerMedia(),r=w.useGingerPlayback(),{seek:n}=e,[u,c]=t.useState(0),[a,o]=t.useState(!1),d=z.progressFraction(w.gingerStateFromContextValues(r,e)),l=a?u:d,m=t.useCallback(f=>{if(!(s>0))return;const i=f.currentTarget,h=i.getBoundingClientRect(),R=g=>{const v=J((g-h.left)/h.width);c(v),n(v*s)};o(!0),i.setPointerCapture(f.pointerId),R(f.clientX);const S=g=>R(g.clientX),p=g=>{R(g.clientX),o(!1),i.releasePointerCapture(f.pointerId),i.removeEventListener("pointermove",S),i.removeEventListener("pointerup",p),i.removeEventListener("pointercancel",p)};i.addEventListener("pointermove",S),i.addEventListener("pointerup",p),i.addEventListener("pointercancel",p)},[s,n]);return{fraction:u,displayFraction:l,isDragging:a,onPointerDown:m}}function W(s={}){const{enabled:e=!0,crossOrigin:r}=s,{tracks:n,currentIndex:u,repeatMode:c,playbackMode:a}=w.useGingerPlayback();t.useEffect(()=>{var m;if(!e||typeof document>"u")return;const o=X.computeNextIndex({tracks:n,currentIndex:u,repeatMode:c,playbackMode:a});if(o===u)return;const d=((m=n[o])==null?void 0:m.fileUrl)??"";if(!d)return;const l=document.createElement("audio");return l.preload="auto",r&&(l.crossOrigin=r),l.src=d,l.load(),()=>{l.removeAttribute("src"),l.load()}},[e,r,n,u,c,a])}function Z(s={}){let e=D.createInitialState({tracks:s.tracks??[],currentIndex:s.currentIndex,playlistMeta:s.playlistMeta,isPaused:s.isPaused,isShuffled:s.isShuffled,repeatMode:s.repeatMode,playbackMode:s.playbackMode,volume:s.volume,muted:s.muted,playbackRate:s.playbackRate});const r=new Set,n=a=>{const o=D.gingerReducer(e,a);if(o!==e){e=o;for(const d of r)d(e)}};return{getState:()=>e,dispatch:n,subscribe:a=>(r.add(a),()=>r.delete(a)),init:a=>{n({type:"INIT",payload:a})},clampVolume:D.clampVolume,clampPlaybackRate:D.clampPlaybackRate}}function $(s={}){const{maxLength:e=50}=s,{tracks:r,currentIndex:n}=w.useGingerPlayback(),[u,c]=t.useState([]),a=t.useRef(null),o=t.useRef(r);o.current=r,t.useEffect(()=>{const l=r[n];if(!l||a.current===n)return;a.current=n;const m={track:l,index:n,playedAt:Date.now()};c(f=>{const i=[...f,m];return i.length>e?i.slice(i.length-e):i})},[n,r,e]);const d=t.useCallback(()=>c([]),[]);return{history:u,clearHistory:d}}function ee(){const{setVolume:s,volume:e}=w.useGingerMedia(),[r,n]=t.useState(!1),u=t.useRef(0),c=t.useRef(!1),a=t.useCallback(()=>{cancelAnimationFrame(u.current),c.current=!0,n(!1)},[]);return{fadeVolumeTo:t.useCallback(({targetVolume:d,durationMs:l,onComplete:m})=>{cancelAnimationFrame(u.current),c.current=!1;const f=p=>Math.min(1,Math.max(0,p)),i=f(d),h=performance.now();let R=e;n(!0);const S=p=>{if(c.current)return;const g=p-h,v=Math.min(1,g/Math.max(1,l)),E=R+(i-R)*v;s(f(E)),v<1?u.current=requestAnimationFrame(S):(n(!1),m==null||m())};u.current=requestAnimationFrame(p=>{R=e,S(p)})},[s,e]),cancelFade:a,isFading:r}}function te(){const{tracks:s,currentIndex:e}=w.useGingerPlayback(),{currentTime:r,duration:n}=w.useGingerMedia(),u=t.useMemo(()=>{var a;return[...((a=s[e])==null?void 0:a.chapters)??[]].filter(o=>o&&Number.isFinite(o.startSeconds)&&o.startSeconds>=0).sort((o,d)=>o.startSeconds-d.startSeconds)},[s,e]);return t.useMemo(()=>{if(u.length===0)return{progress:0,elapsed:0,remaining:0};let c=-1;for(let h=u.length-1;h>=0;h--)if(r>=u[h].startSeconds){c=h;break}if(c===-1)return{progress:0,elapsed:0,remaining:0};const a=u[c],o=u[c+1],d=(o==null?void 0:o.startSeconds)??(n>0?n:r),l=Math.max(0,d-a.startSeconds),m=Math.max(0,r-a.startSeconds),f=Math.max(0,d-r);return{progress:l>0?Math.min(1,m/l):0,elapsed:m,remaining:f}},[u,r,n])}exports.createGingerStore=Z;exports.useGingerChapterProgress=te;exports.useGingerDebugLog=j;exports.useGingerKeyboardShortcuts=Y;exports.useGingerLiveAnalyzer=O;exports.useGingerPlaybackHistory=$;exports.useGingerSleepTimer=_;exports.useGingerVolumeFade=ee;exports.useNextTrackPrefetch=W;exports.useSeekDrag=Q;
2
+ //# sourceMappingURL=useGingerChapterProgress-D2pdmyjg.cjs.map