@lucaismyname/ginger 0.0.53 → 0.0.55

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 (64) hide show
  1. package/README.md +3 -0
  2. package/dist/GingerSplitContexts-DQ3rESBu.js +78 -0
  3. package/dist/GingerSplitContexts-DQ3rESBu.js.map +1 -0
  4. package/dist/GingerSplitContexts-KSB0vQ5F.cjs +2 -0
  5. package/dist/GingerSplitContexts-KSB0vQ5F.cjs.map +1 -0
  6. package/dist/analyzer/useGingerLiveAnalyzer.d.ts.map +1 -1
  7. package/dist/client.cjs +1 -1
  8. package/dist/client.js +28 -26
  9. package/dist/context/GingerProvider.d.ts +1 -1
  10. package/dist/context/GingerProvider.d.ts.map +1 -1
  11. package/dist/context/GingerSplitContexts.d.ts +22 -2
  12. package/dist/context/GingerSplitContexts.d.ts.map +1 -1
  13. package/dist/crossfade/index.cjs +1 -1
  14. package/dist/crossfade/index.cjs.map +1 -1
  15. package/dist/crossfade/index.js +116 -99
  16. package/dist/crossfade/index.js.map +1 -1
  17. package/dist/crossfade/useGingerCrossfade.d.ts.map +1 -1
  18. package/dist/equalizer/index.cjs +1 -1
  19. package/dist/equalizer/index.js +1 -1
  20. package/dist/experimental-gapless/index.cjs +1 -1
  21. package/dist/experimental-gapless/index.js +1 -1
  22. package/dist/ginger-Bzjmat52.cjs +2 -0
  23. package/dist/ginger-Bzjmat52.cjs.map +1 -0
  24. package/dist/ginger-r_BCOWSm.js +2121 -0
  25. package/dist/ginger-r_BCOWSm.js.map +1 -0
  26. package/dist/hooks/useGingerKeyboardShortcuts.d.ts.map +1 -1
  27. package/dist/hooks/useSeekDrag.d.ts.map +1 -1
  28. package/dist/index.cjs +1 -1
  29. package/dist/index.d.ts +3 -3
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +28 -26
  32. package/dist/internal/formatTime.d.ts.map +1 -1
  33. package/dist/remote/index.cjs +1 -1
  34. package/dist/remote/index.js +1 -1
  35. package/dist/spatial/index.cjs +1 -1
  36. package/dist/spatial/index.js +1 -1
  37. package/dist/store.d.ts.map +1 -1
  38. package/dist/testing/index.cjs +1 -1
  39. package/dist/testing/index.js +1 -1
  40. package/dist/transcript/index.cjs +1 -1
  41. package/dist/transcript/index.js +1 -1
  42. package/dist/types.d.ts +24 -1
  43. package/dist/types.d.ts.map +1 -1
  44. package/dist/{useGinger-4uvPoChz.cjs → useGinger-BMRLzjmr.cjs} +2 -2
  45. package/dist/{useGinger-4uvPoChz.cjs.map → useGinger-BMRLzjmr.cjs.map} +1 -1
  46. package/dist/{useGinger-Dz0cPyD1.js → useGinger-DKrHZ4NU.js} +2 -2
  47. package/dist/{useGinger-Dz0cPyD1.js.map → useGinger-DKrHZ4NU.js.map} +1 -1
  48. package/dist/useGingerChapterProgress-BgLkDm2S.cjs +2 -0
  49. package/dist/useGingerChapterProgress-BgLkDm2S.cjs.map +1 -0
  50. package/dist/useGingerChapterProgress-DIk27KzH.js +343 -0
  51. package/dist/useGingerChapterProgress-DIk27KzH.js.map +1 -0
  52. package/package.json +2 -2
  53. package/dist/GingerSplitContexts-BzBExb95.js +0 -64
  54. package/dist/GingerSplitContexts-BzBExb95.js.map +0 -1
  55. package/dist/GingerSplitContexts-C7puo0M7.cjs +0 -2
  56. package/dist/GingerSplitContexts-C7puo0M7.cjs.map +0 -1
  57. package/dist/ginger-9lWCvbHv.cjs +0 -2
  58. package/dist/ginger-9lWCvbHv.cjs.map +0 -1
  59. package/dist/ginger-XgXdGRB-.js +0 -2049
  60. package/dist/ginger-XgXdGRB-.js.map +0 -1
  61. package/dist/useGingerChapterProgress-Cqa9_CyH.cjs +0 -2
  62. package/dist/useGingerChapterProgress-Cqa9_CyH.cjs.map +0 -1
  63. package/dist/useGingerChapterProgress-DgqqoY5F.js +0 -324
  64. package/dist/useGingerChapterProgress-DgqqoY5F.js.map +0 -1
@@ -1,2 +1,2 @@
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;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),U=require("../useGinger-BMRLzjmr.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-Dz0cPyD1.js";
2
+ import { u as B } from "../useGinger-DKrHZ4NU.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;
@@ -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-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;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react"),d=require("../liveAudioGraph-0cpHD_Ic.cjs"),k=require("../useGinger-BMRLzjmr.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-Dz0cPyD1.js";
3
+ import { u as F } from "../useGinger-DKrHZ4NU.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 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,WAAW,EAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,KAAK,EACN,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,WAAW,CAAC;IAC5B,8FAA8F;IAC9F,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IACzC;;;OAGG;IACH,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAClE,mHAAmH;IACnH,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3C,iDAAiD;IACjD,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;CAC7C,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CA2C/E"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,WAAW,EAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,KAAK,EACN,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,WAAW,CAAC;IAC5B,8FAA8F;IAC9F,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IACzC;;;OAGG;IACH,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAClE,mHAAmH;IACnH,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3C,iDAAiD;IACjD,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;CAC7C,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAqD/E"}
@@ -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-9lWCvbHv.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-Bzjmat52.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-XgXdGRB-.js";
5
+ import { G as Ml } from "../ginger-r_BCOWSm.js";
6
6
  function Tc(e) {
7
7
  return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
8
8
  }
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("react"),F=require("../GingerSplitContexts-C7puo0M7.cjs");function g(n){return n.replace(/<[^>]+>/g,"").trim()}function T(n){const e=n.trim().replace(",",".").split(":");if(e.length===3){const i=Number(e[0]),t=Number(e[1]),s=Number(e[2]);return[i,t,s].every(Number.isFinite)?i*3600+t*60+s:Number.NaN}if(e.length===2){const i=Number(e[0]),t=Number(e[1]);return[i,t].every(Number.isFinite)?i*60+t:Number.NaN}return Number.NaN}function S(n){const r=n.indexOf("-->");if(r<0)return null;const e=n.slice(0,r).trim(),t=n.slice(r+3).trim().match(/^(\S+)/);return t?{start:e,end:t[1]}:null}function b(n){const r=[],e=n.replace(/\r\n/g,`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("react"),F=require("../GingerSplitContexts-KSB0vQ5F.cjs");function g(n){return n.replace(/<[^>]+>/g,"").trim()}function T(n){const e=n.trim().replace(",",".").split(":");if(e.length===3){const i=Number(e[0]),t=Number(e[1]),s=Number(e[2]);return[i,t,s].every(Number.isFinite)?i*3600+t*60+s:Number.NaN}if(e.length===2){const i=Number(e[0]),t=Number(e[1]);return[i,t].every(Number.isFinite)?i*60+t:Number.NaN}return Number.NaN}function S(n){const r=n.indexOf("-->");if(r<0)return null;const e=n.slice(0,r).trim(),t=n.slice(r+3).trim().match(/^(\S+)/);return t?{start:e,end:t[1]}:null}function b(n){const r=[],e=n.replace(/\r\n/g,`
2
2
  `).split(/\n\s*\n/);for(const i of e){const t=i.split(`
3
3
  `).map(m=>m.trim()).filter(m=>m.length>0);if(t.length===0)continue;let s=0;/^\d+$/.test(t[0])&&(s=1);const c=t[s];if(!c)continue;const o=S(c);if(!o)continue;const a=T(o.start),u=T(o.end);if(!Number.isFinite(a)||!Number.isFinite(u))continue;const l=t.slice(s+1),f=g(l.join(`
4
4
  `));f&&r.push({startTime:a,endTime:u,text:f})}return r.sort((i,t)=>i.startTime-t.startTime)}function N(n){const r=[];let e=n.replace(/\r\n/g,`
@@ -1,5 +1,5 @@
1
1
  import { useMemo as N } from "react";
2
- import { u as L } from "../GingerSplitContexts-BzBExb95.js";
2
+ import { u as L } from "../GingerSplitContexts-DQ3rESBu.js";
3
3
  function p(n) {
4
4
  return n.replace(/<[^>]+>/g, "").trim();
5
5
  }
package/dist/types.d.ts CHANGED
@@ -65,12 +65,16 @@ export type PlaylistMeta = {
65
65
  metadata?: Record<string, unknown>;
66
66
  };
67
67
  export type PlaybackUiState = "idle" | "loading" | "playing" | "paused" | "ended" | "error";
68
- export type GingerMediaSlice = {
68
+ /** High-frequency time/progress fields updated on every time tick. */
69
+ export type GingerTimeSlice = {
69
70
  currentTime: number;
70
71
  duration: number;
71
72
  bufferedFraction: number;
72
73
  isBuffering: boolean;
73
74
  errorMessage: string | null;
75
+ };
76
+ /** Low-frequency media control fields (volume, rate). */
77
+ export type GingerMediaControlSlice = {
74
78
  /** 0…1, mirrored on HTMLMediaElement.volume */
75
79
  volume: number;
76
80
  /** Mirrored on HTMLMediaElement.muted */
@@ -78,6 +82,7 @@ export type GingerMediaSlice = {
78
82
  /** Mirrored on HTMLMediaElement.playbackRate (typically 0.25–4) */
79
83
  playbackRate: number;
80
84
  };
85
+ export type GingerMediaSlice = GingerTimeSlice & GingerMediaControlSlice;
81
86
  export type GingerPlaybackSlice = {
82
87
  tracks: Track[];
83
88
  currentIndex: number;
@@ -258,6 +263,11 @@ export type GingerProviderProps = {
258
263
  mediaSession?: boolean | GingerMediaSessionOptions;
259
264
  beforePlay?: () => boolean | Promise<boolean>;
260
265
  onPlayBlocked?: () => void;
266
+ /**
267
+ * When set, automatically retries playback on transient media errors (e.g. network failures)
268
+ * using exponential backoff. Pass `true` for defaults or an object to configure.
269
+ */
270
+ retryOnError?: boolean | GingerRetryConfig;
261
271
  persistence?: GingerPersistenceAdapter;
262
272
  hydrateOnMount?: boolean;
263
273
  resumeOnTrackChange?: boolean;
@@ -298,6 +308,19 @@ export type GingerPersistenceAdapter = {
298
308
  get: (key: string) => unknown;
299
309
  set: (key: string, value: unknown) => void;
300
310
  };
311
+ export type GingerRetryConfig = {
312
+ /** Maximum number of retry attempts per track error. Default: 3. */
313
+ maxRetries?: number;
314
+ /** Initial delay in milliseconds before the first retry. Doubles on each subsequent attempt. Default: 1500. */
315
+ delayMs?: number;
316
+ /**
317
+ * Which error codes to retry. Default: `["MEDIA_ERR_NETWORK"]`.
318
+ * Non-retryable errors (e.g. `MEDIA_ERR_SRC_NOT_SUPPORTED`) skip immediately.
319
+ */
320
+ retryableErrors?: string[];
321
+ /** When true, skip to next track on unrecoverable (non-retryable) errors instead of stopping. Default: false. */
322
+ skipOnUnrecoverable?: boolean;
323
+ };
301
324
  export type DisplayBaseProps = {
302
325
  className?: string;
303
326
  style?: CSSProperties;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
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
+ "use strict";const c=require("react"),s=require("./GingerSplitContexts-KSB0vQ5F.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-BMRLzjmr.cjs.map
@@ -1 +1 @@
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
+ {"version":3,"file":"useGinger-BMRLzjmr.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,5 +1,5 @@
1
1
  import { useMemo as r } from "react";
2
- import { b as s, u as o, g as u } from "./GingerSplitContexts-BzBExb95.js";
2
+ import { c as s, u as o, g as u } from "./GingerSplitContexts-DQ3rESBu.js";
3
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();
@@ -45,4 +45,4 @@ function f() {
45
45
  export {
46
46
  f as u
47
47
  };
48
- //# sourceMappingURL=useGinger-Dz0cPyD1.js.map
48
+ //# sourceMappingURL=useGinger-DKrHZ4NU.js.map
@@ -1 +1 @@
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;"}
1
+ {"version":3,"file":"useGinger-DKrHZ4NU.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"),Y=require("./useGinger-BMRLzjmr.cjs"),V=require("./liveAudioGraph-0cpHD_Ic.cjs"),w=require("./GingerSplitContexts-KSB0vQ5F.cjs"),_=require("./selectors-CEGlYoFu.cjs"),j=require("./transitions-Dx08t68T.cjs"),F=require("./ginger-Bzjmat52.cjs"),q=new Uint8Array(0),N=new Uint8Array(0);function J(c={}){var T;const{enabled:e=!0,fftSize:n=2048,smoothingTimeConstant:s=.8,minDecibels:o=-100,maxDecibels:u=-30}=c,{audioRef:a,state:i}=Y.useGinger(),f=((T=i.tracks[i.currentIndex])==null?void 0:T.fileUrl)??"",l=t.useMemo(()=>({fftSize:n,smoothingTimeConstant:s,minDecibels:o,maxDecibels:u}),[n,s,o,u]),[m,d]=t.useState(0),[r,p]=t.useState(null),[v,k]=t.useState(!1),[R,x]=t.useState({frequencyBinCount:0,sampleRate:0}),g=t.useRef(q),S=t.useRef(N),A=t.useCallback(async()=>{const E=y.current;E&&E.state==="suspended"&&await E.resume()},[]),y=t.useRef(null),I=t.useRef(null);return t.useLayoutEffect(()=>{if(!e||typeof window>"u")return;let E=!1,P=null,D=null,C=0;const U=()=>{const h=y.current;h&&k(h.state==="suspended")};let B=0;const z=3,K=()=>{if(E)return;const h=I.current,L=g.current,M=S.current;h&&L.length>0&&M.length>0&&(h.getByteFrequencyData(L),h.getByteTimeDomainData(M),B+=1,B%z===0&&d(b=>b+1)),C=requestAnimationFrame(K)},H=()=>{const h=a.current;if(!h||E)return"no-element";try{const{id:L,context:M,analyser:b}=V.attachLiveAnalyser(h,l);P=L,D=h,y.current=M,I.current=b,k(M.state==="suspended"),p(null),M.addEventListener("statechange",U);const G=b.frequencyBinCount,X=b.fftSize;return g.current=new Uint8Array(G),S.current=new Uint8Array(X),x({frequencyBinCount:G,sampleRate:M.sampleRate}),C=requestAnimationFrame(K),"ok"}catch(L){const M=L instanceof Error?L.message:"Failed to attach live analyser";return p(M),y.current=null,I.current=null,g.current=q,S.current=N,x({frequencyBinCount:0,sampleRate:0}),"error"}},O=H();if(O!=="ok"){let h=0;const L=120;let M=0;const b=()=>{if(E)return;const G=H();G==="ok"||G==="error"||(M+=1,!(M>=L)&&(h=requestAnimationFrame(b)))};return O==="no-element"&&(h=requestAnimationFrame(b)),()=>{var G;E=!0,cancelAnimationFrame(h),cancelAnimationFrame(C),P!=null&&D&&V.detachLiveAnalyser(D,P),(G=y.current)==null||G.removeEventListener("statechange",U),y.current=null,I.current=null,g.current=q,S.current=N}}return()=>{var h;E=!0,cancelAnimationFrame(C),P!=null&&D&&V.detachLiveAnalyser(D,P),(h=y.current)==null||h.removeEventListener("statechange",U),y.current=null,I.current=null,g.current=q,S.current=N,x({frequencyBinCount:0,sampleRate:0})}},[e,a,l,f]),{frequencyData:g.current,timeDomainData:S.current,frequencyBinCount:R.frequencyBinCount,sampleRate:R.sampleRate,isSuspended:v,error:r,resume:A,frame:m}}function Q(c=!0,e={}){const{togglePlayPause:n,next:s,prev:o}=w.useGingerPlayback(),{toggleMute:u,seek:a,currentTime:i,duration:f}=w.useGingerMedia(),l=t.useRef({currentTime:0,duration:0});l.current={currentTime:i,duration:f};const{mute:m,seekForward:d,seekBackward:r}=e;t.useEffect(()=>{if(!c||typeof window>"u")return;const p=(e.playPause??" ").toLowerCase(),v=(e.next??"ArrowRight").toLowerCase(),k=(e.previous??"ArrowLeft").toLowerCase(),R=m==null?void 0:m.toLowerCase(),x=d==null?void 0:d.toLowerCase(),g=r==null?void 0:r.toLowerCase(),S=e.seekSeconds??5,A=y=>{const I=y.target;if(I&&(["INPUT","TEXTAREA","SELECT"].includes(I.tagName)||I.isContentEditable))return;const T=y.key.toLowerCase();if(T===p)y.preventDefault(),n();else if(T===v)y.preventDefault(),s();else if(T===k)y.preventDefault(),o();else if(R&&T===R)y.preventDefault(),u();else if(x&&T===x){y.preventDefault();const{currentTime:E,duration:P}=l.current,D=P>0?P:Number.POSITIVE_INFINITY;a(Math.min(D,E+S))}else g&&T===g&&(y.preventDefault(),a(Math.max(0,l.current.currentTime-S)))};return window.addEventListener("keydown",A),()=>window.removeEventListener("keydown",A)},[e.next,e.playPause,e.previous,e.seekSeconds,c,m,s,o,a,r,d,u,n])}function W(c){const{durationMs:e,stopAfterTracks:n,respectPause:s=!0,enabled:o=!0,onFire:u}=c,{currentIndex:a,pause:i,isPaused:f}=w.useGingerPlayback(),l=t.useRef(n??0),m=t.useRef(a),d=t.useRef(e??0),r=t.useRef(null);t.useEffect(()=>{l.current=n??0},[n]);const p=t.useRef(e);t.useEffect(()=>{p.current!==e&&(d.current=e??0,p.current=e)},[e]),t.useEffect(()=>{if(!o||!e||e<=0){d.current=e??0,r.current=null;return}if(s&&f){if(r.current!==null){const k=Date.now()-r.current;d.current=Math.max(0,d.current-k),r.current=null}return}r.current=Date.now();const v=setTimeout(()=>{d.current=0,r.current=null,i(),u==null||u()},d.current);return()=>{if(clearTimeout(v),r.current!==null){const k=Date.now()-r.current;d.current=Math.max(0,d.current-k),r.current=null}}},[e,o,f,u,i,s]),t.useEffect(()=>{if(!o||!n||n<=0)return;const v=m.current;m.current=a,a!==v&&(l.current-=1,l.current<=0&&(i(),u==null||u()))},[a,o,u,i,n])}function Z(c=!1){const e=w.useGingerState(),n=t.useRef(e);t.useEffect(()=>{if(!c||typeof console>"u")return;const s=n.current;s!==e&&console.debug("[ginger]",{from:{currentIndex:s.currentIndex,isPaused:s.isPaused,currentTime:s.currentTime,repeatMode:s.repeatMode},to:{currentIndex:e.currentIndex,isPaused:e.isPaused,currentTime:e.currentTime,repeatMode:e.repeatMode}}),n.current=e},[c,e])}function $(c){return Math.max(0,Math.min(1,c))}function ee(c){const e=w.useGingerMedia(),n=w.useGingerPlayback(),{seek:s}=e,[o,u]=t.useState(0),[a,i]=t.useState(!1),f=t.useRef(null),l=_.progressFraction(w.gingerStateFromContextValues(n,e)),m=a?o:l;t.useEffect(()=>()=>{const r=f.current;if(r){r.target.removeEventListener("pointermove",r.onMove),r.target.removeEventListener("pointerup",r.onUp),r.target.removeEventListener("pointercancel",r.onUp);try{r.target.releasePointerCapture(r.pointerId)}catch{}f.current=null}},[]);const d=t.useCallback(r=>{if(!(c>0))return;const p=r.currentTarget,v=p.getBoundingClientRect(),k=g=>{const S=$((g-v.left)/v.width);u(S),s(S*c)};i(!0),p.setPointerCapture(r.pointerId),k(r.clientX);const R=g=>k(g.clientX),x=g=>{k(g.clientX),i(!1),p.releasePointerCapture(r.pointerId),p.removeEventListener("pointermove",R),p.removeEventListener("pointerup",x),p.removeEventListener("pointercancel",x),f.current=null};f.current={target:p,pointerId:r.pointerId,onMove:R,onUp:x},p.addEventListener("pointermove",R),p.addEventListener("pointerup",x),p.addEventListener("pointercancel",x)},[c,s]);return{fraction:o,displayFraction:m,isDragging:a,onPointerDown:d}}function te(c={}){const{enabled:e=!0,crossOrigin:n}=c,{tracks:s,currentIndex:o,repeatMode:u,playbackMode:a}=w.useGingerPlayback();t.useEffect(()=>{var m;if(!e||typeof document>"u")return;const i=j.computeNextIndex({tracks:s,currentIndex:o,repeatMode:u,playbackMode:a});if(i===o)return;const f=((m=s[i])==null?void 0:m.fileUrl)??"";if(!f)return;const l=document.createElement("audio");return l.preload="auto",n&&(l.crossOrigin=n),l.src=f,l.load(),()=>{l.removeAttribute("src"),l.load()}},[e,n,s,o,u,a])}function re(c={}){let e=F.createInitialState({tracks:c.tracks??[],currentIndex:c.currentIndex,playlistMeta:c.playlistMeta,isPaused:c.isPaused,isShuffled:c.isShuffled,repeatMode:c.repeatMode,playbackMode:c.playbackMode,volume:c.volume,muted:c.muted,playbackRate:c.playbackRate});const n=new Set,s=a=>{var f,l;const i=F.gingerReducer(e,a);if(i!==e){e=i;for(const m of n)try{m(e)}catch(d){typeof globalThis<"u"&&((l=(f=globalThis.process)==null?void 0:f.env)==null?void 0:l.NODE_ENV)!=="production"&&console.error("[@lucaismyname/ginger] Store listener threw:",d)}}};return{getState:()=>e,dispatch:s,subscribe:a=>(n.add(a),()=>n.delete(a)),init:a=>{s({type:"INIT",payload:a})},clampVolume:F.clampVolume,clampPlaybackRate:F.clampPlaybackRate}}function ne(c={}){const{maxLength:e=50}=c,{tracks:n,currentIndex:s}=w.useGingerPlayback(),[o,u]=t.useState([]),a=t.useRef(null),i=t.useRef(n);i.current=n,t.useEffect(()=>{const l=n[s];if(!l||a.current===s)return;a.current=s;const m={track:l,index:s,playedAt:Date.now()};u(d=>{const r=[...d,m];return r.length>e?r.slice(r.length-e):r})},[s,n,e]);const f=t.useCallback(()=>u([]),[]);return{history:o,clearHistory:f}}function se(){const{setVolume:c,volume:e}=w.useGingerMedia(),[n,s]=t.useState(!1),o=t.useRef(0),u=t.useRef(!1),a=t.useCallback(()=>{cancelAnimationFrame(o.current),u.current=!0,s(!1)},[]);return{fadeVolumeTo:t.useCallback(({targetVolume:f,durationMs:l,onComplete:m})=>{cancelAnimationFrame(o.current),u.current=!1;const d=R=>Math.min(1,Math.max(0,R)),r=d(f),p=performance.now();let v=e;s(!0);const k=R=>{if(u.current)return;const x=R-p,g=Math.min(1,x/Math.max(1,l)),S=v+(r-v)*g;c(d(S)),g<1?o.current=requestAnimationFrame(k):(s(!1),m==null||m())};o.current=requestAnimationFrame(R=>{v=e,k(R)})},[c,e]),cancelFade:a,isFading:n}}function ce(){const{tracks:c,currentIndex:e}=w.useGingerPlayback(),{currentTime:n,duration:s}=w.useGingerMedia(),o=t.useMemo(()=>{var a;return[...((a=c[e])==null?void 0:a.chapters)??[]].filter(i=>i&&Number.isFinite(i.startSeconds)&&i.startSeconds>=0).sort((i,f)=>i.startSeconds-f.startSeconds)},[c,e]);return t.useMemo(()=>{if(o.length===0)return{progress:0,elapsed:0,remaining:0};let u=-1;for(let p=o.length-1;p>=0;p--)if(n>=o[p].startSeconds){u=p;break}if(u===-1)return{progress:0,elapsed:0,remaining:0};const a=o[u],i=o[u+1],f=(i==null?void 0:i.startSeconds)??(s>0?s:n),l=Math.max(0,f-a.startSeconds),m=Math.max(0,n-a.startSeconds),d=Math.max(0,f-n);return{progress:l>0?Math.min(1,m/l):0,elapsed:m,remaining:d}},[o,n,s])}exports.createGingerStore=re;exports.useGingerChapterProgress=ce;exports.useGingerDebugLog=Z;exports.useGingerKeyboardShortcuts=Q;exports.useGingerLiveAnalyzer=J;exports.useGingerPlaybackHistory=ne;exports.useGingerSleepTimer=W;exports.useGingerVolumeFade=se;exports.useNextTrackPrefetch=te;exports.useSeekDrag=ee;
2
+ //# sourceMappingURL=useGingerChapterProgress-BgLkDm2S.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGingerChapterProgress-BgLkDm2S.cjs","sources":["../src/analyzer/useGingerLiveAnalyzer.ts","../src/hooks/useGingerKeyboardShortcuts.ts","../src/hooks/useGingerSleepTimer.ts","../src/hooks/useGingerDebugLog.ts","../src/hooks/useSeekDrag.ts","../src/hooks/useNextTrackPrefetch.ts","../src/store.ts","../src/hooks/useGingerPlaybackHistory.ts","../src/hooks/useGingerVolumeFade.ts","../src/hooks/useGingerChapterProgress.ts"],"sourcesContent":["import { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { useGinger } from \"../hooks/useGinger\";\nimport { type LiveAnalyserOptions, attachLiveAnalyser, detachLiveAnalyser } from \"./liveAudioGraph\";\n\nexport type UseGingerLiveAnalyzerOptions = {\n /** When false, the analyser is detached and no frames are read. Default true. */\n enabled?: boolean;\n fftSize?: number;\n smoothingTimeConstant?: number;\n minDecibels?: number;\n maxDecibels?: number;\n};\n\nexport type UseGingerLiveAnalyzerResult = {\n /** Byte frequency data (0–255); length equals `frequencyBinCount`. Updated each animation frame while enabled. */\n frequencyData: Uint8Array;\n /** Byte time-domain data (0–255); length equals `fftSize`. */\n timeDomainData: Uint8Array;\n frequencyBinCount: number;\n sampleRate: number;\n isSuspended: boolean;\n error: string | null;\n resume: () => Promise<void>;\n /**\n * Monotonically increasing counter incremented each animation frame.\n * Use as a `useMemo` / `useEffect` dependency to respond to new audio data, since\n * `frequencyData` and `timeDomainData` are mutated in-place (their reference never changes).\n */\n frame: number;\n};\n\nconst emptyFreq = new Uint8Array(0);\nconst emptyTime = new Uint8Array(0);\n\nexport function useGingerLiveAnalyzer(\n options: UseGingerLiveAnalyzerOptions = {},\n): UseGingerLiveAnalyzerResult {\n const {\n enabled = true,\n fftSize = 2048,\n smoothingTimeConstant = 0.8,\n minDecibels = -100,\n maxDecibels = -30,\n } = options;\n\n const { audioRef, state } = useGinger();\n const activeUrl = state.tracks[state.currentIndex]?.fileUrl ?? \"\";\n const opts = useMemo<LiveAnalyserOptions>(\n () => ({\n fftSize,\n smoothingTimeConstant,\n minDecibels,\n maxDecibels,\n }),\n [fftSize, smoothingTimeConstant, minDecibels, maxDecibels],\n );\n\n const [frame, setFrame] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const [isSuspended, setIsSuspended] = useState(false);\n const [meta, setMeta] = useState({ frequencyBinCount: 0, sampleRate: 0 });\n\n const freqRef = useRef<Uint8Array>(emptyFreq);\n const timeRef = useRef<Uint8Array>(emptyTime);\n\n const resume = useCallback(async () => {\n const ctx = contextHolderRef.current;\n if (ctx && ctx.state === \"suspended\") {\n await ctx.resume();\n }\n }, []);\n\n const contextHolderRef = useRef<AudioContext | null>(null);\n const analyserHolderRef = useRef<AnalyserNode | null>(null);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-attach when `activeUrl` changes (same `audioRef`, new `<audio>` source).\n useLayoutEffect(() => {\n if (!enabled || typeof window === \"undefined\") {\n return;\n }\n\n let cancelled = false;\n let consumerId: number | null = null;\n let element: HTMLAudioElement | null = null;\n let rafId = 0;\n\n const onStateChange = () => {\n const ctx = contextHolderRef.current;\n if (ctx) setIsSuspended(ctx.state === \"suspended\");\n };\n\n let frameCounter = 0;\n const NOTIFY_EVERY = 3;\n const runLoop = () => {\n if (cancelled) return;\n const a = analyserHolderRef.current;\n const fq = freqRef.current;\n const td = timeRef.current;\n if (a && fq.length > 0 && td.length > 0) {\n a.getByteFrequencyData(fq as Uint8Array<ArrayBuffer>);\n a.getByteTimeDomainData(td as Uint8Array<ArrayBuffer>);\n frameCounter += 1;\n if (frameCounter % NOTIFY_EVERY === 0) {\n setFrame((n) => n + 1);\n }\n }\n rafId = requestAnimationFrame(runLoop);\n };\n\n type AttachOutcome = \"ok\" | \"no-element\" | \"error\";\n\n const attach = (): AttachOutcome => {\n const el = audioRef.current;\n if (!el || cancelled) return \"no-element\";\n try {\n const { id, context, analyser } = attachLiveAnalyser(el, opts);\n consumerId = id;\n element = el;\n contextHolderRef.current = context;\n analyserHolderRef.current = analyser;\n setIsSuspended(context.state === \"suspended\");\n setError(null);\n\n context.addEventListener(\"statechange\", onStateChange);\n\n const n = analyser.frequencyBinCount;\n const fft = analyser.fftSize;\n freqRef.current = new Uint8Array(n);\n timeRef.current = new Uint8Array(fft);\n setMeta({ frequencyBinCount: n, sampleRate: context.sampleRate });\n\n rafId = requestAnimationFrame(runLoop);\n return \"ok\";\n } catch (e) {\n const msg = e instanceof Error ? e.message : \"Failed to attach live analyser\";\n setError(msg);\n contextHolderRef.current = null;\n analyserHolderRef.current = null;\n freqRef.current = emptyFreq;\n timeRef.current = emptyTime;\n setMeta({ frequencyBinCount: 0, sampleRate: 0 });\n return \"error\";\n }\n };\n\n const first = attach();\n if (first !== \"ok\") {\n let retryRaf = 0;\n const maxAttempts = 120;\n let attempts = 0;\n\n const retryLoop = () => {\n if (cancelled) return;\n const out = attach();\n if (out === \"ok\" || out === \"error\") return;\n attempts += 1;\n if (attempts >= maxAttempts) return;\n retryRaf = requestAnimationFrame(retryLoop);\n };\n\n if (first === \"no-element\") {\n retryRaf = requestAnimationFrame(retryLoop);\n }\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(retryRaf);\n cancelAnimationFrame(rafId);\n if (consumerId != null && element) {\n detachLiveAnalyser(element, consumerId);\n }\n contextHolderRef.current?.removeEventListener(\"statechange\", onStateChange);\n contextHolderRef.current = null;\n analyserHolderRef.current = null;\n freqRef.current = emptyFreq;\n timeRef.current = emptyTime;\n };\n }\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(rafId);\n if (consumerId != null && element) {\n detachLiveAnalyser(element, consumerId);\n }\n contextHolderRef.current?.removeEventListener(\"statechange\", onStateChange);\n contextHolderRef.current = null;\n analyserHolderRef.current = null;\n freqRef.current = emptyFreq;\n timeRef.current = emptyTime;\n setMeta({ frequencyBinCount: 0, sampleRate: 0 });\n };\n }, [enabled, audioRef, opts, activeUrl]);\n\n return {\n frequencyData: freqRef.current,\n timeDomainData: timeRef.current,\n frequencyBinCount: meta.frequencyBinCount,\n sampleRate: meta.sampleRate,\n isSuspended,\n error,\n resume,\n frame,\n };\n}\n","import { useEffect, useRef } from \"react\";\nimport { useGingerMedia, useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type GingerKeyboardShortcutBindings = {\n playPause?: string;\n next?: string;\n previous?: string;\n mute?: string;\n /** Key to seek forward by `seekSeconds`. Default: undefined (disabled). */\n seekForward?: string;\n /** Key to seek backward by `seekSeconds`. Default: undefined (disabled). */\n seekBackward?: string;\n /** Seconds to seek per `seekForward` / `seekBackward` keypress. Default: 5. */\n seekSeconds?: number;\n};\n\nexport function useGingerKeyboardShortcuts(\n enabled = true,\n bindings: GingerKeyboardShortcutBindings = {},\n): void {\n const { togglePlayPause, next, prev } = useGingerPlayback();\n const { toggleMute, seek, currentTime, duration } = useGingerMedia();\n\n const mediaRef = useRef({ currentTime: 0, duration: 0 });\n mediaRef.current = { currentTime, duration };\n\n const {\n mute: muteBinding,\n seekForward: seekForwardBinding,\n seekBackward: seekBackwardBinding,\n } = bindings;\n\n useEffect(() => {\n if (!enabled || typeof window === \"undefined\") return;\n const playPause = (bindings.playPause ?? \" \").toLowerCase();\n const nextKey = (bindings.next ?? \"ArrowRight\").toLowerCase();\n const prevKey = (bindings.previous ?? \"ArrowLeft\").toLowerCase();\n const muteKey = muteBinding?.toLowerCase();\n const seekFwdKey = seekForwardBinding?.toLowerCase();\n const seekBwdKey = seekBackwardBinding?.toLowerCase();\n const seekSecs = bindings.seekSeconds ?? 5;\n\n const onKeyDown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n if (\n target &&\n ([\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(target.tagName) || target.isContentEditable)\n )\n return;\n const key = event.key.toLowerCase();\n if (key === playPause) {\n event.preventDefault();\n togglePlayPause();\n } else if (key === nextKey) {\n event.preventDefault();\n next();\n } else if (key === prevKey) {\n event.preventDefault();\n prev();\n } else if (muteKey && key === muteKey) {\n event.preventDefault();\n toggleMute();\n } else if (seekFwdKey && key === seekFwdKey) {\n event.preventDefault();\n const { currentTime: ct, duration: dur } = mediaRef.current;\n const cap = dur > 0 ? dur : Number.POSITIVE_INFINITY;\n seek(Math.min(cap, ct + seekSecs));\n } else if (seekBwdKey && key === seekBwdKey) {\n event.preventDefault();\n seek(Math.max(0, mediaRef.current.currentTime - seekSecs));\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [\n bindings.next,\n bindings.playPause,\n bindings.previous,\n bindings.seekSeconds,\n enabled,\n muteBinding,\n next,\n prev,\n seek,\n seekBackwardBinding,\n seekForwardBinding,\n toggleMute,\n togglePlayPause,\n ]);\n}\n","import { useEffect, useRef } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type GingerSleepTimerOptions = {\n durationMs?: number;\n stopAfterTracks?: number;\n respectPause?: boolean;\n enabled?: boolean;\n onFire?: () => void;\n};\n\nexport function useGingerSleepTimer(options: GingerSleepTimerOptions): void {\n const { durationMs, stopAfterTracks, respectPause = true, enabled = true, onFire } = options;\n const { currentIndex, pause, isPaused } = useGingerPlayback();\n const remainingTracksRef = useRef(stopAfterTracks ?? 0);\n const prevIndexRef = useRef(currentIndex);\n\n // Remaining milliseconds for the duration-based timer; carried across pause/resume cycles.\n const remainingMsRef = useRef(durationMs ?? 0);\n // Timestamp when the current timer segment started (set when playback resumes).\n const segmentStartRef = useRef<number | null>(null);\n\n useEffect(() => {\n remainingTracksRef.current = stopAfterTracks ?? 0;\n }, [stopAfterTracks]);\n\n // Keep remainingMsRef in sync when durationMs changes while the timer is inactive.\n const prevDurationMsRef = useRef(durationMs);\n useEffect(() => {\n if (prevDurationMsRef.current !== durationMs) {\n remainingMsRef.current = durationMs ?? 0;\n prevDurationMsRef.current = durationMs;\n }\n }, [durationMs]);\n\n useEffect(() => {\n if (!enabled || !durationMs || durationMs <= 0) {\n // Reset remaining when disabled or no duration\n remainingMsRef.current = durationMs ?? 0;\n segmentStartRef.current = null;\n return;\n }\n\n if (respectPause && isPaused) {\n // Snapshot how much time is left before pausing\n if (segmentStartRef.current !== null) {\n const elapsed = Date.now() - segmentStartRef.current;\n remainingMsRef.current = Math.max(0, remainingMsRef.current - elapsed);\n segmentStartRef.current = null;\n }\n return;\n }\n\n // Playing: start (or continue) the countdown from remainingMsRef\n segmentStartRef.current = Date.now();\n const id = setTimeout(() => {\n remainingMsRef.current = 0;\n segmentStartRef.current = null;\n pause();\n onFire?.();\n }, remainingMsRef.current);\n\n return () => {\n clearTimeout(id);\n // Snapshot remaining when effect cleans up (e.g. isPaused or deps changed)\n if (segmentStartRef.current !== null) {\n const elapsed = Date.now() - segmentStartRef.current;\n remainingMsRef.current = Math.max(0, remainingMsRef.current - elapsed);\n segmentStartRef.current = null;\n }\n };\n }, [durationMs, enabled, isPaused, onFire, pause, respectPause]);\n\n useEffect(() => {\n if (!enabled || !stopAfterTracks || stopAfterTracks <= 0) return;\n const prev = prevIndexRef.current;\n prevIndexRef.current = currentIndex;\n if (currentIndex === prev) return;\n remainingTracksRef.current -= 1;\n if (remainingTracksRef.current <= 0) {\n pause();\n onFire?.();\n }\n }, [currentIndex, enabled, onFire, pause, stopAfterTracks]);\n}\n","import { useEffect, useRef } from \"react\";\nimport { useGingerState } from \"../context/GingerSplitContexts\";\n\nexport function useGingerDebugLog(enabled = false): void {\n const state = useGingerState();\n const prevRef = useRef(state);\n\n useEffect(() => {\n if (!enabled || typeof console === \"undefined\") return;\n const prev = prevRef.current;\n if (prev !== state) {\n console.debug(\"[ginger]\", {\n from: {\n currentIndex: prev.currentIndex,\n isPaused: prev.isPaused,\n currentTime: prev.currentTime,\n repeatMode: prev.repeatMode,\n },\n to: {\n currentIndex: state.currentIndex,\n isPaused: state.isPaused,\n currentTime: state.currentTime,\n repeatMode: state.repeatMode,\n },\n });\n }\n prevRef.current = state;\n }, [enabled, state]);\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport {\n gingerStateFromContextValues,\n useGingerMedia,\n useGingerPlayback,\n} from \"../context/GingerSplitContexts\";\nimport { progressFraction } from \"../internal/selectors\";\n\nexport type SeekDragState = {\n /** Raw drag fraction — only updated during an active drag gesture. */\n fraction: number;\n /** Blended fraction: follows live playback when idle, drag position when dragging. */\n displayFraction: number;\n isDragging: boolean;\n onPointerDown: (event: ReactPointerEvent<HTMLElement>) => void;\n};\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\ntype ActiveDrag = {\n target: HTMLElement;\n pointerId: number;\n onMove: (e: PointerEvent) => void;\n onUp: (e: PointerEvent) => void;\n};\n\nexport function useSeekDrag(duration: number): SeekDragState {\n const media = useGingerMedia();\n const playback = useGingerPlayback();\n const { seek } = media;\n const [fraction, setFraction] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const activeDragRef = useRef<ActiveDrag | null>(null);\n\n const liveFraction = progressFraction(gingerStateFromContextValues(playback, media));\n const displayFraction = isDragging ? fraction : liveFraction;\n\n useEffect(() => {\n return () => {\n const drag = activeDragRef.current;\n if (!drag) return;\n drag.target.removeEventListener(\"pointermove\", drag.onMove);\n drag.target.removeEventListener(\"pointerup\", drag.onUp);\n drag.target.removeEventListener(\"pointercancel\", drag.onUp);\n try {\n drag.target.releasePointerCapture(drag.pointerId);\n } catch {\n /* already released */\n }\n activeDragRef.current = null;\n };\n }, []);\n\n const onPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n if (!(duration > 0)) return;\n const target = event.currentTarget;\n const rect = target.getBoundingClientRect();\n const update = (clientX: number) => {\n const ratio = clamp01((clientX - rect.left) / rect.width);\n setFraction(ratio);\n seek(ratio * duration);\n };\n setIsDragging(true);\n target.setPointerCapture(event.pointerId);\n update(event.clientX);\n const onMove = (moveEvent: PointerEvent) => update(moveEvent.clientX);\n const onUp = (upEvent: PointerEvent) => {\n update(upEvent.clientX);\n setIsDragging(false);\n target.releasePointerCapture(event.pointerId);\n target.removeEventListener(\"pointermove\", onMove);\n target.removeEventListener(\"pointerup\", onUp);\n target.removeEventListener(\"pointercancel\", onUp);\n activeDragRef.current = null;\n };\n activeDragRef.current = { target, pointerId: event.pointerId, onMove, onUp };\n target.addEventListener(\"pointermove\", onMove);\n target.addEventListener(\"pointerup\", onUp);\n target.addEventListener(\"pointercancel\", onUp);\n },\n [duration, seek],\n );\n\n return { fraction, displayFraction, isDragging, onPointerDown };\n}\n","import { useEffect } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\nimport { computeNextIndex } from \"../core/transitions\";\n\nexport type UseNextTrackPrefetchOptions = {\n /** When false, no prefetch runs. Default true. */\n enabled?: boolean;\n /**\n * Match `crossOrigin` on `Ginger.Player` when `fileUrl` is cross-origin so the browser\n * can reuse cached media consistently.\n */\n crossOrigin?: \"\" | \"anonymous\" | \"use-credentials\" | undefined;\n};\n\n/**\n * Warms the browser cache for the **logical** next track (same rules as the Next control:\n * `computeNextIndex` from queue, repeat, and playback mode) using a detached `HTMLAudioElement`\n * with `preload=\"auto\"`. Safe to call alongside `Ginger.Player`; it does not replace main playback.\n *\n * The effect depends on the `tracks` array reference from context. If the parent recreates `tracks`\n * every render, prefetch will restart repeatedly; keep a stable queue reference (e.g. memoize) when possible.\n */\nexport function useNextTrackPrefetch(options: UseNextTrackPrefetchOptions = {}): void {\n const { enabled = true, crossOrigin } = options;\n const { tracks, currentIndex, repeatMode, playbackMode } = useGingerPlayback();\n\n useEffect(() => {\n if (!enabled || typeof document === \"undefined\") return;\n const nextIndex = computeNextIndex({ tracks, currentIndex, repeatMode, playbackMode });\n if (nextIndex === currentIndex) return;\n const nextUrl = tracks[nextIndex]?.fileUrl ?? \"\";\n if (!nextUrl) return;\n\n const audio = document.createElement(\"audio\");\n audio.preload = \"auto\";\n if (crossOrigin) audio.crossOrigin = crossOrigin;\n audio.src = nextUrl;\n audio.load();\n\n return () => {\n audio.removeAttribute(\"src\");\n audio.load();\n };\n }, [enabled, crossOrigin, tracks, currentIndex, repeatMode, playbackMode]);\n}\n","import {\n clampPlaybackRate,\n clampVolume,\n createInitialState,\n gingerReducer,\n} from \"./core/playbackReducer\";\nimport type {\n GingerAction,\n GingerInitPayload,\n GingerState,\n PlaylistMeta,\n RepeatMode,\n Track,\n} from \"./types\";\n\nexport type GingerStoreOptions = {\n tracks?: Track[];\n currentIndex?: number;\n playlistMeta?: PlaylistMeta | null;\n isPaused?: boolean;\n isShuffled?: boolean;\n repeatMode?: RepeatMode;\n playbackMode?: GingerState[\"playbackMode\"];\n volume?: number;\n muted?: boolean;\n playbackRate?: number;\n};\n\nexport type GingerStore = {\n /** Returns the current state snapshot. */\n getState: () => GingerState;\n /** Dispatch an action to update state. Synchronously updates state and notifies listeners. */\n dispatch: (action: GingerAction) => void;\n /**\n * Subscribe to state changes. The listener is called after every `dispatch` that produces\n * a new state object. Returns an unsubscribe function.\n */\n subscribe: (listener: (state: GingerState) => void) => () => void;\n /** Convenience: re-initialise with a new set of init options (equivalent to `dispatch({ type: \"INIT\", ... })`). */\n init: (payload: GingerInitPayload) => void;\n /** Clamp helpers re-exported for convenience. */\n clampVolume: typeof clampVolume;\n clampPlaybackRate: typeof clampPlaybackRate;\n};\n\n/**\n * Framework-agnostic store wrapping `gingerReducer`.\n * Usable outside React — e.g. in Svelte, Vue, Node.js testing, or server-side rendering contexts.\n *\n * @example\n * ```ts\n * import { createGingerStore } from \"@lucaismyname/ginger\";\n *\n * const store = createGingerStore({ tracks: myTracks });\n * const unsub = store.subscribe((state) => console.log(state.currentIndex));\n * store.dispatch({ type: \"NEXT\" });\n * unsub();\n * ```\n */\nexport function createGingerStore(options: GingerStoreOptions = {}): GingerStore {\n let state = createInitialState({\n tracks: options.tracks ?? [],\n currentIndex: options.currentIndex,\n playlistMeta: options.playlistMeta,\n isPaused: options.isPaused,\n isShuffled: options.isShuffled,\n repeatMode: options.repeatMode,\n playbackMode: options.playbackMode,\n volume: options.volume,\n muted: options.muted,\n playbackRate: options.playbackRate,\n });\n\n const listeners = new Set<(state: GingerState) => void>();\n\n const dispatch = (action: GingerAction): void => {\n const next = gingerReducer(state, action);\n if (next !== state) {\n state = next;\n for (const listener of listeners) {\n try {\n listener(state);\n } catch (e) {\n if (\n typeof globalThis !== \"undefined\" &&\n (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV !==\n \"production\"\n ) {\n console.error(\"[@lucaismyname/ginger] Store listener threw:\", e);\n }\n }\n }\n }\n };\n\n const subscribe = (listener: (state: GingerState) => void): (() => void) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n\n const init = (payload: GingerInitPayload): void => {\n dispatch({ type: \"INIT\", payload });\n };\n\n return {\n getState: () => state,\n dispatch,\n subscribe,\n init,\n clampVolume,\n clampPlaybackRate,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\nimport type { Track } from \"../types\";\n\nexport type GingerPlaybackHistoryEntry = {\n track: Track;\n /** The track's index in the queue at the time it was played. */\n index: number;\n /** Unix timestamp (ms) when the track started playing. */\n playedAt: number;\n};\n\nexport type UseGingerPlaybackHistoryOptions = {\n /** Maximum number of entries to keep. Oldest entries are dropped first. Default: 50. */\n maxLength?: number;\n};\n\nexport type UseGingerPlaybackHistoryResult = {\n /** Chronological list of played tracks; most recent entry is last. */\n history: GingerPlaybackHistoryEntry[];\n clearHistory: () => void;\n};\n\n/**\n * Records a history of played tracks in chronological order.\n * Useful for \"what was playing before\" in shuffle mode or for analytics.\n *\n * The history is stored in component state and does not survive remounts.\n * In shuffle mode, `index` reflects the position in the current shuffled queue.\n */\nexport function useGingerPlaybackHistory(\n options: UseGingerPlaybackHistoryOptions = {},\n): UseGingerPlaybackHistoryResult {\n const { maxLength = 50 } = options;\n const { tracks, currentIndex } = useGingerPlayback();\n\n const [history, setHistory] = useState<GingerPlaybackHistoryEntry[]>([]);\n const prevIndexRef = useRef<number | null>(null);\n const prevTracksRef = useRef(tracks);\n prevTracksRef.current = tracks;\n\n useEffect(() => {\n const track = tracks[currentIndex];\n if (!track) return;\n\n if (prevIndexRef.current === currentIndex) return;\n prevIndexRef.current = currentIndex;\n\n const entry: GingerPlaybackHistoryEntry = {\n track,\n index: currentIndex,\n playedAt: Date.now(),\n };\n\n setHistory((prev) => {\n const next = [...prev, entry];\n return next.length > maxLength ? next.slice(next.length - maxLength) : next;\n });\n }, [currentIndex, tracks, maxLength]);\n\n const clearHistory = useCallback(() => setHistory([]), []);\n\n return { history, clearHistory };\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport { useGingerMedia } from \"../context/GingerSplitContexts\";\n\nexport type UseGingerVolumeFadeOptions = {\n /** Target volume to fade to (0–1). */\n targetVolume: number;\n /** Duration of the fade in milliseconds. */\n durationMs: number;\n /** Called when the fade completes normally (not when cancelled). */\n onComplete?: () => void;\n};\n\nexport type UseGingerVolumeFadeResult = {\n /** Start a volume fade. Cancels any in-progress fade. */\n fadeVolumeTo: (options: UseGingerVolumeFadeOptions) => void;\n /** Cancel the current fade and hold at the current volume. */\n cancelFade: () => void;\n /** True while a fade is in progress. */\n isFading: boolean;\n};\n\n/**\n * Smoothly interpolates volume over a given duration using `requestAnimationFrame`.\n * Useful for fade-in on track start, fade-out before sleep timer fires, or crossfade prep.\n */\nexport function useGingerVolumeFade(): UseGingerVolumeFadeResult {\n const { setVolume, volume } = useGingerMedia();\n const [isFading, setIsFading] = useState(false);\n\n const rafRef = useRef<number>(0);\n const cancelledRef = useRef(false);\n\n const cancelFade = useCallback(() => {\n cancelAnimationFrame(rafRef.current);\n cancelledRef.current = true;\n setIsFading(false);\n }, []);\n\n const fadeVolumeTo = useCallback(\n ({ targetVolume, durationMs, onComplete }: UseGingerVolumeFadeOptions) => {\n cancelAnimationFrame(rafRef.current);\n cancelledRef.current = false;\n\n const clamp = (v: number) => Math.min(1, Math.max(0, v));\n const target = clamp(targetVolume);\n const startTime = performance.now();\n\n // Capture start volume at the moment the fade begins\n let startVolume = volume;\n\n setIsFading(true);\n\n const tick = (now: number) => {\n if (cancelledRef.current) return;\n const elapsed = now - startTime;\n const progress = Math.min(1, elapsed / Math.max(1, durationMs));\n const current = startVolume + (target - startVolume) * progress;\n setVolume(clamp(current));\n\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(tick);\n } else {\n setIsFading(false);\n onComplete?.();\n }\n };\n\n // Use a small delay so `volume` from closure is the current value\n rafRef.current = requestAnimationFrame((now) => {\n startVolume = volume;\n tick(now);\n });\n },\n [setVolume, volume],\n );\n\n return { fadeVolumeTo, cancelFade, isFading };\n}\n","import { useMemo } from \"react\";\nimport { useGingerMedia, useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type GingerChapterProgress = {\n /** Fraction (0–1) of the way through the active chapter. 0 when no chapter is active. */\n progress: number;\n /** Seconds elapsed since the start of the active chapter. */\n elapsed: number;\n /** Seconds remaining until the end of the active chapter (or until end of track if last chapter). */\n remaining: number;\n};\n\n/**\n * Returns detailed progress information for the currently active chapter.\n * Complements `useGingerChapters` with per-chapter playback fractions.\n */\nexport function useGingerChapterProgress(): GingerChapterProgress {\n const { tracks, currentIndex } = useGingerPlayback();\n const { currentTime, duration } = useGingerMedia();\n\n const chapters = useMemo(() => {\n const raw = tracks[currentIndex]?.chapters ?? [];\n return [...raw]\n .filter((c) => c && Number.isFinite(c.startSeconds) && c.startSeconds >= 0)\n .sort((a, b) => a.startSeconds - b.startSeconds);\n }, [tracks, currentIndex]);\n\n return useMemo<GingerChapterProgress>(() => {\n if (chapters.length === 0) return { progress: 0, elapsed: 0, remaining: 0 };\n\n // Find active chapter (last one whose start is <= currentTime)\n let activeIdx = -1;\n for (let i = chapters.length - 1; i >= 0; i--) {\n if (currentTime >= chapters[i]!.startSeconds) {\n activeIdx = i;\n break;\n }\n }\n\n if (activeIdx === -1) return { progress: 0, elapsed: 0, remaining: 0 };\n\n const chapter = chapters[activeIdx]!;\n const nextChapter = chapters[activeIdx + 1];\n const chapterEnd = nextChapter?.startSeconds ?? (duration > 0 ? duration : currentTime);\n const chapterDuration = Math.max(0, chapterEnd - chapter.startSeconds);\n const elapsed = Math.max(0, currentTime - chapter.startSeconds);\n const remaining = Math.max(0, chapterEnd - currentTime);\n const progress = chapterDuration > 0 ? Math.min(1, elapsed / chapterDuration) : 0;\n\n return { progress, elapsed, remaining };\n }, [chapters, currentTime, duration]);\n}\n"],"names":["emptyFreq","emptyTime","useGingerLiveAnalyzer","options","enabled","fftSize","smoothingTimeConstant","minDecibels","maxDecibels","audioRef","state","useGinger","activeUrl","_a","opts","useMemo","frame","setFrame","useState","error","setError","isSuspended","setIsSuspended","meta","setMeta","freqRef","useRef","timeRef","resume","useCallback","ctx","contextHolderRef","analyserHolderRef","useLayoutEffect","cancelled","consumerId","element","rafId","onStateChange","frameCounter","NOTIFY_EVERY","runLoop","a","fq","td","n","attach","el","id","context","analyser","attachLiveAnalyser","fft","e","msg","first","retryRaf","maxAttempts","attempts","retryLoop","out","detachLiveAnalyser","useGingerKeyboardShortcuts","bindings","togglePlayPause","next","prev","useGingerPlayback","toggleMute","seek","currentTime","duration","useGingerMedia","mediaRef","muteBinding","seekForwardBinding","seekBackwardBinding","useEffect","playPause","nextKey","prevKey","muteKey","seekFwdKey","seekBwdKey","seekSecs","onKeyDown","event","target","key","ct","dur","cap","useGingerSleepTimer","durationMs","stopAfterTracks","respectPause","onFire","currentIndex","pause","isPaused","remainingTracksRef","prevIndexRef","remainingMsRef","segmentStartRef","prevDurationMsRef","elapsed","useGingerDebugLog","useGingerState","prevRef","clamp01","value","useSeekDrag","media","playback","fraction","setFraction","isDragging","setIsDragging","activeDragRef","liveFraction","progressFraction","gingerStateFromContextValues","displayFraction","drag","onPointerDown","rect","update","clientX","ratio","onMove","moveEvent","onUp","upEvent","useNextTrackPrefetch","crossOrigin","tracks","repeatMode","playbackMode","nextIndex","computeNextIndex","nextUrl","audio","createGingerStore","createInitialState","listeners","dispatch","action","gingerReducer","listener","_b","payload","clampVolume","clampPlaybackRate","useGingerPlaybackHistory","maxLength","history","setHistory","prevTracksRef","track","entry","clearHistory","useGingerVolumeFade","setVolume","volume","isFading","setIsFading","rafRef","cancelledRef","cancelFade","targetVolume","onComplete","clamp","v","startTime","startVolume","tick","now","progress","current","useGingerChapterProgress","chapters","c","b","activeIdx","i","chapter","nextChapter","chapterEnd","chapterDuration","remaining"],"mappings":"wRA+BMA,EAAY,IAAI,WAAW,CAAC,EAC5BC,EAAY,IAAI,WAAW,CAAC,EAE3B,SAASC,EACdC,EAAwC,GACX,OAC7B,KAAM,CACJ,QAAAC,EAAU,GACV,QAAAC,EAAU,KACV,sBAAAC,EAAwB,GACxB,YAAAC,EAAc,KACd,YAAAC,EAAc,GAAA,EACZL,EAEE,CAAE,SAAAM,EAAU,MAAAC,CAAA,EAAUC,YAAA,EACtBC,IAAYC,EAAAH,EAAM,OAAOA,EAAM,YAAY,IAA/B,YAAAG,EAAkC,UAAW,GACzDC,EAAOC,EAAAA,QACX,KAAO,CACL,QAAAV,EACA,sBAAAC,EACA,YAAAC,EACA,YAAAC,CAAA,GAEF,CAACH,EAASC,EAAuBC,EAAaC,CAAW,CAAA,EAGrD,CAACQ,EAAOC,CAAQ,EAAIC,EAAAA,SAAS,CAAC,EAC9B,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAwB,IAAI,EAChD,CAACG,EAAaC,CAAc,EAAIJ,EAAAA,SAAS,EAAK,EAC9C,CAACK,EAAMC,CAAO,EAAIN,EAAAA,SAAS,CAAE,kBAAmB,EAAG,WAAY,EAAG,EAElEO,EAAUC,EAAAA,OAAmB1B,CAAS,EACtC2B,EAAUD,EAAAA,OAAmBzB,CAAS,EAEtC2B,EAASC,EAAAA,YAAY,SAAY,CACrC,MAAMC,EAAMC,EAAiB,QACzBD,GAAOA,EAAI,QAAU,aACvB,MAAMA,EAAI,OAAA,CAEd,EAAG,CAAA,CAAE,EAECC,EAAmBL,EAAAA,OAA4B,IAAI,EACnDM,EAAoBN,EAAAA,OAA4B,IAAI,EAG1DO,OAAAA,EAAAA,gBAAgB,IAAM,CACpB,GAAI,CAAC7B,GAAW,OAAO,OAAW,IAChC,OAGF,IAAI8B,EAAY,GACZC,EAA4B,KAC5BC,EAAmC,KACnCC,EAAQ,EAEZ,MAAMC,EAAgB,IAAM,CAC1B,MAAMR,EAAMC,EAAiB,QACzBD,GAAKR,EAAeQ,EAAI,QAAU,WAAW,CACnD,EAEA,IAAIS,EAAe,EACnB,MAAMC,EAAe,EACfC,EAAU,IAAM,CACpB,GAAIP,EAAW,OACf,MAAMQ,EAAIV,EAAkB,QACtBW,EAAKlB,EAAQ,QACbmB,EAAKjB,EAAQ,QACfe,GAAKC,EAAG,OAAS,GAAKC,EAAG,OAAS,IACpCF,EAAE,qBAAqBC,CAA6B,EACpDD,EAAE,sBAAsBE,CAA6B,EACrDL,GAAgB,EACZA,EAAeC,IAAiB,GAClCvB,EAAU4B,GAAMA,EAAI,CAAC,GAGzBR,EAAQ,sBAAsBI,CAAO,CACvC,EAIMK,EAAS,IAAqB,CAClC,MAAMC,EAAKtC,EAAS,QACpB,GAAI,CAACsC,GAAMb,EAAW,MAAO,aAC7B,GAAI,CACF,KAAM,CAAE,GAAAc,EAAI,QAAAC,EAAS,SAAAC,GAAaC,EAAAA,mBAAmBJ,EAAIjC,CAAI,EAC7DqB,EAAaa,EACbZ,EAAUW,EACVhB,EAAiB,QAAUkB,EAC3BjB,EAAkB,QAAUkB,EAC5B5B,EAAe2B,EAAQ,QAAU,WAAW,EAC5C7B,EAAS,IAAI,EAEb6B,EAAQ,iBAAiB,cAAeX,CAAa,EAErD,MAAMO,EAAIK,EAAS,kBACbE,EAAMF,EAAS,QACrB,OAAAzB,EAAQ,QAAU,IAAI,WAAWoB,CAAC,EAClClB,EAAQ,QAAU,IAAI,WAAWyB,CAAG,EACpC5B,EAAQ,CAAE,kBAAmBqB,EAAG,WAAYI,EAAQ,WAAY,EAEhEZ,EAAQ,sBAAsBI,CAAO,EAC9B,IACT,OAASY,EAAG,CACV,MAAMC,EAAMD,aAAa,MAAQA,EAAE,QAAU,iCAC7C,OAAAjC,EAASkC,CAAG,EACZvB,EAAiB,QAAU,KAC3BC,EAAkB,QAAU,KAC5BP,EAAQ,QAAUzB,EAClB2B,EAAQ,QAAU1B,EAClBuB,EAAQ,CAAE,kBAAmB,EAAG,WAAY,EAAG,EACxC,OACT,CACF,EAEM+B,EAAQT,EAAA,EACd,GAAIS,IAAU,KAAM,CAClB,IAAIC,EAAW,EACf,MAAMC,EAAc,IACpB,IAAIC,EAAW,EAEf,MAAMC,EAAY,IAAM,CACtB,GAAIzB,EAAW,OACf,MAAM0B,EAAMd,EAAA,EACRc,IAAQ,MAAQA,IAAQ,UAC5BF,GAAY,EACR,EAAAA,GAAYD,KAChBD,EAAW,sBAAsBG,CAAS,GAC5C,EAEA,OAAIJ,IAAU,eACZC,EAAW,sBAAsBG,CAAS,GAGrC,IAAM,OACXzB,EAAY,GACZ,qBAAqBsB,CAAQ,EAC7B,qBAAqBnB,CAAK,EACtBF,GAAc,MAAQC,GACxByB,EAAAA,mBAAmBzB,EAASD,CAAU,GAExCtB,EAAAkB,EAAiB,UAAjB,MAAAlB,EAA0B,oBAAoB,cAAeyB,GAC7DP,EAAiB,QAAU,KAC3BC,EAAkB,QAAU,KAC5BP,EAAQ,QAAUzB,EAClB2B,EAAQ,QAAU1B,CACpB,CACF,CAEA,MAAO,IAAM,OACXiC,EAAY,GACZ,qBAAqBG,CAAK,EACtBF,GAAc,MAAQC,GACxByB,EAAAA,mBAAmBzB,EAASD,CAAU,GAExCtB,EAAAkB,EAAiB,UAAjB,MAAAlB,EAA0B,oBAAoB,cAAeyB,GAC7DP,EAAiB,QAAU,KAC3BC,EAAkB,QAAU,KAC5BP,EAAQ,QAAUzB,EAClB2B,EAAQ,QAAU1B,EAClBuB,EAAQ,CAAE,kBAAmB,EAAG,WAAY,EAAG,CACjD,CACF,EAAG,CAACpB,EAASK,EAAUK,EAAMF,CAAS,CAAC,EAEhC,CACL,cAAea,EAAQ,QACvB,eAAgBE,EAAQ,QACxB,kBAAmBJ,EAAK,kBACxB,WAAYA,EAAK,WACjB,YAAAF,EACA,MAAAF,EACA,OAAAS,EACA,MAAAZ,CAAA,CAEJ,CC5LO,SAAS8C,EACd1D,EAAU,GACV2D,EAA2C,CAAA,EACrC,CACN,KAAM,CAAE,gBAAAC,EAAiB,KAAAC,EAAM,KAAAC,CAAA,EAASC,EAAAA,kBAAA,EAClC,CAAE,WAAAC,EAAY,KAAAC,EAAM,YAAAC,EAAa,SAAAC,CAAA,EAAaC,EAAAA,eAAA,EAE9CC,EAAW/C,EAAAA,OAAO,CAAE,YAAa,EAAG,SAAU,EAAG,EACvD+C,EAAS,QAAU,CAAE,YAAAH,EAAa,SAAAC,CAAA,EAElC,KAAM,CACJ,KAAMG,EACN,YAAaC,EACb,aAAcC,CAAA,EACZb,EAEJc,EAAAA,UAAU,IAAM,CACd,GAAI,CAACzE,GAAW,OAAO,OAAW,IAAa,OAC/C,MAAM0E,GAAaf,EAAS,WAAa,KAAK,YAAA,EACxCgB,GAAWhB,EAAS,MAAQ,cAAc,YAAA,EAC1CiB,GAAWjB,EAAS,UAAY,aAAa,YAAA,EAC7CkB,EAAUP,GAAA,YAAAA,EAAa,cACvBQ,EAAaP,GAAA,YAAAA,EAAoB,cACjCQ,EAAaP,GAAA,YAAAA,EAAqB,cAClCQ,EAAWrB,EAAS,aAAe,EAEnCsB,EAAaC,GAAyB,CAC1C,MAAMC,EAASD,EAAM,OACrB,GACEC,IACC,CAAC,QAAS,WAAY,QAAQ,EAAE,SAASA,EAAO,OAAO,GAAKA,EAAO,mBAEpE,OACF,MAAMC,EAAMF,EAAM,IAAI,YAAA,EACtB,GAAIE,IAAQV,EACVQ,EAAM,eAAA,EACNtB,EAAA,UACSwB,IAAQT,EACjBO,EAAM,eAAA,EACNrB,EAAA,UACSuB,IAAQR,EACjBM,EAAM,eAAA,EACNpB,EAAA,UACSe,GAAWO,IAAQP,EAC5BK,EAAM,eAAA,EACNlB,EAAA,UACSc,GAAcM,IAAQN,EAAY,CAC3CI,EAAM,eAAA,EACN,KAAM,CAAE,YAAaG,EAAI,SAAUC,CAAA,EAAQjB,EAAS,QAC9CkB,EAAMD,EAAM,EAAIA,EAAM,OAAO,kBACnCrB,EAAK,KAAK,IAAIsB,EAAKF,EAAKL,CAAQ,CAAC,CACnC,MAAWD,GAAcK,IAAQL,IAC/BG,EAAM,eAAA,EACNjB,EAAK,KAAK,IAAI,EAAGI,EAAS,QAAQ,YAAcW,CAAQ,CAAC,EAE7D,EACA,cAAO,iBAAiB,UAAWC,CAAS,EACrC,IAAM,OAAO,oBAAoB,UAAWA,CAAS,CAC9D,EAAG,CACDtB,EAAS,KACTA,EAAS,UACTA,EAAS,SACTA,EAAS,YACT3D,EACAsE,EACAT,EACAC,EACAG,EACAO,EACAD,EACAP,EACAJ,CAAA,CACD,CACH,CC9EO,SAAS4B,EAAoBzF,EAAwC,CAC1E,KAAM,CAAE,WAAA0F,EAAY,gBAAAC,EAAiB,aAAAC,EAAe,GAAM,QAAA3F,EAAU,GAAM,OAAA4F,GAAW7F,EAC/E,CAAE,aAAA8F,EAAc,MAAAC,EAAO,SAAAC,CAAA,EAAahC,EAAAA,kBAAA,EACpCiC,EAAqB1E,EAAAA,OAAOoE,GAAmB,CAAC,EAChDO,EAAe3E,EAAAA,OAAOuE,CAAY,EAGlCK,EAAiB5E,EAAAA,OAAOmE,GAAc,CAAC,EAEvCU,EAAkB7E,EAAAA,OAAsB,IAAI,EAElDmD,EAAAA,UAAU,IAAM,CACduB,EAAmB,QAAUN,GAAmB,CAClD,EAAG,CAACA,CAAe,CAAC,EAGpB,MAAMU,EAAoB9E,EAAAA,OAAOmE,CAAU,EAC3ChB,EAAAA,UAAU,IAAM,CACV2B,EAAkB,UAAYX,IAChCS,EAAe,QAAUT,GAAc,EACvCW,EAAkB,QAAUX,EAEhC,EAAG,CAACA,CAAU,CAAC,EAEfhB,EAAAA,UAAU,IAAM,CACd,GAAI,CAACzE,GAAW,CAACyF,GAAcA,GAAc,EAAG,CAE9CS,EAAe,QAAUT,GAAc,EACvCU,EAAgB,QAAU,KAC1B,MACF,CAEA,GAAIR,GAAgBI,EAAU,CAE5B,GAAII,EAAgB,UAAY,KAAM,CACpC,MAAME,EAAU,KAAK,IAAA,EAAQF,EAAgB,QAC7CD,EAAe,QAAU,KAAK,IAAI,EAAGA,EAAe,QAAUG,CAAO,EACrEF,EAAgB,QAAU,IAC5B,CACA,MACF,CAGAA,EAAgB,QAAU,KAAK,IAAA,EAC/B,MAAMvD,EAAK,WAAW,IAAM,CAC1BsD,EAAe,QAAU,EACzBC,EAAgB,QAAU,KAC1BL,EAAA,EACAF,GAAA,MAAAA,GACF,EAAGM,EAAe,OAAO,EAEzB,MAAO,IAAM,CAGX,GAFA,aAAatD,CAAE,EAEXuD,EAAgB,UAAY,KAAM,CACpC,MAAME,EAAU,KAAK,IAAA,EAAQF,EAAgB,QAC7CD,EAAe,QAAU,KAAK,IAAI,EAAGA,EAAe,QAAUG,CAAO,EACrEF,EAAgB,QAAU,IAC5B,CACF,CACF,EAAG,CAACV,EAAYzF,EAAS+F,EAAUH,EAAQE,EAAOH,CAAY,CAAC,EAE/DlB,EAAAA,UAAU,IAAM,CACd,GAAI,CAACzE,GAAW,CAAC0F,GAAmBA,GAAmB,EAAG,OAC1D,MAAM5B,EAAOmC,EAAa,QAC1BA,EAAa,QAAUJ,EACnBA,IAAiB/B,IACrBkC,EAAmB,SAAW,EAC1BA,EAAmB,SAAW,IAChCF,EAAA,EACAF,GAAA,MAAAA,KAEJ,EAAG,CAACC,EAAc7F,EAAS4F,EAAQE,EAAOJ,CAAe,CAAC,CAC5D,CCjFO,SAASY,EAAkBtG,EAAU,GAAa,CACvD,MAAMM,EAAQiG,EAAAA,eAAA,EACRC,EAAUlF,EAAAA,OAAOhB,CAAK,EAE5BmE,EAAAA,UAAU,IAAM,CACd,GAAI,CAACzE,GAAW,OAAO,QAAY,IAAa,OAChD,MAAM8D,EAAO0C,EAAQ,QACjB1C,IAASxD,GACX,QAAQ,MAAM,WAAY,CACxB,KAAM,CACJ,aAAcwD,EAAK,aACnB,SAAUA,EAAK,SACf,YAAaA,EAAK,YAClB,WAAYA,EAAK,UAAA,EAEnB,GAAI,CACF,aAAcxD,EAAM,aACpB,SAAUA,EAAM,SAChB,YAAaA,EAAM,YACnB,WAAYA,EAAM,UAAA,CACpB,CACD,EAEHkG,EAAQ,QAAUlG,CACpB,EAAG,CAACN,EAASM,CAAK,CAAC,CACrB,CCVA,SAASmG,EAAQC,EAAuB,CACtC,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGA,CAAK,CAAC,CACvC,CASO,SAASC,GAAYxC,EAAiC,CAC3D,MAAMyC,EAAQxC,EAAAA,eAAA,EACRyC,EAAW9C,EAAAA,kBAAA,EACX,CAAE,KAAAE,GAAS2C,EACX,CAACE,EAAUC,CAAW,EAAIjG,EAAAA,SAAS,CAAC,EACpC,CAACkG,EAAYC,CAAa,EAAInG,EAAAA,SAAS,EAAK,EAC5CoG,EAAgB5F,EAAAA,OAA0B,IAAI,EAE9C6F,EAAeC,EAAAA,iBAAiBC,EAAAA,6BAA6BR,EAAUD,CAAK,CAAC,EAC7EU,EAAkBN,EAAaF,EAAWK,EAEhD1C,EAAAA,UAAU,IACD,IAAM,CACX,MAAM8C,EAAOL,EAAc,QAC3B,GAAKK,EACL,CAAAA,EAAK,OAAO,oBAAoB,cAAeA,EAAK,MAAM,EAC1DA,EAAK,OAAO,oBAAoB,YAAaA,EAAK,IAAI,EACtDA,EAAK,OAAO,oBAAoB,gBAAiBA,EAAK,IAAI,EAC1D,GAAI,CACFA,EAAK,OAAO,sBAAsBA,EAAK,SAAS,CAClD,MAAQ,CAER,CACAL,EAAc,QAAU,KAC1B,EACC,CAAA,CAAE,EAEL,MAAMM,EAAgB/F,EAAAA,YACnByD,GAA0C,CACzC,GAAI,EAAEf,EAAW,GAAI,OACrB,MAAMgB,EAASD,EAAM,cACfuC,EAAOtC,EAAO,sBAAA,EACduC,EAAUC,GAAoB,CAClC,MAAMC,EAAQnB,GAASkB,EAAUF,EAAK,MAAQA,EAAK,KAAK,EACxDV,EAAYa,CAAK,EACjB3D,EAAK2D,EAAQzD,CAAQ,CACvB,EACA8C,EAAc,EAAI,EAClB9B,EAAO,kBAAkBD,EAAM,SAAS,EACxCwC,EAAOxC,EAAM,OAAO,EACpB,MAAM2C,EAAUC,GAA4BJ,EAAOI,EAAU,OAAO,EAC9DC,EAAQC,GAA0B,CACtCN,EAAOM,EAAQ,OAAO,EACtBf,EAAc,EAAK,EACnB9B,EAAO,sBAAsBD,EAAM,SAAS,EAC5CC,EAAO,oBAAoB,cAAe0C,CAAM,EAChD1C,EAAO,oBAAoB,YAAa4C,CAAI,EAC5C5C,EAAO,oBAAoB,gBAAiB4C,CAAI,EAChDb,EAAc,QAAU,IAC1B,EACAA,EAAc,QAAU,CAAE,OAAA/B,EAAQ,UAAWD,EAAM,UAAW,OAAA2C,EAAQ,KAAAE,CAAA,EACtE5C,EAAO,iBAAiB,cAAe0C,CAAM,EAC7C1C,EAAO,iBAAiB,YAAa4C,CAAI,EACzC5C,EAAO,iBAAiB,gBAAiB4C,CAAI,CAC/C,EACA,CAAC5D,EAAUF,CAAI,CAAA,EAGjB,MAAO,CAAE,SAAA6C,EAAU,gBAAAQ,EAAiB,WAAAN,EAAY,cAAAQ,CAAA,CAClD,CClEO,SAASS,GAAqBlI,EAAuC,GAAU,CACpF,KAAM,CAAE,QAAAC,EAAU,GAAM,YAAAkI,CAAA,EAAgBnI,EAClC,CAAE,OAAAoI,EAAQ,aAAAtC,EAAc,WAAAuC,EAAY,aAAAC,CAAA,EAAiBtE,EAAAA,kBAAA,EAE3DU,EAAAA,UAAU,IAAM,OACd,GAAI,CAACzE,GAAW,OAAO,SAAa,IAAa,OACjD,MAAMsI,EAAYC,EAAAA,iBAAiB,CAAE,OAAAJ,EAAQ,aAAAtC,EAAc,WAAAuC,EAAY,aAAAC,EAAc,EACrF,GAAIC,IAAczC,EAAc,OAChC,MAAM2C,IAAU/H,EAAA0H,EAAOG,CAAS,IAAhB,YAAA7H,EAAmB,UAAW,GAC9C,GAAI,CAAC+H,EAAS,OAEd,MAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5C,OAAAA,EAAM,QAAU,OACZP,MAAmB,YAAcA,GACrCO,EAAM,IAAMD,EACZC,EAAM,KAAA,EAEC,IAAM,CACXA,EAAM,gBAAgB,KAAK,EAC3BA,EAAM,KAAA,CACR,CACF,EAAG,CAACzI,EAASkI,EAAaC,EAAQtC,EAAcuC,EAAYC,CAAY,CAAC,CAC3E,CCeO,SAASK,GAAkB3I,EAA8B,GAAiB,CAC/E,IAAIO,EAAQqI,EAAAA,mBAAmB,CAC7B,OAAQ5I,EAAQ,QAAU,CAAA,EAC1B,aAAcA,EAAQ,aACtB,aAAcA,EAAQ,aACtB,SAAUA,EAAQ,SAClB,WAAYA,EAAQ,WACpB,WAAYA,EAAQ,WACpB,aAAcA,EAAQ,aACtB,OAAQA,EAAQ,OAChB,MAAOA,EAAQ,MACf,aAAcA,EAAQ,YAAA,CACvB,EAED,MAAM6I,MAAgB,IAEhBC,EAAYC,GAA+B,SAC/C,MAAMjF,EAAOkF,EAAAA,cAAczI,EAAOwI,CAAM,EACxC,GAAIjF,IAASvD,EAAO,CAClBA,EAAQuD,EACR,UAAWmF,KAAYJ,EACrB,GAAI,CACFI,EAAS1I,CAAK,CAChB,OAAS2C,EAAG,CAER,OAAO,WAAe,OACrBgG,GAAAxI,EAAA,WAA6D,UAA7D,YAAAA,EAAsE,MAAtE,YAAAwI,EAA2E,YAC1E,cAEF,QAAQ,MAAM,+CAAgDhG,CAAC,CAEnE,CAEJ,CACF,EAWA,MAAO,CACL,SAAU,IAAM3C,EAChB,SAAAuI,EACA,UAZiBG,IACjBJ,EAAU,IAAII,CAAQ,EACf,IAAMJ,EAAU,OAAOI,CAAQ,GAWtC,KARYE,GAAqC,CACjDL,EAAS,CAAE,KAAM,OAAQ,QAAAK,CAAA,CAAS,CACpC,EAME,YACAC,EAAAA,YAAA,kBACAC,EAAAA,iBAAA,CAEJ,CClFO,SAASC,GACdtJ,EAA2C,GACX,CAChC,KAAM,CAAE,UAAAuJ,EAAY,EAAA,EAAOvJ,EACrB,CAAE,OAAAoI,EAAQ,aAAAtC,CAAA,EAAiB9B,oBAAA,EAE3B,CAACwF,EAASC,CAAU,EAAI1I,EAAAA,SAAuC,CAAA,CAAE,EACjEmF,EAAe3E,EAAAA,OAAsB,IAAI,EACzCmI,EAAgBnI,EAAAA,OAAO6G,CAAM,EACnCsB,EAAc,QAAUtB,EAExB1D,EAAAA,UAAU,IAAM,CACd,MAAMiF,EAAQvB,EAAOtC,CAAY,EAGjC,GAFI,CAAC6D,GAEDzD,EAAa,UAAYJ,EAAc,OAC3CI,EAAa,QAAUJ,EAEvB,MAAM8D,EAAoC,CACxC,MAAAD,EACA,MAAO7D,EACP,SAAU,KAAK,IAAA,CAAI,EAGrB2D,EAAY1F,GAAS,CACnB,MAAMD,EAAO,CAAC,GAAGC,EAAM6F,CAAK,EAC5B,OAAO9F,EAAK,OAASyF,EAAYzF,EAAK,MAAMA,EAAK,OAASyF,CAAS,EAAIzF,CACzE,CAAC,CACH,EAAG,CAACgC,EAAcsC,EAAQmB,CAAS,CAAC,EAEpC,MAAMM,EAAenI,EAAAA,YAAY,IAAM+H,EAAW,CAAA,CAAE,EAAG,CAAA,CAAE,EAEzD,MAAO,CAAE,QAAAD,EAAS,aAAAK,CAAA,CACpB,CCtCO,SAASC,IAAiD,CAC/D,KAAM,CAAE,UAAAC,EAAW,OAAAC,CAAA,EAAW3F,iBAAA,EACxB,CAAC4F,EAAUC,CAAW,EAAInJ,EAAAA,SAAS,EAAK,EAExCoJ,EAAS5I,EAAAA,OAAe,CAAC,EACzB6I,EAAe7I,EAAAA,OAAO,EAAK,EAE3B8I,EAAa3I,EAAAA,YAAY,IAAM,CACnC,qBAAqByI,EAAO,OAAO,EACnCC,EAAa,QAAU,GACvBF,EAAY,EAAK,CACnB,EAAG,CAAA,CAAE,EAwCL,MAAO,CAAE,aAtCYxI,EAAAA,YACnB,CAAC,CAAE,aAAA4I,EAAc,WAAA5E,EAAY,WAAA6E,KAA6C,CACxE,qBAAqBJ,EAAO,OAAO,EACnCC,EAAa,QAAU,GAEvB,MAAMI,EAASC,GAAc,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGA,CAAC,CAAC,EACjDrF,EAASoF,EAAMF,CAAY,EAC3BI,EAAY,YAAY,IAAA,EAG9B,IAAIC,EAAcX,EAElBE,EAAY,EAAI,EAEhB,MAAMU,EAAQC,GAAgB,CAC5B,GAAIT,EAAa,QAAS,OAC1B,MAAM9D,EAAUuE,EAAMH,EAChBI,EAAW,KAAK,IAAI,EAAGxE,EAAU,KAAK,IAAI,EAAGZ,CAAU,CAAC,EACxDqF,EAAUJ,GAAevF,EAASuF,GAAeG,EACvDf,EAAUS,EAAMO,CAAO,CAAC,EAEpBD,EAAW,EACbX,EAAO,QAAU,sBAAsBS,CAAI,GAE3CV,EAAY,EAAK,EACjBK,GAAA,MAAAA,IAEJ,EAGAJ,EAAO,QAAU,sBAAuBU,GAAQ,CAC9CF,EAAcX,EACdY,EAAKC,CAAG,CACV,CAAC,CACH,EACA,CAACd,EAAWC,CAAM,CAAA,EAGG,WAAAK,EAAY,SAAAJ,CAAA,CACrC,CC7DO,SAASe,IAAkD,CAChE,KAAM,CAAE,OAAA5C,EAAQ,aAAAtC,CAAA,EAAiB9B,oBAAA,EAC3B,CAAE,YAAAG,EAAa,SAAAC,CAAA,EAAaC,iBAAA,EAE5B4G,EAAWrK,EAAAA,QAAQ,IAAM,OAE7B,MAAO,CAAC,KADIF,EAAA0H,EAAOtC,CAAY,IAAnB,YAAApF,EAAsB,WAAY,CAAA,CAChC,EACX,OAAQwK,GAAMA,GAAK,OAAO,SAASA,EAAE,YAAY,GAAKA,EAAE,cAAgB,CAAC,EACzE,KAAK,CAAC3I,EAAG4I,IAAM5I,EAAE,aAAe4I,EAAE,YAAY,CACnD,EAAG,CAAC/C,EAAQtC,CAAY,CAAC,EAEzB,OAAOlF,EAAAA,QAA+B,IAAM,CAC1C,GAAIqK,EAAS,SAAW,EAAG,MAAO,CAAE,SAAU,EAAG,QAAS,EAAG,UAAW,CAAA,EAGxE,IAAIG,EAAY,GAChB,QAASC,EAAIJ,EAAS,OAAS,EAAGI,GAAK,EAAGA,IACxC,GAAIlH,GAAe8G,EAASI,CAAC,EAAG,aAAc,CAC5CD,EAAYC,EACZ,KACF,CAGF,GAAID,IAAc,GAAI,MAAO,CAAE,SAAU,EAAG,QAAS,EAAG,UAAW,CAAA,EAEnE,MAAME,EAAUL,EAASG,CAAS,EAC5BG,EAAcN,EAASG,EAAY,CAAC,EACpCI,GAAaD,GAAA,YAAAA,EAAa,gBAAiBnH,EAAW,EAAIA,EAAWD,GACrEsH,EAAkB,KAAK,IAAI,EAAGD,EAAaF,EAAQ,YAAY,EAC/DhF,EAAU,KAAK,IAAI,EAAGnC,EAAcmH,EAAQ,YAAY,EACxDI,EAAY,KAAK,IAAI,EAAGF,EAAarH,CAAW,EAGtD,MAAO,CAAE,SAFQsH,EAAkB,EAAI,KAAK,IAAI,EAAGnF,EAAUmF,CAAe,EAAI,EAE7D,QAAAnF,EAAS,UAAAoF,CAAA,CAC9B,EAAG,CAACT,EAAU9G,EAAaC,CAAQ,CAAC,CACtC"}