@nice2dev/ui-audio 1.2.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";var $c=Object.create;var gs=Object.defineProperty;var Ac=Object.getOwnPropertyDescriptor;var Ic=Object.getOwnPropertyNames;var Lc=Object.getPrototypeOf,_c=Object.prototype.hasOwnProperty;var zc=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ic(t))!_c.call(e,s)&&s!==n&&gs(e,s,{get:()=>t[s],enumerable:!(a=Ac(t,s))||a.enumerable});return e};var Hr=(e,t,n)=>(n=e!=null?$c(Lc(e)):{},zc(t||!e||!e.__esModule?gs(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),ke=require("@nice2dev/ui-core"),d=require("react"),ie=require("@nice2dev/ui"),F=require("@nice2dev/icons"),la=require("pitchy"),Pa=require("react-youtube");var vt=typeof document<"u"?document.currentScript:null;const Ti=d.createContext(null),Dc=({t:e,children:t})=>r.jsx(Ti.Provider,{value:e,children:t});function xe(){const e=d.useContext(Ti),{t}=ke.useNiceTranslation();return{t:d.useMemo(()=>e??((a,s)=>t(a,s??a)),[e,t])}}function Fc({componentName:e,error:t,onReset:n}){const{t:a}=xe();return r.jsx("div",{className:"nice-audio-error-boundary",role:"alert",children:r.jsxs("div",{className:"nice-audio-error-boundary__content",children:[r.jsx("h3",{className:"nice-audio-error-boundary__title",children:e?a("audioErrorBoundary.componentError","{name} encountered an error").replace("{name}",e):a("audioErrorBoundary.somethingWentWrong","Something went wrong")}),r.jsx("p",{className:"nice-audio-error-boundary__message",children:t.message}),r.jsx("button",{className:"nice-audio-error-boundary__retry",onClick:n,children:a("audioErrorBoundary.tryAgain","Try Again")})]})})}class Oc extends d.Component{constructor(){super(...arguments),this.state={hasError:!1,error:null},this.reset=()=>{this.setState({hasError:!1,error:null})}}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,n){var s,i;const a=this.props.componentName?`[${this.props.componentName}]`:"[AudioErrorBoundary]";console.error(`${a} Caught error:`,t,n),(i=(s=this.props).onError)==null||i.call(s,t,n)}render(){return this.state.hasError&&this.state.error?typeof this.props.fallback=="function"?this.props.fallback(this.state.error,this.reset):this.props.fallback?this.props.fallback:r.jsx(Fc,{componentName:this.props.componentName,error:this.state.error,onReset:this.reset}):this.props.children}}function Bc(e){if(!e)return[128,128,128];const t=e.match(/^#([0-9a-f]{3,8})$/i);if(t){let a=t[1];if(a.length===3&&(a=a[0]+a[0]+a[1]+a[1]+a[2]+a[2]),a.length>=6)return[parseInt(a.slice(0,2),16),parseInt(a.slice(2,4),16),parseInt(a.slice(4,6),16)]}const n=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/i);return n?[+n[1],+n[2],+n[3]]:[128,128,128]}const Kr={},ca={DEBUG:0,INFO:1,WARN:2,ERROR:3,NONE:4};function Gc(){const e=typeof{url:typeof document>"u"?require("url").pathToFileURL(__filename).href:vt&&vt.tagName.toUpperCase()==="SCRIPT"&&vt.src||new URL("index.cjs",document.baseURI).href}<"u"?Kr==null?void 0:Kr.VITE_LOG_LEVEL:void 0;return e&&e in ca?e:"WARN"}const Wc=Gc();function Kn(e){return ca[e]>=ca[Wc]}function Yn(e){return`[${e}]`}const st=(function(){return{debug(e,t,...n){Kn("DEBUG")&&console.debug(Yn(e),t,...n)},info(e,t,...n){Kn("INFO")&&console.info(Yn(e),t,...n)},warn(e,t,...n){Kn("WARN")&&console.warn(Yn(e),t,...n)},error(e,t,...n){Kn("ERROR")&&console.error(Yn(e),t,...n)},scoped(e){return{debug:(t,...n)=>st.debug(e,t,...n),info:(t,...n)=>st.info(e,t,...n),warn:(t,...n)=>st.warn(e,t,...n),error:(t,...n)=>st.error(e,t,...n)}}}})(),ys=st.scoped("Waveform"),Vc=["audio/","video/"],Pi=({audioBlob:e,currentTime:t,duration:n,width:a=600,height:s=200,zoom:i=1,onSeek:o,onRegionSelect:l,markers:c=[],regions:u=[],displayMode:h="waveform",multiChannel:p=!1,waveColor:g="var(--nice-color-primary, #007bff)",progressColor:y="var(--nice-color-error, rgba(255,0,0,0.8))",backgroundColor:m="transparent",showRuler:x=!1,showChannelLabels:b=!0,showPeakMeter:f=!1,className:k})=>{const{t:v}=xe(),w=d.useRef(null),R=d.useRef(null),[M,j]=d.useState(null),[T,P]=d.useState(0),[A,I]=d.useState(!1),[L,N]=d.useState(null),[_,ee]=d.useState(null),[Y,O]=d.useState(0),U=Math.max(a,a*i),V=x?24:0;d.useEffect(()=>{if(!e||e.size===0){j(null);return}e.type&&!Vc.some($=>e.type.startsWith($))&&ys.warn("Unexpected blob MIME type:",e.type);let C=!1;return(async()=>{let $=null;try{const S=await e.arrayBuffer();if(S.byteLength===0||C)return;$=new AudioContext;const B=await $.decodeAudioData(S);C||j(B)}catch(S){ys.error("Failed to decode audio:",S)}finally{$==null||$.close().catch(()=>{})}})(),()=>{C=!0}},[e]),d.useEffect(()=>{if(i>1&&n>0){const C=t/n*U;(C<T||C>T+a)&&P(Math.max(0,C-a/2))}},[t,n,i,a,U,T]),d.useEffect(()=>{const C=w.current,$=M;if(!C||!n||n===1/0)return;const S=C.getContext("2d");if(!S)return;const B=U,H=s;if(C.width=B,C.height=H+V,S.clearRect(0,0,B,H+V),m!=="transparent"&&(S.fillStyle=ke.resolveCssColor(m),S.fillRect(0,0,B,H+V)),x){const z=ke.resolveCssColor("var(--nice-text-secondary, #888)");S.fillStyle=ke.resolveCssColor("var(--nice-bg-secondary, rgba(128,128,128,0.15))"),S.fillRect(0,0,B,V),S.fillStyle=z,S.font="10px monospace",S.textAlign="center";const Z=Math.max(1,Math.floor(n/(U/80)));for(let E=0;E<=n;E+=Z){const q=E/n*B;S.fillText(Kc(E),q,V-4),S.fillStyle=ke.resolveCssColor("var(--nice-border-color, rgba(128,128,128,0.3))"),S.fillRect(q,V,1,H),S.fillStyle=z}}for(const z of u){const Z=z.start/n*B,E=z.end/n*B;S.fillStyle=ke.resolveCssColor(z.color??"var(--nice-accent-tint-15, rgba(99, 102, 241, 0.15))"),S.fillRect(Z,V,E-Z,H),z.label&&(S.fillStyle=ke.resolveCssColor(z.color??"var(--nice-info, #6366f1)"),S.font="10px sans-serif",S.textAlign="left",S.fillText(z.label,Z+2,V+12))}if(L!==null&&_!==null){const z=Math.min(L,_),Z=Math.max(L,_);S.fillStyle=ke.resolveCssColor("var(--nice-warning-tint-20, rgba(255,200,0,0.2))"),S.fillRect(z,V,Z-z,H)}if($){const z=p?$.numberOfChannels:1,Z=H/z,E=ke.resolveCssColor(g);let q=0;for(let X=0;X<z;X++){const re=$.getChannelData(X),oe=V+X*Z;if(h==="waveform"?Uc(S,re,B,Z,oe,E):h==="bars"?qc(S,re,B,Z,oe,E):h==="spectrogram"&&Hc(S,re,B,Z,oe,$.sampleRate),f&&n>0){const se=Math.floor(t/n*re.length),D=Math.floor($.sampleRate*.05);let J=0;for(let ce=Math.max(0,se-D);ce<Math.min(re.length,se+D);ce++)J+=re[ce]*re[ce];const ae=Math.sqrt(J/(D*2));q=Math.max(q,ae)}p&&b&&z>1&&(S.fillStyle=ke.resolveCssColor("var(--nice-overlay-light-60, rgba(255, 255, 255, 0.6))"),S.font="bold 11px sans-serif",S.textAlign="left",S.fillText(X===0?"L":X===1?"R":`Ch${X+1}`,4,oe+14))}O(q)}if(n>0){const z=Math.max(0,Math.min(t/n*B,B));S.beginPath(),S.strokeStyle=ke.resolveCssColor(y),S.lineWidth=2,S.moveTo(z,V),S.lineTo(z,H+V),S.stroke()}for(const z of c){const Z=z.time/n*B,E=ke.resolveCssColor(z.color??"var(--nice-warning, #f59e0b)");S.beginPath(),S.strokeStyle=E,S.lineWidth=2,S.setLineDash([4,4]),S.moveTo(Z,V),S.lineTo(Z,H+V),S.stroke(),S.setLineDash([]),z.label&&(S.fillStyle=E,S.font="bold 10px sans-serif",S.textAlign="center",S.fillText(z.label,Z,V+H-4))}},[M,t,n,U,s,i,h,p,g,y,m,x,c,u,L,_,f,b,V]);const K=d.useCallback(C=>{var B;if(!n)return;const $=(B=w.current)==null?void 0:B.getBoundingClientRect();if(!$)return;const S=C.clientX-$.left+T;I(!0),N(S),ee(S)},[n,T]),G=d.useCallback(C=>{if(!A||!w.current)return;const $=w.current.getBoundingClientRect(),S=C.clientX-$.left+T;ee(S)},[A,T]),W=d.useCallback(()=>{if(!A||L===null||_===null||!n){I(!1),N(null),ee(null);return}const C=Math.min(L,_),$=Math.max(L,_),S=($-C)/U*n;if(I(!1),N(null),ee(null),S<.2){const B=C/U*n;o==null||o(B)}else{const B=C/U*n,H=$/U*n;l==null||l({start:B,end:H})}},[A,L,_,n,U,o,l]);return r.jsxs("div",{ref:R,className:`nice-waveform${k?` ${k}`:""}`,style:{position:"relative",width:a,overflow:i>1?"auto":"hidden",cursor:o?"crosshair":"default"},onScroll:C=>P(C.target.scrollLeft),children:[r.jsx("canvas",{ref:w,width:U,height:s+V,style:{display:"block"},role:"img","aria-label":v("waveform.waveformCanvas","Waveform canvas"),onMouseDown:K,onMouseMove:G,onMouseUp:W,onMouseLeave:W}),f&&r.jsx("div",{style:{position:"absolute",right:4,top:V+4,bottom:4,width:12,background:"var(--nice-overlay-30, rgba(0, 0, 0, 0.3))",borderRadius:4,overflow:"hidden"},children:r.jsx("div",{style:{position:"absolute",bottom:0,width:"100%",height:`${Math.min(100,Y*300)}%`,background:Y>.8?"var(--nice-danger, #ef4444)":Y>.5?"var(--nice-warning, #f59e0b)":"var(--nice-success, #22c55e)",borderRadius:4,transition:"height 50ms"}})})]})};function Uc(e,t,n,a,s,i){const o=Math.floor(t.length/n),l=s+a/2;e.beginPath(),e.strokeStyle=i,e.lineWidth=1;for(let c=0;c<n;c++){const u=c*o,h=t.subarray(u,u+o);let p=0,g=0;for(let x=0;x<h.length;x++)h[x]<p&&(p=h[x]),h[x]>g&&(g=h[x]);const y=l-g*(a/2),m=l-p*(a/2);e.moveTo(c,y),e.lineTo(c,m)}e.stroke()}function qc(e,t,n,a,s,i){const o=Math.max(2,Math.floor(n/128)),l=Math.floor(n/o),c=Math.floor(t.length/l);for(let u=0;u<l;u++){const h=u*c,p=t.subarray(h,h+c);let g=0;for(let b=0;b<p.length;b++)g+=Math.abs(p[b]);const m=g/p.length*a*.9,x=u*o;e.fillStyle=i,e.fillRect(x+1,s+a-m,o-2,m)}}function Hc(e,t,n,a,s,i){const l=Math.min(n,512),c=Math.floor(t.length/l),u=n/l;for(let h=0;h<l;h++){const p=h*c,g=new Float32Array(256/2);for(let m=0;m<256/2;m++){let x=0,b=0;for(let f=0;f<256&&p+f<t.length;f++){const k=2*Math.PI*m*f/256;x+=t[p+f]*Math.cos(k),b-=t[p+f]*Math.sin(k)}g[m]=Math.sqrt(x*x+b*b)/256}const y=a/g.length;for(let m=0;m<g.length;m++){const x=Math.min(1,g[m]*10),b=Math.floor(x*255),f=Math.floor(x*100),k=Math.floor((1-x)*200);e.fillStyle=`rgb(${b},${f},${k})`,e.fillRect(h*u,s+a-(m+1)*y,u+1,y+1)}}}function Kc(e){const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`}const vs=88,Jt=16,Zn=16,Yc=320;function Zc(e){return e-21}function Xc(e){return e+21}const Ea=({notes:e,onAddNote:t,onRemoveNote:n,selectedNoteId:a,setSelectedNoteId:s,duration:i=4,zoom:o=1})=>{const l=d.useRef(null),c=Yc*o,u=vs*Jt,h=d.useRef(null);d.useEffect(()=>{},[e,o,i]);const p=y=>{const m=l.current;if(!m)return;const x=m.getBoundingClientRect(),b=y.clientX-x.left,f=y.clientY-x.top,k=Math.floor(f/Jt),v=Xc(k),w=b/c*i;h.current={drawing:!0,startX:b,key:k},t(v,w,i/Zn)},g=(y,m)=>{m.stopPropagation(),s==null||s(y)};return r.jsxs("svg",{ref:l,width:c,height:u,style:{background:"var(--nice-bg-secondary, #f8fafc)",border:"1px solid var(--nice-border-color, #cbd5e1)",userSelect:"none",display:"block"},onMouseDown:p,children:[[...Array(vs)].map((y,m)=>r.jsx("rect",{x:0,y:m*Jt,width:c,height:Jt,fill:m%2===0?"var(--nice-bg-secondary, #f8fafc)":"var(--nice-bg-tertiary, #f1f5f9)"},m)),[...Array(Zn+1)].map((y,m)=>r.jsx("line",{x1:m*c/Zn,y1:0,x2:m*c/Zn,y2:u,stroke:"var(--nice-border-muted, #ccc)",strokeWidth:m%4===0?2:1},m)),e.map(y=>{const m=Zc(y.pitch),x=y.start/i*c,b=y.duration/i*c;return r.jsx("rect",{x,y:m*Jt,width:Math.max(6,b),height:Jt-2,fill:y.id===a?"var(--nice-color-primary, #6366f1)":"color-mix(in srgb, var(--nice-color-primary, #6366f1) 55%, var(--nice-bg-primary, #ffffff))",stroke:"var(--nice-color-primary, #6366f1)",strokeWidth:y.id===a?2:1,rx:3,onClick:f=>g(y.id,f),onDoubleClick:()=>n(y.id),style:{cursor:"pointer"}},y.id)})]})},Qc=({ccEvents:e,onAddEvent:t,onUpdateEvent:n,onRemoveEvent:a,ccType:s,duration:i,width:o,height:l=60,curveType:c})=>{const u=d.useRef(null),{t:h}=xe(),[p,g]=d.useState(null),[y,m]=d.useState(null),[x,b]=d.useState(null),f=[...e].sort((N,_)=>N.time-_.time),k=N=>[N.time/i*o,(127-N.value)/127*l],v=(N,_,ee)=>Math.max(_,Math.min(ee,N)),w=N=>{var V;if(N.target instanceof SVGCircleElement)return;const _=(V=u.current)==null?void 0:V.getBoundingClientRect();if(!_)return;const ee=N.clientX-_.left,Y=N.clientY-_.top,O=v(ee/o*i,0,i),U=v(127-Math.round(Y/l*127),0,127);t(s,U,O)},R=(N,_)=>{var U;_.stopPropagation(),g(N.id),b(N.id);const[ee,Y]=k(N),O=(U=u.current)==null?void 0:U.getBoundingClientRect();O&&m({dx:_.clientX-O.left-ee,dy:_.clientY-O.top-Y})},M=N=>{var V;if(p==null||!y)return;const _=(V=u.current)==null?void 0:V.getBoundingClientRect();if(!_)return;const ee=v(N.clientX-_.left-y.dx,0,o),Y=v(N.clientY-_.top-y.dy,0,l),O=v(ee/o*i,0,i),U=v(127-Math.round(Y/l*127),0,127);n(p,U,O)},j=()=>{g(null),m(null)};d.useEffect(()=>{const N=_=>{(_.key==="Delete"||_.key==="Backspace")&&x!=null&&(a(x),b(null))};return window.addEventListener("keydown",N),()=>window.removeEventListener("keydown",N)},[x,a]),d.useEffect(()=>{if(p!=null)return window.addEventListener("mousemove",M),window.addEventListener("mouseup",j),()=>{window.removeEventListener("mousemove",M),window.removeEventListener("mouseup",j)}});const[T,P]=d.useState(null),A=(N,_)=>{const[ee,Y]=k(N);P({x:ee+10,y:Y-10,text:h("ccLane.valTimeS","Val: {value}, Time: {time}s").replace("{value}",String(N.value)).replace("{time}",String(N.time.toFixed(2)))})},I=()=>P(null),L=N=>{var V;const _=(V=u.current)==null?void 0:V.getBoundingClientRect();if(!_)return;const ee=N.clientX-_.left,Y=N.clientY-_.top,O=v(ee/o*i,0,i),U=v(127-Math.round(Y/l*127),0,127);t(s,U,O)};return r.jsxs("svg",{ref:u,width:o,height:l,style:{background:"var(--nice-bg-tertiary, #f3f3f3)",border:"1px solid var(--nice-border, #bbb)",cursor:p?"grabbing":"crosshair",display:"block"},onClick:w,onDoubleClick:L,tabIndex:0,children:[[...Array(9)].map((N,_)=>r.jsx("line",{x1:0,y1:_*l/8,x2:o,y2:_*l/8,stroke:"var(--nice-border-muted, #ddd)",strokeWidth:_===0||_===8?2:1},_)),f.length>1&&r.jsx("polyline",{fill:"none",stroke:"var(--nice-color-accent, #1976d2)",strokeWidth:2,points:f.map(N=>k(N).join(",")).join(" ")}),f.map(N=>{const[_,ee]=k(N);return r.jsxs("g",{children:[r.jsx("circle",{cx:_,cy:ee,r:x===N.id?8:6,fill:x===N.id?"var(--nice-color-accent, #1976d2)":"var(--nice-color-accent-light, #90caf9)",stroke:"var(--nice-color-accent, #1976d2)",strokeWidth:x===N.id?3:2,style:{cursor:"pointer"},onMouseDown:Y=>R(N,Y),onContextMenu:Y=>{Y.preventDefault(),a(N.id)},onClick:Y=>{Y.stopPropagation(),b(N.id)},onMouseOver:Y=>A(N),onMouseOut:I}),x===N.id&&r.jsx("foreignObject",{x:_+10,y:ee-18,width:90,height:30,style:{pointerEvents:"auto"},children:r.jsxs("div",{style:{fontSize:12,background:"var(--nice-color-surface, #fff)",border:"1px solid var(--nice-border, #bbb)",borderRadius:4,padding:"2px 6px",display:"inline-block"},children:[r.jsxs("label",{style:{marginRight:4},children:[h("ccLane.curve","Curve"),":"]}),r.jsxs("select",{value:N.handleType||c||"linear",onChange:Y=>{n(N.id,N.value,N.time,Y.target.value)},children:[r.jsx("option",{value:"linear",children:h("ccLane.linear","Linear")}),r.jsx("option",{value:"step",children:h("ccLane.step","Step")}),r.jsx("option",{value:"exp",children:h("ccLane.exponential","Exponential")})]})]})})]},N.id)}),T&&r.jsxs("g",{pointerEvents:"none",children:[r.jsx("rect",{x:T.x,y:T.y-18,width:90,height:20,fill:"var(--nice-color-surface, #fff)",stroke:"var(--nice-color-accent, #1976d2)",rx:4}),r.jsx("text",{x:T.x+6,y:T.y-4,fontSize:13,fill:"var(--nice-color-accent, #1976d2)",children:T.text})]}),r.jsxs("text",{x:6,y:16,fontSize:14,fill:"var(--nice-color-accent, #1976d2)",children:["CC",s]})]})},Jc=st.scoped("audioContext");let Gn=null;function qn(){if(!Gn)try{Gn=new(window.AudioContext||window.webkitAudioContext)}catch(e){Jc.error("Error initializing AudioContext:",e)}return Gn}async function Yt(){const e=qn();e&&e.state==="suspended"&&await e.resume()}function Ei(){return!!Gn&&Gn.state==="running"}function $i(e){const t=e.bpm/60;switch(e.snapMode){case"bar":return 4/t;case"beat":return 1/t;case"sub-beat":return 1/(t*4);case"second":default:return 1}}function ed(e,t){if(!t.snapEnabled)return e;const n=$i(t);return Math.round(e/n)*n}function td(e,t=!1){const n=Math.floor(e/60),a=Math.floor(e%60),s=Math.floor(e%1*1e3);return t?`${n}:${a.toString().padStart(2,"0")}.${s.toString().padStart(3,"0")}`:`${n}:${a.toString().padStart(2,"0")}`}function nd(e,t){const n=t/60,a=e*n,s=Math.floor(a/4),i=Math.floor(a%4);return`${s+1}:${i+1}`}function Ai(e,t,n=!0){const a=e.getContext("2d");if(!a)return;const s=30*t.zoom*t.duration,i=Math.max(80,30*t.zoom);e.width=s,e.height=i,a.clearRect(0,0,s,i),a.fillStyle=ke.resolveCssColor("var(--nice-color-surface, #f5f5f5)",a.canvas),a.fillRect(0,0,s,i);const o=s/t.duration;let l=1;o<30?l=5:o<60?l=2:o>150&&(l=.5),a.strokeStyle=ke.resolveCssColor("var(--nice-border-secondary, #ddd)",a.canvas),a.lineWidth=1;for(let c=0;c<=t.duration;c+=l){const u=c/t.duration*s,h=c%1===0;if(a.strokeStyle=ke.resolveCssColor(h?"var(--nice-border-secondary, #ccc)":"var(--nice-border-muted, #eee)",a.canvas),a.lineWidth=h?1.5:.5,a.beginPath(),a.moveTo(u,0),a.lineTo(u,i),a.stroke(),h&&o>40){a.fillStyle=ke.resolveCssColor("var(--nice-text-muted, #666)",a.canvas),a.font="10px monospace",a.textAlign="center";const p=n?nd(c,t.bpm):td(c);a.fillText(p,u,12)}}if(t.snapEnabled){const c=$i(t);a.strokeStyle=ke.resolveCssColor("var(--nice-color-accent, #ffeb3b)",a.canvas),a.lineWidth=.5;for(let u=0;u<=t.duration;u+=c){const h=u/t.duration*s;a.beginPath(),a.moveTo(h,i-5),a.lineTo(h,i),a.stroke()}}}function rd(e,t,n,a){const s=e.getContext("2d");if(!s)return;const i=30*t.zoom*t.duration,o=Math.max(80,30*t.zoom),l=n/t.duration*i;Ai(e,t),s.strokeStyle=ke.resolveCssColor(a?"var(--nice-color-danger, #f44336)":"var(--nice-color-accent, #2196f3)",s.canvas),s.lineWidth=2,s.beginPath(),s.moveTo(l,0),s.lineTo(l,o),s.stroke(),s.fillStyle=ke.resolveCssColor(a?"var(--nice-color-danger, #f44336)":"var(--nice-color-accent, #2196f3)",s.canvas),s.beginPath(),s.moveTo(l,0),s.lineTo(l-5,-8),s.lineTo(l+5,-8),s.closePath(),s.fill()}function ad(e,t,n,a="var(--nice-color-success, #4caf50)"){const s=e.getContext("2d");if(!s||!(n!=null&&n.length))return;const i=30*t.zoom*t.duration,l=e.height/2,c=Math.max(10,l-6);s.save(),s.strokeStyle=ke.resolveCssColor(a,s.canvas),s.lineWidth=1,s.beginPath(),n.forEach((u,h)=>{const p=h/(n.length-1)*i,g=l-u*c;h===0?s.moveTo(p,g):s.lineTo(p,g)}),s.stroke(),s.restore()}const Ii=({zoom:e=1,duration:t=4,isPlaying:n,isRecording:a,currentTime:s,bpm:i=120,snapEnabled:o=!1,snapMode:l="beat",waveform:c,waveformColor:u,onCurrentTimeChange:h,onZoomChange:p})=>{const{t:g}=xe(),y=d.useRef(null),[m,x]=d.useState(!1),b=d.useRef(s);b.current=s;const f=d.useRef(t);f.current=t;const k=d.useRef(h);k.current=h;const v={bpm:i,snapEnabled:o,snapMode:l};d.useEffect(()=>{Yt();const P=y.current;if(!P)return;const A={zoom:e,duration:t,bpm:i,snapEnabled:o,snapMode:l};Ai(P,A),c!=null&&c.length&&ad(P,A,c,u),rd(P,A,s,a)},[e,t,s,a,i,o,l,c,u]),d.useEffect(()=>{if(!n)return;let P=performance.now(),A=0;const I=L=>{const N=Math.max(0,L-P)/1e3;P=L;const _=Math.min(b.current+N,f.current);b.current=_,k.current(_),_<f.current&&(A=requestAnimationFrame(I))};return A=requestAnimationFrame(I),()=>cancelAnimationFrame(A)},[n]);const w=P=>{x(!0),j(P)},R=P=>{m&&j(P)},M=()=>{x(!1)},j=P=>{if(!y.current)return;const A=y.current.getBoundingClientRect();let L=(P.clientX-A.left)/A.width*t;L=ed(L,v),h(Math.min(Math.max(L,0),t))},T=P=>{if(!p)return;P.preventDefault();const A=P.deltaY>0?-.1:.1,I=Math.max(.5,Math.min(5,e+A));p(I)};return r.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"10px"},children:r.jsx("canvas",{ref:y,style:{border:"1px solid black",backgroundColor:"white",width:`${30*e*t}px`,height:`${Math.max(80,30*e)}px`,cursor:m?"grabbing":"pointer"},onMouseDown:w,onMouseMove:R,onMouseUp:M,onMouseLeave:M,onWheel:T,role:"img","aria-label":g("audioTimeline.audioTimelineCanvas","Audio timeline canvas")})})},Xe=["var(--nice-primary, #2196f3)","var(--nice-danger, #e53935)","var(--nice-warning, #ffeb3b)","var(--nice-success, #43a047)","var(--nice-warning, #ff9800)","var(--nice-accent, #9c27b0)","var(--nice-info, #00bcd4)","var(--nice-warning, #ffc107)","var(--nice-success, #8bc34a)","var(--nice-danger, #f44336)","var(--nice-accent, #3f51b5)","var(--nice-text-secondary, #607d8b)","var(--nice-warning-dark, #795548)","var(--nice-warning, #cddc39)","var(--nice-accent, #673ab7)","var(--nice-success, #009688)"];function sd(e){for(const t of Xe)if(!e.includes(t))return t;return Xe[Math.floor(Math.random()*Xe.length)]}const ur=Xe.map((e,t)=>`var(--player-color-${t+1}, ${e})`);function id(e){for(let t=0;t<Xe.length;t++){const n=Xe[t],a=ur[t];if(!e.includes(n)&&!e.includes(a))return a}return ur[Math.floor(Math.random()*ur.length)]}const od="_panel_3bj7x_3",ld="_panelCompact_3bj7x_19",cd="_panelNarrow_3bj7x_25",dd="_panelWide_3bj7x_31",ud="_heading_3bj7x_37",hd="_row_3bj7x_53",pd="_field_3bj7x_65",fd="_buttonRow_3bj7x_71",md="_sliderW200_3bj7x_83",gd="_sliderW240_3bj7x_89",yd="_selectW160_3bj7x_95",vd="_inputW120_3bj7x_101",bd="_inputW160_3bj7x_107",xd="_inputW200_3bj7x_113",Sd="_noteText_3bj7x_123",kd="_noteTextMargin_3bj7x_131",wd="_presetDivider_3bj7x_145",Cd="_presetLabel_3bj7x_159",jd="_countInAlert_3bj7x_173",Md="_levelLabel_3bj7x_181",Rd="_levelMeter_3bj7x_189",Nd="_levelBar_3bj7x_205",Td="_panelInactive_3bj7x_225",Pd="_header_3bj7x_231",Ed="_title_3bj7x_245",$d="_grid2_3bj7x_257",Ad="_full_3bj7x_267",Id="_label_3bj7x_275",Ld="_grow_3bj7x_291",_d="_pushRight_3bj7x_299",zd="_alignStart_3bj7x_305",Dd="_toolbar_3bj7x_311",Fd="_subPanel_3bj7x_325",ye={panel:od,panelCompact:ld,panelNarrow:cd,panelWide:dd,heading:ud,row:hd,field:pd,buttonRow:fd,sliderW200:md,sliderW240:gd,selectW160:yd,inputW120:vd,inputW160:bd,inputW200:xd,noteText:Sd,noteTextMargin:kd,presetDivider:wd,presetLabel:Cd,countInAlert:jd,levelLabel:Md,levelMeter:Rd,levelBar:Nd,panelInactive:Td,header:Pd,title:Ed,grid2:$d,full:Ad,label:Id,grow:Ld,pushRight:_d,alignStart:zd,toolbar:Dd,subPanel:Fd},Tt=e=>Array.isArray(e)?e[0]??"":e,Li=({autoSaveMode:e,setAutoSaveMode:t,autoSaveInterval:n,setAutoSaveInterval:a})=>{const{t:s}=xe();return r.jsxs("div",{className:`${ye.panel} ${ye.panelNarrow}`,children:[r.jsx("h6",{className:ye.heading,children:s("editorPanels.autoSaveTitle","Project auto-save")}),r.jsx("div",{className:ye.field,children:r.jsx(ie.NiceSelect,{label:s("editorPanels.autoSaveMode","Auto-save mode"),size:"sm",value:e,onChange:i=>t(Tt(i)),options:[{value:"off",label:s("editorPanels.off","Off")},{value:"onChange",label:s("editorPanels.onChange","On every change")},{value:"interval",label:s("editorPanels.interval","At set interval")},{value:"both",label:s("editorPanels.both","Both")}]})}),(e==="interval"||e==="both")&&r.jsx("div",{className:ye.field,children:r.jsx(ie.NiceNumberInput,{label:s("editorPanels.autoSaveFrequency","Auto-save frequency (seconds)"),size:"sm",min:5,max:600,value:n,onChange:i=>a(Math.max(5,Math.min(600,i??5)))})}),r.jsxs("div",{className:ye.noteText,children:[r.jsxs("b",{children:[s("editorPanels.noteLabel","Note"),":"]})," ",s("editorPanels.autoSaveNote","Auto-save works locally (localStorage/browser). Manual save (PUT) always overwrites the project on the server.")]})]})},_i=({undoCount:e,redoCount:t,onUndo:n,onRedo:a})=>{const{t:s}=xe();return r.jsxs("div",{className:`${ye.panel} ${ye.panelNarrow}`,children:[r.jsx("h6",{className:ye.heading,children:s("editorPanels.changeHistory","Project change history")}),r.jsxs("div",{className:ye.buttonRow,children:[r.jsxs(ie.NiceButton,{variant:"secondary",size:"sm",onClick:n,disabled:e===0,title:s("editorPanels.undoTitle","Undo last change (Ctrl+Z)"),children:[r.jsx(F.NtdUndo,{size:14})," ",s("editorPanels.undo","Undo")]}),r.jsxs(ie.NiceButton,{variant:"secondary",size:"sm",onClick:a,disabled:t===0,title:s("editorPanels.redoTitle","Redo change (Ctrl+Y or Ctrl+Shift+Z)"),children:[r.jsx(F.NtdRedo,{size:14})," ",s("editorPanels.redo","Redo")]})]}),r.jsx("div",{className:ye.noteTextMargin,children:s("editorPanels.undoRedoNote","Undo/Redo works on the entire project (all editor changes). After each change Redo is cleared.")})]})},bs=e=>`${e.toFixed(1)}x`,$a=({zoom:e,setZoom:t,uiZoom:n,setUiZoom:a,snapEnabled:s,onToggleSnap:i,snapMode:o,onSnapModeChange:l,bpm:c,setBpm:u})=>{const{t:h}=xe();return r.jsx("div",{className:`${ye.panel} ${ye.panelCompact} ${ye.panelNarrow}`,children:r.jsxs("div",{className:ye.row,children:[r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{label:h("editorPanels.zoom","Zoom"),size:"sm",min:.5,max:5,step:.1,value:e,onChange:t,showValue:!0,formatValue:bs})}),r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{label:h("editorPanels.uiZoom","Zoom UI"),size:"sm",min:1,max:4,step:.1,value:n,onChange:a,showValue:!0,formatValue:bs})}),r.jsx(ie.NiceCheckbox,{label:h("editorPanels.snap","Snap"),size:"sm",checked:s,onChange:()=>i()}),s&&r.jsx("div",{className:ye.selectW160,children:r.jsx(ie.NiceSelect,{size:"sm","aria-label":h("editorPanels.snapTo","Snap to"),value:o,onChange:p=>l(Tt(p)),options:[{value:"bar",label:h("editorPanels.snapBar","Bar")},{value:"beat",label:h("editorPanels.snapBeat","Beat")},{value:"sub-beat",label:h("editorPanels.snap16","1/16")},{value:"second",label:h("editorPanels.snapSecond","Second")}]})}),r.jsx("div",{className:ye.inputW120,children:r.jsx(ie.NiceNumberInput,{label:h("editorPanels.bpm","BPM"),size:"sm",min:20,max:300,value:c,onChange:p=>u(p??c)})})]})})},Od=[["peaking","Peaking"],["lowpass","Low-pass"],["highpass","High-pass"],["lowshelf","Low shelf"],["highshelf","High shelf"],["notch","Notch"],["bandpass","Band-pass"]],zi=({masterVolume:e,onMasterVolumeChange:t,filterType:n,filterFreq:a,filterQ:s,filterGain:i,onFilterChange:o,masterEQPresets:l,customPresets:c,onLoadPreset:u,onSavePreset:h,onDeletePreset:p})=>{const{t:g}=xe(),[y,m]=d.useState(""),x=()=>{y.trim()&&(h(y.trim()),m(""))};return r.jsxs("div",{className:`${ye.panel} ${ye.panelCompact} ${ye.panelWide}`,children:[r.jsxs("div",{className:ye.row,children:[r.jsx("div",{className:ye.sliderW240,children:r.jsx(ie.NiceSlider,{label:g("editorPanels.masterVolume","Master Vol"),size:"sm",min:0,max:1,step:.01,value:e,onChange:t,showValue:!0,formatValue:b=>`${Math.round(b*100)}%`})}),r.jsx("div",{className:ye.selectW160,children:r.jsx(ie.NiceSelect,{label:g("editorPanels.filter","Filter"),size:"sm",value:n,onChange:b=>o({type:Tt(b)}),options:Od.map(([b,f])=>({value:b,label:g(`editorPanels.filter.${b}`,f)}))})}),r.jsx("div",{className:ye.sliderW240,children:r.jsx(ie.NiceSlider,{label:g("editorPanels.frequency","Freq"),size:"sm",min:40,max:12e3,step:10,value:a,onChange:b=>o({frequency:b}),showValue:!0,formatValue:b=>`${Math.round(b)} Hz`})}),r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{label:"Q",size:"sm",min:.1,max:12,step:.1,value:s,onChange:b=>o({q:b}),showValue:!0,formatValue:b=>b.toFixed(1)})}),(n==="peaking"||n==="lowshelf"||n==="highshelf")&&r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{label:g("editorPanels.gain","Gain"),size:"sm",min:-18,max:18,step:.5,value:i,onChange:b=>o({gain:b}),showValue:!0,formatValue:b=>`${b.toFixed(1)} dB`})})]}),r.jsxs("div",{className:ye.presetDivider,children:[r.jsxs("div",{className:ye.row,children:[r.jsxs("span",{className:ye.presetLabel,children:[g("editorPanels.eqPresets","EQ Presets"),":"]}),[...l,...c].map(b=>r.jsx(ie.NiceButton,{variant:"outline",size:"xs",onClick:()=>u(b),children:b.name},b.name)),c.length>0&&r.jsx("div",{className:ye.selectW160,children:r.jsx(ie.NiceSelect,{size:"sm","aria-label":g("editorPanels.deletePreset","Delete preset..."),placeholder:g("editorPanels.deletePreset","Delete preset..."),value:"",onChange:b=>{const f=Tt(b);f&&p(f)},options:c.map(b=>({value:b.name,label:b.name}))})})]}),r.jsxs("div",{className:ye.row,children:[r.jsx("div",{className:ye.inputW200,children:r.jsx(ie.NiceTextInput,{size:"sm",controlWidth:"100%","aria-label":g("editorPanels.presetName","Preset name..."),placeholder:g("editorPanels.presetName","Preset name..."),value:y,onChange:m,onKeyDown:b=>b.key==="Enter"&&x()})}),r.jsx(ie.NiceButton,{variant:"success",size:"xs",onClick:x,disabled:!y.trim(),children:g("editorPanels.saveCurrent","Save Current")})]})]})]})},Di=({countInBars:e,setCountInBars:t,isCountIn:n,countInRemaining:a,overdubEnabled:s,setOverdubEnabled:i,punchIn:o,setPunchIn:l,punchOut:c,setPunchOut:u,monitorLevel:h})=>{const{t:p}=xe();return r.jsx("div",{className:`${ye.panel} ${ye.panelCompact} ${ye.panelWide}`,children:r.jsxs("div",{className:ye.row,children:[r.jsx("div",{className:ye.inputW200,children:r.jsx(ie.NiceNumberInput,{label:p("editorPanels.countIn","Count-in (bars)"),size:"sm",min:0,max:8,step:1,value:e,onChange:g=>t(g??0)})}),n&&r.jsx("span",{className:ye.countInAlert,children:p("editorPanels.countInRemaining","Count-in: {seconds}s").replace("{seconds}",a.toFixed(1))}),r.jsx(ie.NiceCheckbox,{label:p("editorPanels.overdub","Overdub (play background)"),size:"sm",checked:s,onChange:i}),r.jsx("div",{className:ye.inputW160,children:r.jsx(ie.NiceNumberInput,{label:p("editorPanels.punchIn","Punch In (s)"),size:"sm",min:0,step:.1,value:o,onChange:l})}),r.jsx("div",{className:ye.inputW160,children:r.jsx(ie.NiceNumberInput,{label:p("editorPanels.punchOut","Punch Out (s)"),size:"sm",min:0,step:.1,value:c,onChange:u})}),r.jsx(ie.NiceButton,{variant:"outline",size:"xs",onClick:()=>{l(null),u(null)},children:p("editorPanels.clearPunch","Clear punch")}),r.jsx("div",{className:ye.levelLabel,children:p("editorPanels.level","Level")}),r.jsx("div",{className:ye.levelMeter,role:"meter","aria-label":p("editorPanels.level","Level"),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(Math.min(1,h*2)*100),children:r.jsx("div",{className:ye.levelBar,style:{width:`${Math.min(1,h*2)*100}%`,background:h>.7?"var(--nice-danger, #f44336)":"var(--nice-success, #4caf50)"}})})]})})},Bd=[{id:1,name:"Audio 1",type:"audio",color:Xe[0],volume:.8,audioBlob:null},{id:2,name:"MIDI 1",type:"midi",color:Xe[1],volume:.8,notes:[]}],Gd=({initialTracks:e,tracks:t,onTracksChange:n,initialBpm:a=120,duration:s=30,height:i=480,title:o,displayMode:l="standard",onNew:c,onOpen:u,onSave:h,onExport:p,t:g})=>{var ae,ce;const{t:y}=xe(),m=g??y,x=o??m("audioStudio.untitledProject","Untitled project"),[b,f]=d.useState(l),k=b==="advanced",v=b!=="basic",[w,R]=d.useState(e??Bd),M=t??w,j=d.useCallback(le=>{t===void 0&&R(le),n==null||n(le)},[t,n]),[T,P]=d.useState(!1),[A,I]=d.useState(0),[L,N]=d.useState(1),[_,ee]=d.useState(2),[Y,O]=d.useState(!0),[U,V]=d.useState("beat"),[K,G]=d.useState(a),[W,C]=d.useState(80),[$,S]=d.useState(((ae=M[0])==null?void 0:ae.id)??null),B=d.useRef(0),H=d.useRef(0);d.useEffect(()=>{if(!T)return;H.current=performance.now();const le=ne=>{const pe=(ne-H.current)/1e3;H.current=ne,I(fe=>{const me=fe+pe;return me>=s?(P(!1),s):me}),B.current=requestAnimationFrame(le)};return B.current=requestAnimationFrame(le),()=>cancelAnimationFrame(B.current)},[T,s]);const z=d.useCallback((le,ne)=>j(M.map(pe=>pe.id===le?{...pe,...ne}:pe)),[M,j]),Z=d.useCallback(le=>{const ne=M.reduce((fe,me)=>Math.max(fe,me.id),0)+1,pe=M.filter(fe=>fe.type===le).length+1;j([...M,{id:ne,name:`${le==="audio"?"Audio":"MIDI"} ${pe}`,type:le,color:Xe[M.length%Xe.length],volume:.8,...le==="audio"?{audioBlob:null}:{notes:[]}}]),S(ne)},[M,j]),E=d.useCallback(le=>j(M.filter(ne=>ne.id!==le)),[M,j]),q=d.useCallback(()=>{if(c){c();return}j([]),I(0),P(!1)},[c,j]),X=d.useCallback((le,ne,pe,fe)=>{const me=M.find(je=>je.id===le),he=(me==null?void 0:me.notes)??[],we=he.reduce((je,Ne)=>Math.max(je,Ne.id),0)+1;z(le,{notes:[...he,{id:we,pitch:ne,start:pe,duration:fe,velocity:100}]})},[M,z]),re=d.useCallback((le,ne)=>{const pe=M.find(fe=>fe.id===le);z(le,{notes:((pe==null?void 0:pe.notes)??[]).filter(fe=>fe.id!==ne)})},[M,z]),oe=d.useMemo(()=>{const le=Math.floor(A/60),ne=Math.floor(A%60),pe=Math.floor(A%1*100);return`${le}:${ne.toString().padStart(2,"0")}.${pe.toString().padStart(2,"0")}`},[A]),se=d.useMemo(()=>{const le=(pe,fe)=>({id:`mode-${pe}`,label:`${b===pe?"• ":" "}${fe}`,onClick:()=>f(pe)}),ne=[{id:"file",label:m("studio.menu.file","File"),children:[{id:"new",label:m("studio.menu.new","New"),onClick:q},...u?[{id:"open",label:m("studio.menu.open","Open…"),onClick:u}]:[],{id:"save",label:m("studio.menu.save","Save"),onClick:()=>h==null?void 0:h(M)},{id:"export",label:m("studio.menu.export","Export…"),onClick:()=>p==null?void 0:p(M)}]}];return v&&ne.push({id:"edit",label:m("studio.menu.edit","Edit"),children:[{id:"add-audio",label:m("studio.addAudio","Add audio track"),onClick:()=>Z("audio")},{id:"add-midi",label:m("studio.addMidi","Add MIDI track"),onClick:()=>Z("midi")}]}),ne.push({id:"view",label:m("studio.menu.view","View"),children:[{id:"modes",label:m("studio.menu.modes","Display mode"),divider:!1,disabled:!0},le("basic",m("studio.mode.basic","Basic")),le("standard",m("studio.mode.standard","Standard")),le("advanced",m("studio.mode.advanced","Advanced")),{id:"d1",divider:!0},{id:"snap",label:`${Y?"• ":" "}${m("studio.snap","Snap to grid")}`,onClick:()=>O(pe=>!pe)}]}),ne.push({id:"help",label:m("studio.menu.help","Help"),children:[{id:"about",label:m("studio.menu.about","About NiceAudioStudio"),disabled:!0}]}),ne},[m,b,v,Y,q,u,h,p,M,Z]),D=r.jsxs(r.Fragment,{children:[r.jsxs(ie.NiceButton,{variant:"primary",size:"sm",onClick:()=>P(le=>!le),children:[T?r.jsx(F.NtdPause,{size:14}):r.jsx(F.NtdPlay,{size:14})," ",T?m("studio.pause","Pause"):m("studio.play","Play")]}),r.jsxs(ie.NiceButton,{variant:"secondary",size:"sm",onClick:()=>{P(!1),I(0)},children:[r.jsx(F.NtdStop,{size:14})," ",m("studio.stop","Stop")]}),r.jsx("span",{style:{fontVariantNumeric:"tabular-nums",fontWeight:700,minWidth:80},children:oe}),r.jsx("span",{style:{flex:1}}),r.jsxs(ie.NiceButton,{variant:"outline",size:"sm",onClick:()=>Z("audio"),children:[r.jsx(F.NtdPlus,{size:14})," ",m("studio.addAudioShort","Audio")]}),v&&r.jsxs(ie.NiceButton,{variant:"outline",size:"sm",onClick:()=>Z("midi"),children:[r.jsx(F.NtdPlus,{size:14})," ",m("studio.addMidiShort","MIDI")]}),r.jsx("span",{style:{fontSize:12,color:"var(--nice-text-muted, #94a3b8)"},children:m("studio.master","Master")}),r.jsx("div",{style:{width:90},children:r.jsx(ie.NiceSlider,{value:W,onChange:C,min:0,max:100})})]}),J=r.jsxs(r.Fragment,{children:[r.jsxs("span",{children:[K," BPM"]}),r.jsx("span",{children:"·"}),r.jsx("span",{style:{fontVariantNumeric:"tabular-nums"},children:oe}),r.jsx("span",{children:"·"}),r.jsxs("span",{children:[M.length," ",m("studio.tracks","tracks")]}),k&&$!=null&&r.jsxs(r.Fragment,{children:[r.jsx("span",{children:"·"}),r.jsxs("span",{children:[m("studio.active","Active"),": ",((ce=M.find(le=>le.id===$))==null?void 0:ce.name)??"—"]})]}),r.jsx("span",{style:{flex:1}}),r.jsx("span",{style:{textTransform:"capitalize"},children:b})]});return r.jsxs(ie.NiceAppShell,{className:"nice-audio-studio",height:i,menubar:r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12},children:[r.jsx(ie.NiceMenu,{items:se,orientation:"horizontal"}),r.jsx("span",{style:{color:"var(--nice-text-secondary)",fontSize:13},children:x})]}),toolbar:D,statusBar:J,children:[v&&r.jsx("div",{style:{padding:"6px 12px",borderBottom:"1px solid var(--nice-border-color)"},children:r.jsx($a,{zoom:L,setZoom:N,uiZoom:_,setUiZoom:ee,snapEnabled:Y,onToggleSnap:()=>O(le=>!le),snapMode:U,onSnapModeChange:V,bpm:K,setBpm:G})}),r.jsx("div",{style:{padding:8},children:r.jsx(Ii,{zoom:L,duration:s,isPlaying:T,isRecording:!1,currentTime:A,bpm:K,snapEnabled:Y,snapMode:U,onCurrentTimeChange:I,onZoomChange:N})}),M.length===0?r.jsx("div",{style:{padding:32,textAlign:"center",color:"var(--nice-text-muted, #94a3b8)"},children:m("studio.empty","No tracks — add an audio or MIDI track to start.")}):M.map(le=>r.jsxs("div",{onFocus:()=>S(le.id),style:{display:"flex",gap:8,padding:8,borderTop:"1px solid var(--nice-border-color)",background:$===le.id?"color-mix(in srgb, var(--nice-color-primary) 8%, transparent)":"transparent"},onClick:()=>S(le.id),children:[r.jsxs("div",{style:{flex:"0 0 180px",display:"flex",flexDirection:"column",gap:6},children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[r.jsx("span",{style:{width:10,height:10,borderRadius:"50%",background:le.color||Xe[0],flex:"0 0 auto"}}),r.jsx("div",{style:{flex:1},children:r.jsx(ie.NiceTextInput,{value:le.name,onChange:ne=>z(le.id,{name:ne}),size:"sm"})})]}),r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4},children:[r.jsx(ie.NiceButton,{variant:le.muted?"danger":"ghost",size:"sm",onClick:()=>z(le.id,{muted:!le.muted}),children:"M"}),v&&r.jsx(ie.NiceButton,{variant:le.solo?"warning":"ghost",size:"sm",onClick:()=>z(le.id,{solo:!le.solo}),children:"S"}),r.jsx("div",{style:{flex:1},children:r.jsx(ie.NiceSlider,{value:Math.round((le.volume??.8)*100),onChange:ne=>z(le.id,{volume:ne/100}),min:0,max:100})}),r.jsx(ie.NiceButton,{variant:"ghost",size:"sm",onClick:()=>E(le.id),children:r.jsx(F.NtdClose,{size:14})})]})]}),r.jsx("div",{style:{flex:1,minWidth:0,opacity:le.muted?.5:1},children:le.type==="audio"?r.jsx(Pi,{audioBlob:le.audioBlob??null,currentTime:A,duration:s,zoom:L,height:80,waveColor:le.color,onSeek:I}):r.jsx(Ea,{notes:le.notes??[],onAddNote:(ne,pe,fe)=>X(le.id,ne,pe,fe),onRemoveNote:ne=>re(le.id,ne),duration:s,zoom:L})})]},le.id))]})},Fi=({data:e,width:t=200,height:n=40,color:a="var(--nice-accent, #8b5cf6)",progress:s=0,onClick:i})=>{const o=d.useRef(null);d.useEffect(()=>{const c=o.current;if(!c||!e)return;const u=c.getContext("2d");if(!u)return;const h=window.devicePixelRatio||1;c.width=t*h,c.height=n*h,u.scale(h,h),u.clearRect(0,0,t,n);const p=t/e.length,g=n/2;for(let y=0;y<e.length;y++){const m=y*p,x=e[y]*n*.9,b=y/e.length<s;u.fillStyle=b?a:`${a}66`,u.fillRect(m,g-x/2,Math.max(1,p-1),x)}s>0&&s<1&&(u.strokeStyle=ke.resolveCssColor("var(--nice-bg, #fff)",u.canvas),u.lineWidth=2,u.beginPath(),u.moveTo(s*t,0),u.lineTo(s*t,n),u.stroke())},[e,t,n,a,s]);const l=d.useCallback(c=>{if(!i)return;const u=c.currentTarget.getBoundingClientRect(),h=c.clientX-u.left;i(h/u.width)},[i]);return r.jsx("canvas",{ref:o,className:"nice-sample-waveform",width:t,height:n,style:{width:t,height:n},onClick:l})},Wd=({sample:e,isSelected:t,isPlaying:n,playProgress:a,showWaveform:s,showAnalysis:i,onSelect:o,onPlay:l,onStop:c,onDragStart:u,onFavorite:h})=>{const{t:p}=xe(),g=m=>{const x=Math.floor(m/60),b=Math.floor(m%60);return`${x}:${b.toString().padStart(2,"0")}`},y=m=>m<1024?`${m} B`:m<1024*1024?`${(m/1024).toFixed(1)} KB`:`${(m/(1024*1024)).toFixed(1)} MB`;return r.jsxs("div",{className:`nice-sample-row ${t?"nice-sample-row--selected":""} ${n?"nice-sample-row--playing":""}`,onClick:o,draggable:!0,onDragStart:u,children:[r.jsx("button",{type:"button",className:"nice-sample-row__play",onClick:m=>{m.stopPropagation(),n?c():l()},"aria-label":n?p("sampleBrowser.stop","Stop"):p("sampleBrowser.play","Play"),title:n?p("sampleBrowser.stop","Stop"):p("sampleBrowser.play","Play"),children:n?r.jsx(F.NtdStop,{size:14}):r.jsx(F.NtdPlay,{size:14})}),r.jsx("button",{type:"button",className:`nice-sample-row__fav ${e.favorite?"nice-sample-row__fav--active":""}`,onClick:m=>{m.stopPropagation(),h()},"aria-label":p("sampleBrowser.favorite","Favorite"),children:r.jsx(F.NtdStar,{size:14,style:{color:e.favorite?"var(--nice-warning, #facc15)":"var(--nice-text-muted)"}})}),r.jsx("div",{className:"nice-sample-row__name",title:e.name,children:e.name}),s&&r.jsx("div",{className:"nice-sample-row__waveform",children:r.jsx(Fi,{data:e.waveformData,progress:a})}),r.jsx("div",{className:"nice-sample-row__duration",children:g(e.duration)}),i&&r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"nice-sample-row__bpm",children:e.bpm?`${e.bpm} BPM`:"—"}),r.jsx("div",{className:"nice-sample-row__key",children:e.key||"—"})]}),r.jsx("div",{className:"nice-sample-row__size",children:y(e.fileSize)}),e.tags&&e.tags.length>0&&r.jsx("div",{className:"nice-sample-row__tags",children:e.tags.slice(0,2).map(m=>r.jsx("span",{className:"nice-sample-row__tag",children:m},m))})]})},Vd=({folders:e=[],samples:t=[],onSampleSelect:n,onSampleDragStart:a,onFolderSelect:s,onAnalyze:i,audioContext:o,showWaveform:l=!0,showAnalysis:c=!0,sortBy:u="name",sortDirection:h="asc",filterTags:p,searchQuery:g="",className:y=""})=>{const{t:m}=xe(),[x,b]=d.useState(null),[f,k]=d.useState(null),[v,w]=d.useState(null),[R,M]=d.useState(0),[j,T]=d.useState(new Map),[P,A]=d.useState(t),I=d.useRef(null),L=d.useRef(null);d.useEffect(()=>(I.current=new Audio,I.current.addEventListener("ended",()=>{w(null),M(0)}),()=>{I.current&&(I.current.pause(),I.current=null),L.current&&clearInterval(L.current)}),[]);const N=d.useMemo(()=>{let K=[...P];if(g){const G=g.toLowerCase();K=K.filter(W=>{var C;return W.name.toLowerCase().includes(G)||((C=W.tags)==null?void 0:C.some($=>$.toLowerCase().includes(G)))})}return p&&p.length>0&&(K=K.filter(G=>{var W;return(W=G.tags)==null?void 0:W.some(C=>p.includes(C))})),f&&(K=f.samples||[]),K.sort((G,W)=>{var $,S;let C=0;switch(u){case"name":C=G.name.localeCompare(W.name);break;case"duration":C=G.duration-W.duration;break;case"bpm":C=(G.bpm||0)-(W.bpm||0);break;case"key":C=(G.key||"").localeCompare(W.key||"");break;case"date":C=((($=G.dateAdded)==null?void 0:$.getTime())||0)-(((S=W.dateAdded)==null?void 0:S.getTime())||0);break}return h==="asc"?C:-C}),K},[P,g,p,f,u,h]),_=d.useCallback(K=>{b(K),n==null||n(K)},[n]),ee=d.useCallback(async K=>{if(I.current&&(I.current.pause(),L.current&&clearInterval(L.current),I.current.src=K.url||K.path,I.current.play(),w(K.id),M(0),L.current=window.setInterval(()=>{I.current&&M(I.current.currentTime/I.current.duration)},50),c&&!j.has(K.id)&&i))try{const G=await i(K);T(W=>new Map(W).set(K.id,G)),A(W=>W.map(C=>C.id===K.id?{...C,bpm:G.bpm,key:G.key,waveformData:G.waveformData}:C))}catch(G){console.error("Failed to analyze sample:",G)}},[c,j,i]),Y=d.useCallback(()=>{I.current&&(I.current.pause(),I.current.currentTime=0),L.current&&clearInterval(L.current),w(null),M(0)},[]),O=d.useCallback(K=>{A(G=>G.map(W=>W.id===K?{...W,favorite:!W.favorite}:W))},[]),U=d.useCallback((K,G)=>{G.dataTransfer.setData("application/json",JSON.stringify(K)),G.dataTransfer.effectAllowed="copy",a==null||a(K,G)},[a]),V=(K,G=0)=>{var W;return r.jsxs("div",{className:"nice-sample-folder",style:{paddingLeft:G*16},children:[r.jsxs("button",{type:"button",className:`nice-sample-folder__btn ${(f==null?void 0:f.id)===K.id?"nice-sample-folder__btn--selected":""}`,onClick:()=>{k(K),s==null||s(K)},children:[r.jsx("span",{className:"nice-sample-folder__icon","aria-hidden":"true",children:r.jsx(F.NtdFolder,{size:14})}),r.jsx("span",{className:"nice-sample-folder__name",children:K.name}),K.samples&&r.jsx("span",{className:"nice-sample-folder__count",children:K.samples.length})]}),(W=K.children)==null?void 0:W.map(C=>V(C,G+1))]},K.id)};return r.jsxs("div",{className:`nice-sample-browser ${y}`,children:[e.length>0&&r.jsx("div",{className:"nice-sample-browser__sidebar",children:r.jsxs("div",{className:"nice-sample-browser__folders",children:[r.jsxs("button",{type:"button",className:`nice-sample-folder__btn ${f?"":"nice-sample-folder__btn--selected"}`,onClick:()=>k(null),children:[r.jsx("span",{className:"nice-sample-folder__icon","aria-hidden":"true",children:r.jsx(F.NtdMusic,{size:14})}),r.jsx("span",{className:"nice-sample-folder__name",children:m("sampleBrowser.allSamples","All Samples")}),r.jsx("span",{className:"nice-sample-folder__count",children:P.length})]}),e.map(K=>V(K))]})}),r.jsxs("div",{className:"nice-sample-browser__main",children:[r.jsxs("div",{className:"nice-sample-browser__header",children:[r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--play"}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--fav"}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--name",children:m("sampleBrowser.name","Name")}),l&&r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--waveform",children:m("sampleBrowser.waveform","Waveform")}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--duration",children:m("sampleBrowser.duration","Duration")}),c&&r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--bpm",children:"BPM"}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--key",children:m("sampleBrowser.key2","Key")})]}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--size",children:m("sampleBrowser.size","Size")}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--tags",children:m("sampleBrowser.tags","Tags")})]}),r.jsx("div",{className:"nice-sample-browser__list",children:N.length===0?r.jsx("div",{className:"nice-sample-browser__empty",children:m("sampleBrowser.noSamplesFound","No samples found")}):N.map(K=>r.jsx(Wd,{sample:K,isSelected:(x==null?void 0:x.id)===K.id,isPlaying:v===K.id,playProgress:v===K.id?R:0,showWaveform:l,showAnalysis:c,onSelect:()=>_(K),onPlay:()=>ee(K),onStop:Y,onDragStart:G=>U(K,G),onFavorite:()=>O(K.id)},K.id))})]}),x&&r.jsxs("div",{className:"nice-sample-browser__preview",children:[r.jsx("h3",{className:"nice-sample-browser__preview-title",children:x.name}),r.jsx(Fi,{data:x.waveformData,width:300,height:80,progress:v===x.id?R:0}),r.jsxs("div",{className:"nice-sample-browser__preview-info",children:[r.jsx("div",{children:m("sampleBrowser.durationS","Duration: {duration}s").replace("{duration}",String(x.duration.toFixed(2)))}),r.jsx("div",{children:m("sampleBrowser.sampleRateHz","Sample Rate: {sampleRate} Hz").replace("{sampleRate}",String(x.sampleRate))}),r.jsx("div",{children:m("sampleBrowser.channels","Channels: {channels}").replace("{channels}",String(x.channels))}),x.bpm&&r.jsx("div",{children:m("sampleBrowser.bpm","BPM: {bpm}").replace("{bpm}",String(x.bpm))}),x.key&&r.jsx("div",{children:m("sampleBrowser.key","Key: {key}").replace("{key}",String(x.key))})]})]})]})};function Oi(e){return{past:[],present:e,future:[]}}function Bi(e,t){return{past:[...e.past.slice(-99),e.present],present:t,future:[]}}function Gi(e){if(e.past.length===0)return e;const t=e.past[e.past.length-1];return{past:e.past.slice(0,-1),present:t,future:[e.present,...e.future]}}function Wi(e){if(e.future.length===0)return e;const t=e.future[0];return{past:[...e.past,e.present],present:t,future:e.future.slice(1)}}function Vi(e){return e.past.length>0}function Ui(e){return e.future.length>0}function da(e,t){return e.filter(n=>n.time>=t.start&&n.time<=t.end).map(n=>({...n}))}function qi(e,t,n){if(t.length===0)return e;const a=Math.min(...t.map(o=>o.time)),s=n-a,i=t.map(o=>({...o,id:Date.now()+Math.floor(Math.random()*1e4)+o.id,time:o.time+s}));return[...e,...i]}function Hi(e,t){const n=[],a=[];for(const s of e)s.time>=t.start&&s.time<=t.end?n.push({...s}):a.push(s);return{remaining:a,cut:n}}function Ki(e,t){return e.filter(n=>n.time<t.start||n.time>t.end)}function Ud(e,t){return e.filter(n=>n.time>=t.start&&n.time<=t.end).map(n=>n.id)}function Yi(e,t,n,a){const s={id:Date.now()+Math.floor(Math.random()*1e4),cc:t,value:n,time:a};return[...e,s]}function Zi(e,t=3){if(e.length<=2)return e;const n=[...e].sort((s,i)=>s.time-i.time),a=[n[0]];for(let s=1;s<n.length-1;s++)s%t===0&&a.push(n[s]);return a.push(n[n.length-1]),a}function Xi(e){return JSON.stringify(e,null,2)}function Qi(e){try{const t=JSON.parse(e);return Array.isArray(t)?t.filter(n=>typeof n=="object"&&n!==null&&"id"in n&&"cc"in n&&"value"in n&&"time"in n):[]}catch{return[]}}function gt(e,t){var n;return((n=e.find(a=>a.layerId===t))==null?void 0:n.events)??[]}function jt(e,t,n){return e.find(s=>s.layerId===t)?e.map(s=>s.layerId===t?{...s,events:n}:s):[...e,{layerId:t,events:n}]}function qd(e,t){switch(t.type){case"UNDO":return Gi(e);case"REDO":return Wi(e);default:{let n=e.present;switch(t.type){case"ADD_EVENT":{const a=[...gt(n,t.layerId),t.event];n=jt(n,t.layerId,a);break}case"UPDATE_EVENT":{const a=gt(n,t.layerId).map(s=>s.id===t.id?{...s,value:t.value,time:t.time,handleType:t.handleType??s.handleType}:s);n=jt(n,t.layerId,a);break}case"REMOVE_EVENT":{const a=gt(n,t.layerId).filter(s=>s.id!==t.id);n=jt(n,t.layerId,a);break}case"SET_EVENTS":n=jt(n,t.layerId,t.events);break;case"PASTE":{const a=gt(n,t.layerId),s=qi(a,t.clipboard,t.targetTime);n=jt(n,t.layerId,s);break}case"CUT":{const a=gt(n,t.layerId),{remaining:s}=Hi(a,t.range);n=jt(n,t.layerId,s);break}case"DELETE_RANGE":{const a=gt(n,t.layerId),s=Ki(a,t.range);n=jt(n,t.layerId,s);break}case"RECORD":{const a=gt(n,t.layerId),s=Yi(a,t.cc,t.value,t.time);n=jt(n,t.layerId,s);break}case"THIN":{const a=gt(n,t.layerId),s=Zi(a,t.keepEveryN);n=jt(n,t.layerId,s);break}case"IMPORT":{const a=Qi(t.json);a.length>0&&(n=jt(n,t.layerId,a));break}}return Bi(e,n)}}}function Ji(e=[]){const[t,n]=d.useReducer(qd,Oi(e)),a=d.useRef([]),s=d.useCallback(v=>gt(t.present,v),[t.present]),i=d.useCallback((v,w)=>n({type:"ADD_EVENT",layerId:v,event:w}),[]),o=d.useCallback((v,w,R,M,j)=>n({type:"UPDATE_EVENT",layerId:v,id:w,value:R,time:M,handleType:j}),[]),l=d.useCallback((v,w)=>n({type:"REMOVE_EVENT",layerId:v,id:w}),[]),c=d.useCallback((v,w)=>n({type:"SET_EVENTS",layerId:v,events:w}),[]),u=d.useCallback(()=>n({type:"UNDO"}),[]),h=d.useCallback(()=>n({type:"REDO"}),[]),p=d.useCallback((v,w)=>{a.current=da(gt(t.present,v),w)},[t.present]),g=d.useCallback((v,w)=>{a.current=da(gt(t.present,v),w),n({type:"CUT",layerId:v,range:w})},[t.present]),y=d.useCallback((v,w)=>{a.current.length>0&&n({type:"PASTE",layerId:v,clipboard:a.current,targetTime:w})},[]),m=d.useCallback((v,w)=>n({type:"DELETE_RANGE",layerId:v,range:w}),[]),x=d.useCallback((v,w,R,M)=>n({type:"RECORD",layerId:v,cc:w,value:R,time:M}),[]),b=d.useCallback((v,w)=>n({type:"THIN",layerId:v,keepEveryN:w}),[]),f=d.useCallback(v=>Xi(gt(t.present,v)),[t.present]),k=d.useCallback((v,w)=>n({type:"IMPORT",layerId:v,json:w}),[]);return{snapshots:t.present,getEvents:s,addEvent:i,updateEvent:o,removeEvent:l,setEvents:c,undo:u,redo:h,canUndo:Vi(t),canRedo:Ui(t),copy:p,cut:g,paste:y,clipboard:a.current,deleteRange:m,record:x,thin:b,exportLane:f,importLane:k}}let Hd=Date.now();function yn(){return Hd++}function Kd(e,t,n=.01){if(e.length===0)return[];const a=[];let s=-1/0;for(const i of e)i.time-s>=n&&(a.push({id:yn(),cc:t,value:vn(i.value),time:i.time}),s=i.time);return a}function xs(e,t,n,a=32){const s=[];for(let i=0;i<=a;i++){const o=i/a;s.push({id:yn(),cc:n,value:vn(jr(e.value,t.value,o)),time:jr(e.time,t.time,o)})}return s}function Yd(e,t,n,a,s=48){const i=[];for(let o=0;o<=s;o++){const l=o/s,c=Ss(e.time,t.time,n.time,l),u=Ss(e.value,t.value,n.value,l);i.push({id:yn(),cc:a,value:vn(u),time:c})}return i}function Zd(e,t,n,a=8){const s=[],i=(t.time-e.time)/a,o=(t.value-e.value)/a;for(let l=0;l<a;l++){const c=e.time+l*i,u=vn(e.value+l*o);s.push({id:yn(),cc:n,value:u,time:c}),s.push({id:yn(),cc:n,value:u,time:c+i-.001})}return s}function Xd(e,t,n,a=2,s=32){const i=[];for(let o=0;o<=s;o++){const l=o/s,c=Math.pow(l,a);i.push({id:yn(),cc:n,value:vn(jr(e.value,t.value,c)),time:jr(e.time,t.time,l)})}return i}function Qd(e,t=3){if(e.length<t)return e;const n=[...e].sort((a,s)=>a.time-s.time);return n.map((a,s)=>{const i=Math.max(0,s-Math.floor(t/2)),o=Math.min(n.length,i+t),l=n.slice(i,o),c=l.reduce((u,h)=>u+h.value,0)/l.length;return{...a,value:vn(Math.round(c))}})}function Jd(e,t){let n;switch(e.mode){case"pencil":n=Kd(t,e.cc,e.resolution);break;case"line":n=t.length>=2?xs(t[0],t[t.length-1],e.cc):[];break;case"curve":t.length>=3?n=Yd(t[0],t[Math.floor(t.length/2)],t[t.length-1],e.cc):t.length>=2?n=xs(t[0],t[t.length-1],e.cc):n=[];break;case"step":n=t.length>=2?Zd(t[0],t[t.length-1],e.cc):[];break;case"ramp":n=t.length>=2?Xd(t[0],t[t.length-1],e.cc):[];break;default:n=[]}if(e.smoothing>0){const a=Math.max(2,Math.round(e.smoothing*8));n=Qd(n,a)}return n}function vn(e){return Math.max(0,Math.min(127,Math.round(e)))}function jr(e,t,n){return e+(t-e)*n}function Ss(e,t,n,a){const s=1-a;return s*s*e+2*s*a*t+a*a*n}function _r(){return{waveform:"sine",rate:1,depth:.5,phase:0,center:.5,syncToBpm:!1,syncDivision:"1/4",enabled:!0}}const eu={"4/1":.25,"2/1":.5,"1/1":1,"1/2":2,"1/4":4,"1/8":8,"1/16":16,"1/32":32,"1/2t":3,"1/4t":6,"1/8t":12,"1/16t":24};function eo(e,t){return e/60*eu[t]/4}function to(e,t){const n=(t%1+1)%1;switch(e){case"sine":return Math.sin(n*2*Math.PI);case"triangle":return n<.5?4*n-1:3-4*n;case"sawtooth":return 2*n-1;case"square":return n<.5?1:-1;case"random":return Math.sin(n*127.1)*Math.cos(n*311.7)*2;case"sample-hold":return Math.sin(Math.floor(n*4)*2.399+.5)*2-1;default:return 0}}function Aa(e,t,n){if(!e.enabled)return e.center;const a=e.syncToBpm&&n?eo(n,e.syncDivision):e.rate,s=t*a+e.phase/(2*Math.PI),i=to(e.waveform,s),o=e.center+i*e.depth*.5;return Math.max(0,Math.min(1,o))}function Ia(e,t,n){return Math.round(Aa(e,t,n)*127)}function no(e,t,n,a,s=30,i){const o=n-t,l=Math.max(2,Math.ceil(o*s)),c=[];for(let u=0;u<=l;u++){const h=t+u/l*o,p=Ia(e,h,i);c.push({time:h,value:p,cc:a})}return c}function ro(e,t,n,a=2,s,i=200){const o=[];for(let l=0;l<=i;l++){const c=l/i*a,u=Aa(e,c,s);o.push({x:l/i*t,y:(1-u)*n})}return o}function tu(e){return JSON.stringify(e,null,2)}function nu(e){try{const t=JSON.parse(e);return!t||typeof t.waveform!="string"?null:t}catch{return null}}const Yr=140,bn=24,ru=[{cc:1,key:"modWheel",label:"Mod Wheel"},{cc:7,key:"volume",label:"Volume"},{cc:10,key:"pan",label:"Pan"},{cc:11,key:"expression",label:"Expression"},{cc:64,key:"sustain",label:"Sustain"},{cc:74,key:"brightness",label:"Brightness"}],au=[{mode:"pencil",label:"Pencil"},{mode:"line",label:"Line"},{mode:"curve",label:"Curve"},{mode:"step",label:"Step"},{mode:"ramp",label:"Ramp"}],su=["sine","triangle","sawtooth","square","random","sample-hold"],iu=({layerId:e=0,ccNumber:t,duration:n=8,zoom:a=1,automation:s,onChangeCCNumber:i})=>{const o=Ji(),l=s??o,[c,u]=ke.useControllableState({value:t,fallbackValue:1,onChange:i,componentName:"NiceCCAutomationLaneEditor"}),{t:h}=xe(),p=d.useRef(null),[g,y]=d.useState("pencil"),[m,x]=d.useState(!1),b=d.useRef([]),[f,k]=d.useState(null),[v,w]=d.useState(!1),[R,M]=d.useState(_r()),j=d.useRef(null),T=l.getEvents(e),P=T.filter(C=>C.cc===c),A=Math.max(400,n*30*a),I=d.useCallback(C=>C/A*n,[A,n]),L=d.useCallback(C=>Math.round(Math.max(0,Math.min(127,127-(C-bn)/Yr*127))),[]),N=d.useCallback(C=>C/n*A,[A,n]),_=d.useCallback(C=>bn+(127-C)/127*Yr,[]),ee=d.useCallback(()=>{const C=p.current;if(!C)return;const $=C.getContext("2d");if(!$)return;const S=C.width,B=C.height;$.clearRect(0,0,S,B),$.fillStyle=ke.resolveCssColor("var(--nice-bg, #1a1a2e)",$.canvas),$.fillRect(0,0,S,B);const H=ke.resolveCssColor("var(--nice-border-color, #cbd5e1)",$.canvas);$.strokeStyle=H,$.lineWidth=1,$.globalAlpha=.5;for(let E=0;E<=127;E+=16){const q=_(E);$.beginPath(),$.moveTo(0,q),$.lineTo(S,q),$.stroke()}$.globalAlpha=1,$.fillStyle=ke.resolveCssColor("var(--nice-text-muted, #64748b)",$.canvas),$.font="10px monospace",$.textBaseline="middle";for(const E of[0,32,64,96,127])$.fillText(String(E),2,_(E));$.strokeStyle=H,$.globalAlpha=.3;for(let E=0;E<=n;E++){const q=N(E);$.beginPath(),$.moveTo(q,0),$.lineTo(q,B),$.stroke()}$.globalAlpha=1;const z=[...P].sort((E,q)=>E.time-q.time);if(z.length>0){$.beginPath(),$.moveTo(N(z[0].time),B-bn);for(const E of z)$.lineTo(N(E.time),_(E.value));$.lineTo(N(z[z.length-1].time),B-bn),$.closePath(),$.fillStyle=ke.resolveCssColor("var(--nice-primary-tint-15, rgba(59, 130, 246, 0.15))",$.canvas),$.fill(),$.beginPath(),$.strokeStyle=ke.resolveCssColor("var(--nice-primary, #3b82f6)",$.canvas),$.lineWidth=2;for(let E=0;E<z.length;E++){const q=N(z[E].time),X=_(z[E].value);E===0?$.moveTo(q,X):((z[E].handleType??"linear")==="step"&&$.lineTo(q,_(z[E-1].value)),$.lineTo(q,X))}$.stroke();for(const E of z){const q=N(E.time),X=_(E.value),re=f===E.id;$.beginPath(),$.arc(q,X,re?6:4,0,Math.PI*2),$.fillStyle=ke.resolveCssColor(re?"var(--nice-primary-light, #60a5fa)":"var(--nice-primary, #3b82f6)",$.canvas),$.fill(),$.strokeStyle=ke.resolveCssColor("var(--nice-bg, #fff)",$.canvas),$.lineWidth=1.5,$.stroke()}}$.strokeStyle=H,$.lineWidth=1,$.setLineDash([4,4]);const Z=_(0);$.beginPath(),$.moveTo(0,Z),$.lineTo(S,Z),$.stroke(),$.setLineDash([])},[P,n,N,_,f]);d.useEffect(()=>{ee()},[ee]);const Y=C=>{var H;const $=(H=p.current)==null?void 0:H.getBoundingClientRect();if(!$)return;const S=C.clientX-$.left,B=C.clientY-$.top;g==="pencil"?(x(!0),b.current=[{time:I(S),value:L(B)}]):(x(!0),b.current=[{time:I(S),value:L(B)}])},O=C=>{var Z;const $=(Z=p.current)==null?void 0:Z.getBoundingClientRect();if(!$)return;const S=C.clientX-$.left,B=C.clientY-$.top;m&&b.current.push({time:I(S),value:L(B)});const H=[...P].sort((E,q)=>E.time-q.time);let z=null;for(const E of H){const q=N(E.time),X=_(E.value);if(Math.abs(S-q)<8&&Math.abs(B-X)<8){z=E.id;break}}k(z)},U=()=>{if(!m)return;x(!1);const C=b.current;if(C.length===0)return;const $=Jd({mode:g,cc:c,resolution:.02,smoothing:g==="pencil"?.3:0},C);$.length>0&&l.setEvents(e,[...T,...$]),b.current=[]},V=C=>{var H;const $=(H=p.current)==null?void 0:H.getBoundingClientRect();if(!$)return;const S=C.clientX-$.left,B=C.clientY-$.top;for(const z of P){const Z=N(z.time),E=_(z.value);if(Math.abs(S-Z)<8&&Math.abs(B-E)<8){l.removeEvent(e,z.id);return}}l.addEvent(e,{id:Date.now()+Math.floor(Math.random()*1e4),cc:c,value:L(B),time:I(S)})},K=()=>{const $=no(R,0,n,c,Math.ceil(n*20),120).map((S,B)=>({...S,id:Date.now()+B}));l.setEvents(e,[...T,...$]),w(!1)},G=()=>{const C=l.exportLane(e),$=new Blob([C],{type:"application/json"}),S=URL.createObjectURL($),B=document.createElement("a");B.href=S,B.download=`cc-lane-${c}-layer-${e}.json`,document.body.appendChild(B),B.click(),B.remove(),URL.revokeObjectURL(S)},W=C=>{var S;const $=(S=C.target.files)==null?void 0:S[0];$&&($.text().then(B=>{l.importLane(e,B)}),j.current&&(j.current.value=""))};return r.jsxs("div",{className:ye.panel,children:[r.jsxs("div",{className:ye.header,children:[r.jsx("h6",{className:ye.title,children:h("ccLane.title","CC Automation Lane")}),r.jsx(ie.NiceSelect,{size:"sm",controlWidth:180,"aria-label":h("ccLane.controller","Controller"),value:String(c),onChange:C=>u(Number(Tt(C))),options:ru.map(C=>({value:String(C.cc),label:h("ccLane.cc2","{label} (CC{cc})").replace("{label}",String(h(`ccLane.preset.${C.key}`,C.label))).replace("{cc}",String(C.cc))}))}),r.jsx(ie.NiceSegmentedControl,{size:"sm",value:g,onChange:y,options:au.map(C=>({value:C.mode,label:h(`ccLane.mode.${C.mode}`,C.label)}))}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",leftIcon:r.jsx(F.NtdUndo,{size:14}),ariaLabel:h("ccLane.undo","Undo"),title:h("ccLane.undo","Undo"),onClick:l.undo,disabled:!l.canUndo,children:null}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",leftIcon:r.jsx(F.NtdRedo,{size:14}),ariaLabel:h("ccLane.redo","Redo"),title:h("ccLane.redo","Redo"),onClick:l.redo,disabled:!l.canRedo,children:null})]}),r.jsxs("div",{className:ye.toolbar,children:[r.jsx(ie.NiceButton,{size:"sm",variant:v?"primary":"outline","aria-pressed":v,onClick:()=>w(!v),title:h("ccLane.lfoHint","Apply LFO modulation"),children:h("ccLane.lfo","LFO")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:G,title:h("ccLane.exportHint","Export CC lane as JSON"),children:h("ccLane.export","Export")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>{var C;return(C=j.current)==null?void 0:C.click()},title:h("ccLane.importHint","Import CC lane from JSON"),children:h("ccLane.import","Import")}),r.jsx("input",{ref:j,type:"file",accept:".json",hidden:!0,onChange:W}),r.jsx(ie.NiceButton,{size:"sm",variant:"danger",onClick:()=>l.setEvents(e,T.filter(C=>C.cc!==c)),title:h("ccLane.clearHint","Clear all CC events for this lane"),children:h("ccLane.clear","Clear")}),r.jsxs("span",{className:`${ye.noteText} ${ye.pushRight}`,children:[P.length," ",h("ccLane.events","events")]})]}),v&&r.jsxs("div",{className:ye.subPanel,children:[r.jsxs("div",{className:`${ye.row} ${ye.alignStart} ${ye.field}`,children:[r.jsx(ie.NiceSelect,{size:"sm",controlWidth:130,label:h("ccLane.lfoWave","Wave"),value:R.waveform,onChange:C=>M($=>({...$,waveform:Tt(C)})),options:su.map(C=>({value:C,label:C}))}),r.jsx(ie.NiceNumberInput,{size:"sm",className:ye.inputW120,label:h("ccLane.lfoRate","Rate (Hz)"),min:.01,max:20,step:.1,precision:2,value:R.rate,onChange:C=>{C!==null&&M($=>({...$,rate:C}))}}),r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{size:"sm",label:h("ccLane.lfoDepth","Depth"),min:0,max:1,step:.01,value:R.depth,onChange:C=>M($=>({...$,depth:C})),showValue:!0,formatValue:C=>C.toFixed(2)})}),r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{size:"sm",label:h("ccLane.lfoCenter","Center"),min:0,max:1,step:.01,value:R.center,onChange:C=>M($=>({...$,center:C})),showValue:!0,formatValue:C=>C.toFixed(2)})})]}),r.jsxs("div",{className:ye.buttonRow,children:[r.jsx(ie.NiceButton,{size:"sm",variant:"primary",onClick:K,children:h("ccLane.applyLfo","Apply LFO")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>w(!1),children:h("ccLane.cancel","Cancel")})]})]}),r.jsx("div",{style:{overflowX:"auto",borderRadius:6},children:r.jsx("canvas",{ref:p,width:A,height:Yr+bn*2,style:{cursor:m?"crosshair":f?"pointer":"crosshair",display:"block",borderRadius:6},onMouseDown:Y,onMouseMove:O,onMouseUp:U,onMouseLeave:()=>{m&&U()},onDoubleClick:V,role:"img","aria-label":h("ccLane.canvas","CC automation lane")})}),r.jsx("div",{className:ye.noteTextMargin,children:h("ccLane.hint","Click to draw. Double-click to add/remove points. Drag to draw curves.")})]})},ao={"1/1":4,"1/2":2,"1/4":1,"1/8":.5,"1/16":.25,"1/32":.125,"1/4T":1/1.5,"1/8T":.5/1.5,"1/16T":.25/1.5},ua={mode:"up",octaves:1,rate:"1/8",gate:.8,swing:0,repeats:1,latch:!1};function ou(e,t){const n=[];for(let a=0;a<t;a++)for(const s of e)n.push({...s,pitch:s.pitch+a*12});return n}function so(e,t){if(e.length===0)return[];const n=ou(e,t.octaves),a=[...n].sort((o,l)=>o.pitch-l.pitch),s=[...n].sort((o,l)=>l.pitch-o.pitch);let i;switch(t.mode){case"up":i=a;break;case"down":i=s;break;case"updown":i=[...a,...s.slice(1,-1)];break;case"downup":i=[...s,...a.slice(1,-1)];break;case"random":i=[...n].sort(()=>Math.random()-.5);break;case"as-played":i=[...n].sort((o,l)=>o.originalOrder-l.originalOrder);break;case"chord":i=n;break;default:i=a}if(t.repeats>1){const o=[];for(const l of i)for(let c=0;c<t.repeats;c++)o.push(l);i=o}return i}function lu(e,t,n,a=0,s=1){const i=so(e,t);if(i.length===0)return[];const o=60/n,l=ao[t.rate]*o,c=l*t.gate,u=[],h=t.mode==="chord",p=h?s:i.length*s;for(let g=0;g<p;g++){const y=g%2===1?l*t.swing*.5:0,m=a+g*l+y;if(h)for(const x of i){const b=t.velocityPattern?t.velocityPattern[g%t.velocityPattern.length]:x.velocity;u.push({pitch:x.pitch,velocity:b,startTime:m,duration:c,step:g})}else{const x=g%i.length,b=i[x],f=t.velocityPattern?t.velocityPattern[g%t.velocityPattern.length]:b.velocity;u.push({pitch:b.pitch,velocity:f,startTime:m,duration:c,step:g})}}return u}function io(){return[{mode:"up",label:"Up",description:"Notes played low to high"},{mode:"down",label:"Down",description:"Notes played high to low"},{mode:"updown",label:"Up/Down",description:"Alternates up then down"},{mode:"downup",label:"Down/Up",description:"Alternates down then up"},{mode:"random",label:"Random",description:"Random note order"},{mode:"as-played",label:"As Played",description:"Order in which notes were pressed"},{mode:"chord",label:"Chord",description:"All notes played simultaneously"}]}function oo(){return Object.keys(ao)}const ks=e=>`${Math.round(e*100)}%`,cu=({config:e=ua,onChange:t=()=>{},active:n=!1,onToggleActive:a=()=>{}})=>{const{t:s}=xe(),i=io(),o=oo(),l=c=>t({...e,...c});return r.jsxs("div",{className:`${ye.panel} ${n?"":ye.panelInactive}`,children:[r.jsxs("div",{className:ye.header,children:[r.jsx("h6",{className:ye.title,children:s("arp.title","Arpeggiator")}),r.jsx(ie.NiceButton,{size:"sm",variant:n?"success":"outline","aria-pressed":n,onClick:a,children:n?s("arp.on","ON"):s("arp.off","OFF")}),r.jsx(ie.NiceButton,{size:"sm",variant:e.latch?"warning":"outline","aria-pressed":!!e.latch,onClick:()=>l({latch:!e.latch}),title:s("arp.latchHint","Latch — keep arp running after releasing keys"),children:s("arp.latch","Latch")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>t(ua),title:s("arp.resetHint","Reset to defaults"),children:s("arp.reset","Reset")})]}),r.jsxs("div",{className:ye.grid2,children:[r.jsxs("div",{className:ye.full,children:[r.jsx("span",{className:ye.label,children:s("arp.mode","Mode")}),r.jsx(ie.NiceSegmentedControl,{size:"sm",block:!0,value:e.mode,onChange:c=>l({mode:c}),options:i.map(c=>({value:c.mode,label:r.jsx("span",{title:c.description,children:c.label})}))})]}),r.jsx(ie.NiceSelect,{size:"sm",label:s("arp.rate","Rate"),value:e.rate,onChange:c=>l({rate:Tt(c)}),options:o.map(c=>({value:c,label:c}))}),r.jsx(ie.NiceSlider,{size:"sm",label:s("arp.octaves","Octaves"),min:1,max:4,step:1,value:e.octaves,onChange:c=>l({octaves:c}),showValue:!0}),r.jsx(ie.NiceSlider,{size:"sm",label:s("arp.gate","Gate"),min:.05,max:1,step:.05,value:e.gate,onChange:c=>l({gate:c}),showValue:!0,formatValue:ks}),r.jsx(ie.NiceSlider,{size:"sm",label:s("arp.swing","Swing"),min:0,max:1,step:.01,value:e.swing,onChange:c=>l({swing:c}),showValue:!0,formatValue:ks}),r.jsx(ie.NiceSlider,{size:"sm",label:s("arp.repeats","Repeats"),min:1,max:4,step:1,value:e.repeats,onChange:c=>l({repeats:c}),showValue:!0})]})]})},ws=e=>`${Math.round(e*100)}%`,du=["sine","triangle","sawtooth","square","random","sample-hold"],uu=["1/1","1/2","1/4","1/8","1/16","1/32"],xn=200,en=48,hu=({config:e,onChange:t,index:n,onRemove:a})=>{const{t:s}=xe(),i=d.useRef(null),o=c=>t({...e,...c}),l=d.useCallback(()=>{const c=i.current;if(!c)return;const u=c.getContext("2d");if(!u)return;u.clearRect(0,0,xn,en),u.fillStyle=ke.resolveCssColor("var(--nice-bg-secondary, #161b22)",u.canvas),u.fillRect(0,0,xn,en),u.strokeStyle=ke.resolveCssColor("var(--nice-border-color, #cbd5e1)",u.canvas),u.lineWidth=1,u.setLineDash([3,3]),u.beginPath(),u.moveTo(0,en/2),u.lineTo(xn,en/2),u.stroke(),u.setLineDash([]);const h=ro(e,xn,en);if(h.length>0){u.beginPath(),u.strokeStyle=ke.resolveCssColor(e.enabled?"var(--nice-primary, #3b82f6)":"var(--nice-text-secondary, #484f58)",u.canvas),u.lineWidth=1.5;for(let p=0;p<h.length;p++){const g=h[p].x,y=h[p].y;p===0?u.moveTo(g,y):u.lineTo(g,y)}u.stroke()}},[e]);return d.useEffect(()=>{l()},[l]),r.jsxs("div",{className:`${ye.panel} ${ye.panelCompact} ${e.enabled?"":ye.panelInactive}`,children:[r.jsxs("div",{className:ye.header,children:[r.jsxs("h6",{className:ye.title,children:[s("lfo.title","LFO")," ",n!==void 0?`#${n+1}`:""]}),r.jsx(ie.NiceButton,{size:"xs",variant:e.enabled?"success":"outline","aria-pressed":e.enabled,onClick:()=>o({enabled:!e.enabled}),children:e.enabled?s("lfo.on","ON"):s("lfo.off","OFF")}),r.jsx(ie.NiceButton,{size:"xs",variant:"outline",onClick:()=>t(_r()),title:s("lfo.resetHint","Reset to defaults"),children:s("lfo.reset","Reset")}),a&&r.jsx("span",{className:ye.pushRight,children:r.jsx(ie.NiceButton,{size:"xs",variant:"ghost",onClick:a,"aria-label":s("lfo.remove","Remove LFO"),title:s("lfo.remove","Remove LFO"),children:r.jsx(F.NtdClose,{size:12})})})]}),r.jsxs("div",{className:`${ye.row} ${ye.alignStart}`,children:[r.jsx("canvas",{ref:i,width:xn,height:en,style:{borderRadius:4,border:"1px solid var(--nice-border-color, #30363d)",flexShrink:0},role:"img","aria-label":s("lfo.preview","LFO waveform preview")}),r.jsxs("div",{className:ye.grow,children:[r.jsx("div",{className:ye.field,children:r.jsx(ie.NiceSegmentedControl,{size:"xs",block:!0,value:e.waveform,onChange:c=>o({waveform:c}),options:du.map(c=>({value:c,label:r.jsx("span",{title:c,children:c==="sample-hold"?"S&H":c.slice(0,3)})}))})}),r.jsxs("div",{className:ye.grid2,children:[r.jsx(ie.NiceSlider,{size:"xs",label:s("lfo.rate","Rate"),min:.01,max:20,step:.1,value:e.rate,onChange:c=>o({rate:c}),showValue:!0,formatValue:c=>`${c.toFixed(1)} Hz`}),r.jsx(ie.NiceSlider,{size:"xs",label:s("lfo.depth","Depth"),min:0,max:1,step:.01,value:e.depth,onChange:c=>o({depth:c}),showValue:!0,formatValue:ws}),r.jsx(ie.NiceSlider,{size:"xs",label:s("lfo.center","Center"),min:0,max:1,step:.01,value:e.center,onChange:c=>o({center:c}),showValue:!0,formatValue:ws}),r.jsx(ie.NiceSlider,{size:"xs",label:s("lfo.phase","Phase"),min:0,max:360,step:1,value:e.phase,onChange:c=>o({phase:c}),showValue:!0,formatValue:c=>`${Math.round(c)}°`})]}),r.jsxs("div",{className:ye.row,children:[r.jsx(ie.NiceCheckbox,{size:"xs",label:s("lfo.bpmSync","BPM Sync"),checked:e.syncToBpm,onChange:c=>o({syncToBpm:c})}),e.syncToBpm&&r.jsx(ie.NiceSelect,{size:"xs","aria-label":s("lfo.syncDivision","Sync division"),value:e.syncDivision??"1/4",onChange:c=>o({syncDivision:Tt(c)}),options:uu.map(c=>({value:c,label:c}))}),r.jsx(ie.NiceNumberInput,{size:"xs",label:s("lfo.cc","CC"),min:0,max:127,value:e.targetCC??1,onChange:c=>o({targetCC:c??1})})]})]})]})]})},pu=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],fu=[16,32,64],mu=e=>`${Math.round(e*100)}%`;function Cs(e){const t=Math.floor(e/12)-1;return`${pu[e%12]}${t}`}const gu=({seq:e})=>{const{t}=xe(),n=e==null?void 0:e.pattern,a=d.useMemo(()=>n?n.steps.slice(0,n.length):[],[n]);if(!e||!n)return r.jsxs("div",{className:ye.panel,children:[r.jsx("h6",{className:ye.title,children:t("stepSeq.title","Step Sequencer")}),r.jsx("div",{className:ye.noteTextMargin,children:t("stepSeq.noSeq","Provide a `seq` prop (useStepSequencer) for live editing.")})]});const{currentStep:s,playing:i}=e,o=l=>c=>{var m;c.preventDefault();const u=c.currentTarget,h=u.getBoundingClientRect(),p=x=>e.setVelocity(l,Math.round(Math.max(1,Math.min(127,(1-(x-h.top)/h.height)*127)))),g=x=>p(x.clientY),y=()=>{u.removeEventListener("pointermove",g),u.removeEventListener("pointerup",y),u.removeEventListener("pointercancel",y)};(m=u.setPointerCapture)==null||m.call(u,c.pointerId),u.addEventListener("pointermove",g),u.addEventListener("pointerup",y),u.addEventListener("pointercancel",y),p(c.clientY)};return r.jsxs("div",{className:ye.panel,children:[r.jsxs("div",{className:ye.header,children:[r.jsx("h6",{className:ye.title,children:t("stepSeq.title","Step Sequencer")}),r.jsx(ie.NiceButton,{size:"sm",variant:i?"danger":"success",leftIcon:i?r.jsx(F.NtdStop,{size:12}):r.jsx(F.NtdPlay,{size:12}),onClick:e.togglePlayback,children:i?t("stepSeq.stop","Stop"):t("stepSeq.play","Play")})]}),r.jsxs("div",{className:`${ye.row} ${ye.alignStart} ${ye.field}`,children:[r.jsx(ie.NiceNumberInput,{size:"sm",className:ye.inputW120,label:t("stepSeq.bpm","BPM"),min:20,max:300,value:n.bpm,onChange:l=>{l!==null&&e.setBpm(l)}}),r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{size:"sm",label:t("stepSeq.swing","Swing"),min:0,max:1,step:.01,value:n.swing,onChange:e.setSwing,showValue:!0,formatValue:mu})}),r.jsxs("div",{children:[r.jsx("span",{className:ye.label,children:t("stepSeq.length","Steps")}),r.jsx(ie.NiceSegmentedControl,{size:"sm",value:n.length,onChange:e.setLength,options:fu.map(l=>({value:l,label:String(l)}))})]})]}),r.jsxs("div",{className:ye.toolbar,children:[r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>e.transpose(1),title:t("stepSeq.transposeUp","Transpose up one semitone"),children:"+1"}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>e.transpose(-1),title:t("stepSeq.transposeDown","Transpose down one semitone"),children:"-1"}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>e.transpose(12),title:t("stepSeq.octaveUpHint","Transpose up one octave"),children:t("stepSeq.octaveUp","+Oct")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>e.transpose(-12),title:t("stepSeq.octaveDownHint","Transpose down one octave"),children:t("stepSeq.octaveDown","-Oct")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:e.reverse,children:t("stepSeq.reverse","Reverse")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",rightIcon:r.jsx(F.NtdArrowRight,{size:12}),onClick:()=>e.shift(1),children:t("stepSeq.shift","Shift")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",leftIcon:r.jsx(F.NtdArrowLeft,{size:12}),onClick:()=>e.shift(-1),children:t("stepSeq.shift","Shift")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>e.randomizeVel(),title:t("stepSeq.randomVelocityHint","Randomize velocities"),children:t("stepSeq.randomVelocity","Rnd Vel")}),r.jsx(ie.NiceButton,{size:"sm",variant:"danger",onClick:e.clear,children:t("stepSeq.clear","Clear")})]}),r.jsx("div",{style:{overflowX:"auto"},children:r.jsx("div",{style:{display:"flex",gap:2,minWidth:n.length*36},children:a.map((l,c)=>{const u=l.active,h=s===c,p=c%4===0;return r.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",gap:2,minWidth:34},children:[r.jsx("span",{style:{fontSize:9,color:p?"var(--nice-text-muted, #8b949e)":"var(--nice-text-secondary, #30363d)"},children:c+1}),r.jsx("button",{type:"button","aria-pressed":u,"aria-label":`${t("stepSeq.step","Step")} ${c+1}${u?`, ${Cs(l.note)}`:""}`,onClick:()=>e.toggle(c),style:{width:32,height:32,borderRadius:4,border:h?"2px solid var(--nice-warning, #f0c040)":"1px solid var(--nice-border, #30363d)",background:u?`hsl(${210+l.velocity/127*40}, 80%, ${35+l.velocity/127*20}%)`:p?"var(--nice-bg-secondary, #21262d)":"var(--nice-bg-secondary, #161b22)",cursor:"pointer",padding:0,color:u?"var(--nice-color-white, #ffffff)":"var(--nice-text-secondary, #484f58)",fontSize:8,fontWeight:600,transition:"background 0.1s"},children:u?Cs(l.note):""}),r.jsx("div",{style:{width:32,height:20,background:"var(--nice-bg-secondary, #161b22)",borderRadius:2,position:"relative",overflow:"hidden",cursor:"ns-resize",touchAction:"none"},title:`${t("stepSeq.velocity","Velocity")}: ${l.velocity}`,onPointerDown:o(c),children:r.jsx("div",{style:{position:"absolute",bottom:0,left:0,width:"100%",height:`${l.velocity/127*100}%`,background:u?"var(--nice-primary-tint-60, rgba(59, 130, 246, 0.6))":"var(--nice-primary-tint-15, rgba(59, 130, 246, 0.15))",borderRadius:2,pointerEvents:"none"}})}),u&&l.probability<1&&r.jsxs("span",{style:{fontSize:8,color:"var(--nice-warning, #f0c040)"},children:[Math.round(l.probability*100),"%"]})]},c)})})}),r.jsx("div",{style:{fontSize:11,color:"var(--nice-text-muted, #8b949e)",marginTop:6},children:t("stepSeq.hint","Click steps to toggle. Drag velocity bars vertically.")})]})};function yu(e,t,n){const{t:a}=xe(),[s,i]=d.useState("interval"),[o,l]=d.useState(30),c=d.useRef(null),u=d.useCallback(()=>{if(e)try{localStorage.setItem("audioEditor.autoSave",JSON.stringify(e)),t(a("useAutoSave.projectAutoSavedLocally","Project auto-saved locally")),n("success"),setTimeout(()=>t(""),2e3)}catch(h){t("Auto-save error: "+h.message),n("error")}},[e,t,n,a]);return d.useEffect(()=>{(s==="onChange"||s==="both")&&u()},[e,s,u]),d.useEffect(()=>(c.current&&(clearInterval(c.current),c.current=null),(s==="interval"||s==="both")&&o>0&&(c.current=window.setInterval(u,o*1e3)),()=>{c.current&&(clearInterval(c.current),c.current=null)}),[s,o,u]),{autoSaveMode:s,setAutoSaveMode:i,autoSaveInterval:o,setAutoSaveInterval:l}}function vu(e,t,n){const a=d.useRef(null),[s,i]=d.useState(!1),[o,l]=d.useState(0),[c,u]=d.useState(10),[h,p]=d.useState(!1),[g,y]=d.useState(120),m=d.useCallback((j,T)=>`L${j}-C${T}`,[]),x=d.useCallback((j,T)=>{if(!a.current||!T.audioBuffer)return;const P=m(j,T.id),A=e[j];a.current.addClip({id:P,buffer:T.audioBuffer,startTime:T.start,offset:0,duration:T.duration,layerId:j,volume:(A==null?void 0:A.volume)??1,pan:(A==null?void 0:A.pan)??0,stretchFactor:T.stretchFactor||1,effectChain:(A==null?void 0:A.effectChain)||[]})},[e,m]),b=d.useCallback((j,T)=>{var P;(P=a.current)==null||P.removeClip(m(j,T))},[m]);d.useEffect(()=>{Object.entries(t).forEach(([j,T])=>{const P=Number(j);T==null||T.forEach(A=>x(P,A))})},[t,e,x]),d.useEffect(()=>{a.current&&Object.entries(n).forEach(([j,T])=>{const P=Number(j);a.current.setMidiCCEvents(P,T)})},[n]);const f=d.useCallback(()=>{a.current&&(s?a.current.pause():a.current.play())},[s]),k=d.useCallback(()=>{var j;(j=a.current)==null||j.stop()},[]),v=d.useCallback(j=>{var T;(T=a.current)==null||T.seek(j)},[]),w=d.useCallback(()=>{if(!a.current)return;const j=!h;p(j),a.current.setLoopRegion(0,c,j)},[h,c]),R=d.useCallback(j=>{var P;const T=Math.max(1,c+j);u(T),(P=a.current)==null||P.setLoopRegion(0,T,h)},[c,h]),M=d.useCallback(async(j,T=1024)=>{const P=await j.arrayBuffer(),A=new(window.AudioContext||window.webkitAudioContext),I=await A.decodeAudioData(P.slice(0)),L=I.getChannelData(0),N=L.length,_=Math.max(1,Math.floor(N/T)),ee=[];for(let Y=0;Y<T;Y++){const O=Y*_;if(O>=N)break;ee.push(L[O])}return A.close(),{waveform:ee.map(Y=>Math.max(-1,Math.min(1,Y))),duration:I.duration,buffer:I}},[]);return{engineRef:a,isPlaying:s,setIsPlaying:i,currentTime:o,setCurrentTime:l,duration:c,setDuration:u,isLooping:h,setIsLooping:p,bpm:g,setBpm:y,handlePlayPause:f,handleStop:k,handleSeek:v,handleToggleLoop:w,handleAdjustDuration:R,upsertEngineClip:x,removeEngineClip:b,makeEngineClipId:m,blobToWaveform:M}}class La{constructor(){this.stream=null,this.mediaRecorder=null,this.audioChunks=[],this.isRecording=!1,this.audioContext=null,this.analyser=null,this.gainNode=null,this.monitorGain=null,this.levelRaf=null}async startRecording(t={}){if(this.isRecording)return;this.levelCallback=t.onLevel,this.stream=await navigator.mediaDevices.getUserMedia({audio:{deviceId:t.deviceId||void 0,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}});const n=t.mimeType||"audio/webm";this.mediaRecorder=new MediaRecorder(this.stream,{mimeType:n}),this.audioChunks=[],this.audioContext=new(window.AudioContext||window.webkitAudioContext);let s=this.audioContext.createMediaStreamSource(this.stream);t.gain!==void 0&&t.gain>0&&(this.gainNode=this.audioContext.createGain(),this.gainNode.gain.value=t.gain,s.connect(this.gainNode),s=this.gainNode),this.analyser=this.audioContext.createAnalyser(),this.analyser.fftSize=2048,s.connect(this.analyser),t.monitorEnabled&&(this.monitorGain=this.audioContext.createGain(),this.monitorGain.gain.value=(t.monitorVolume??100)/100,s.connect(this.monitorGain),this.monitorGain.connect(this.audioContext.destination));const i=()=>{if(!this.analyser)return;const o=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(o);let l=0;for(let u=0;u<o.length;u++){const h=(o[u]-128)/128;l+=h*h}const c=Math.sqrt(l/o.length);this.levelCallback&&this.levelCallback(c),this.isRecording&&(this.levelRaf=requestAnimationFrame(i))};this.mediaRecorder.ondataavailable=o=>{o.data&&o.data.size>0&&this.audioChunks.push(o.data)},this.mediaRecorder.start(),this.isRecording=!0,this.levelRaf=requestAnimationFrame(i)}getStream(){return this.stream}async stopRecording(){return!this.isRecording||!this.mediaRecorder?null:new Promise(t=>{const n=this.mediaRecorder;n.onstop=()=>{const a=new Blob(this.audioChunks,{type:n.mimeType});this.cleanup(),t(a)},n.stop(),this.isRecording=!1})}cleanup(){this.levelRaf&&(cancelAnimationFrame(this.levelRaf),this.levelRaf=null),this.levelCallback=void 0,this.monitorGain&&(this.monitorGain.disconnect(),this.monitorGain=null),this.gainNode&&(this.gainNode.disconnect(),this.gainNode=null),this.analyser&&(this.analyser.disconnect(),this.analyser=null),this.audioContext&&(this.audioContext.close(),this.audioContext=null),this.stream&&(this.stream.getTracks().forEach(t=>t.stop()),this.stream=null),this.mediaRecorder=null,this.audioChunks=[]}}function bu(e){const{t}=xe(),[n,a]=d.useState(!1),[s,i]=d.useState(!1),[o,l]=d.useState(0),[c,u]=d.useState(0),[h,p]=d.useState(null),g=d.useRef(null),y=d.useRef(null),m=d.useRef(0),x=d.useRef(null),b=d.useRef(null),f=d.useCallback(()=>{x.current&&(clearInterval(x.current),x.current=null),b.current&&(clearTimeout(b.current),b.current=null)},[]),k=d.useCallback(async()=>{if(!e.activeLayer){e.showToast("Select a layer to record.","error");return}n||(g.current||(g.current=new La),m.current=y.current??e.currentTime,a(!0),l(0),await g.current.startRecording({onLevel:l}))},[e,n]),v=d.useCallback(async()=>{var N;if(f(),i(!1),u(0),y.current=null,!g.current){a(!1),l(0);return}const M=await g.current.stopRecording();if(a(!1),l(0),!M||!e.activeLayer)return;const{waveform:j,duration:T,buffer:P}=await e.blobToWaveform(M),A=e.activeLayer.id;e.setWaveforms(_=>({..._,[A]:j}));const I=Math.max(0,m.current||0),L={id:Date.now(),label:t("useRecording.recording","Recording"),start:I,duration:T,fadeIn:0,fadeOut:0,reverse:!1,stretchFactor:1,color:(N=e.layerSettings[A])==null?void 0:N.color,blob:M,blobUrl:URL.createObjectURL(M),audioBuffer:P};e.setLayerClips(_=>({..._,[A]:[..._[A]||[],L]})),e.upsertEngineClip(A,L),e.setSelectedClip({layerId:A,clipId:L.id})},[e,f,t]),w=d.useCallback(M=>{if(M<=0){k();return}i(!0),u(M);const j=performance.now();x.current=window.setInterval(()=>{const T=(performance.now()-j)/1e3;u(Math.max(0,M-T))},100),b.current=window.setTimeout(()=>{f(),i(!1),u(0),y.current||k()},M*1e3)},[k,f]),R=d.useCallback(async()=>{if(n||s){await v();return}if(!e.activeLayer){e.showToast("Select a layer before recording","error");return}const M=Math.max(0,e.countInBars)*4*(60/e.bpm),j=e.punchIn!=null&&e.punchIn>e.currentTime?e.punchIn:null;j&&(y.current=j),e.overdubEnabled&&!e.isPlaying&&e.playEngine(),j?M>0&&w(M):w(M)},[n,s,e,v,w]);return{isRecording:n,isCountIn:s,monitorLevel:o,countInRemaining:c,punchOut:h,setPunchOut:p,armedPunchInRef:y,recorderRef:g,clearCountInTimers:f,startRecordingNow:k,stopRecordingFlow:v,handleRecord:R}}var lo=(e=>(e.Recorder="Recorder",e.AudioClip="Audio Clip",e.SpeechSynth="Speech Synth",e.Stream="Stream",e.KeyboardPad="Keyboard/Pads",e.Keyboard="Keyboard",e.AudioClipCompact="AudioClip",e))(lo||{});const xu={};class Xn{constructor(t,n,a,s={}){this.type=t,this.name=n,this.component=xu[t]??(()=>null),this.audioType=a,this.parameters=s}}new Xn("Recorder","Recorder","vocal",{deviceId:"",gain:1,sensitivity:"high"}),new Xn("Audio Clip","Audio Clip","instrumental",{clipId:null,octave:"4"}),new Xn("Speech Synth","Speech Synth","vocal",{text:"",voice:"default"}),new Xn("Keyboard/Pads","Keyboard","instrumental",{instrument:"piano",preset:"default",velocity:100});function co(e,t,n,a,s){n(i=>t?[...i,t]:i),a([]),s(e)}function Su(e,t,n,a){t(s=>{if(s.length===0)return s;const i=s[s.length-1];return n(o=>e?[e,...o]:o),a(i),s.slice(0,-1)})}function ku(e,t,n,a){n(s=>{if(s.length===0)return s;const i=s[0];return t(o=>e?[...o,e]:o),a(i),s.slice(1)})}class wu{constructor(t={}){this.undoStack=[],this.redoStack=[],this.maxSize=t.maxSize??100,this.onChange=t.onChange}push(t,n,a,s){this.undoStack.push({label:t,category:n,timestamp:Date.now(),oldState:a,newState:s}),this.undoStack.length>this.maxSize&&this.undoStack.shift(),this.redoStack.length=0}undo(){var n;const t=this.undoStack.pop();return t?(this.redoStack.push(t),(n=this.onChange)==null||n.call(this,t,"undo"),t.oldState):null}redo(){var n;const t=this.redoStack.pop();return t?(this.undoStack.push(t),(n=this.onChange)==null||n.call(this,t,"redo"),t.newState):null}get canUndo(){return this.undoStack.length>0}get canRedo(){return this.redoStack.length>0}get undoLabel(){return this.undoStack.length>0?this.undoStack[this.undoStack.length-1].label:null}get redoLabel(){return this.redoStack.length>0?this.redoStack[this.redoStack.length-1].label:null}get undoCount(){return this.undoStack.length}get redoCount(){return this.redoStack.length}getHistory(){return[...this.undoStack].reverse()}clear(){this.undoStack.length=0,this.redoStack.length=0}undoTo(t){const n=Math.min(t+1,this.undoStack.length);let a=null;for(let s=0;s<n;s++)a=this.undo();return a}}const Cu=st.scoped("useProjectCRUD");function ju(e){const{project:t,activeSection:n,setProject:a,setActiveSection:s,setLayers:i,setActiveLayer:o,setUndoStack:l,setRedoStack:c,addSection:u,addLayer:h}=e,p=d.useCallback(k=>co(k,t,l,c,a),[t,l,c,a]),g=d.useCallback(async()=>{var R;if(!t)return;const k=(((R=t.sections)==null?void 0:R.length)??0)+1,w={id:await u(t.id,"Section",k),projectId:t.id,name:"Section",orderNumber:k,layers:[]};p({...t,sections:[...t.sections||[],w]}),s(w)},[t,p,s,u]),y=d.useCallback(async k=>{var R,M,j;if(!t||!await e.confirm("Delete this section?"))return;await e.deleteSection(k);const w=(t.sections??[]).filter(T=>T.id!==k);p({...t,sections:w}),s(w[0]??null),i(((R=w[0])==null?void 0:R.layers)??[]),o(((j=(M=w[0])==null?void 0:M.layers)==null?void 0:j[0])??null)},[t,p,s,i,o,e]),m=d.useCallback(async()=>{var v;if(!n)return;const k={id:-Date.now(),name:"New Layer",sectionId:n.id,audioSource:lo.AudioClip,audioSourceParameters:JSON.stringify({clipId:null}),items:[]};i(w=>[...w,k]),o(k);try{const w=await h(n.id,k.name,k.audioSource,k.audioSourceParameters);i(R=>R.map(M=>M.id===k.id?{...k,id:w}:M)),t&&p({...t,sections:((v=t.sections)==null?void 0:v.map(R=>R.id===n.id?{...R,layers:[...(R.layers??[]).filter(M=>M.id!==w),{...k,id:w}]}:R))??[]})}catch(w){i(R=>R.filter(M=>M.id!==k.id)),Cu.error("Failed to add layer:",w)}},[n,t,p,i,o,h]),x=d.useCallback(async k=>{var w,R;if((w=e.layerSettings[k])!=null&&w.locked){e.showToast("Layer is locked. Unlock to delete.","error");return}await e.confirm("Delete this layer?")&&((e.layerClips[k]||[]).forEach(M=>e.removeEngineClip(k,M.id)),e.setLayerMidiNotes(M=>{const j={...M};return delete j[k],j}),await e.deleteLayer(k),i(M=>M.filter(j=>j.id!==k)),o(M=>(M==null?void 0:M.id)===k?null:M),t&&p({...t,sections:((R=t.sections)==null?void 0:R.map(M=>M.id===(n==null?void 0:n.id)?{...M,layers:(M.layers??[]).filter(j=>j.id!==k)}:M))??[]}))},[t,n,p,i,o,e]),b=d.useCallback(async()=>{if(!t)return;const k=e.projectVolume===""?void 0:Number(e.projectVolume);if(Number.isNaN(k)){e.setStatusType("error"),e.setStatusMessage("Volume musi byc liczba");return}if(!e.projectName.trim()){e.setStatusType("error"),e.setStatusMessage("Nazwa projektu nie moze byc pusta");return}await e.updateProject(t.id,{name:e.projectName||t.name,isTemplate:e.projectIsTemplate,volume:k}),p({...t,name:e.projectName||t.name,isTemplate:e.projectIsTemplate,volume:k}),e.setStatusType("success"),e.setStatusMessage("Project saved")},[t,e,p]),f=d.useCallback(async()=>{var w;if(!n)return;const k=e.sectionName||n.name,v=e.sectionOrder===""?n.orderNumber:Number(e.sectionOrder);if(!k.trim()){e.setStatusType("error"),e.setStatusMessage("Section name cannot be empty");return}if(Number.isNaN(v)){e.setStatusType("error"),e.setStatusMessage("Order musi byc liczba");return}await e.updateSection(n.id,{name:k,orderNumber:v}),s({...n,name:k,orderNumber:v}),t&&p({...t,sections:((w=t.sections)==null?void 0:w.map(R=>R.id===n.id?{...R,name:k,orderNumber:v}:R))??[]}),e.setStatusType("success"),e.setStatusMessage("Section saved")},[n,t,e,p,s]);return{handleAddSection:g,handleDeleteSection:y,handleAddLayer:m,handleDeleteLayer:x,handleSaveProject:b,handleSaveSection:f}}const uo=d.createContext(null);function Mu(){const e=d.useContext(uo);if(!e)throw new Error("useEditorTrack must be used within <EditorTrackProvider>");return e}const _a=({value:e,children:t})=>r.jsx(uo.Provider,{value:e,children:t});process.env.NODE_ENV!=="production"&&(_a.displayName="EditorTrackProvider");const un=(e,t)=>t&&t>0?e*15/t:e/10,za=e=>{for(const t of e){const n=t.trim();if(n.toUpperCase().startsWith("#BPM:")){const a=parseFloat(n.substring(5).replace(",","."));if(isFinite(a)&&a>0)return a}}return null},Ru=(e,t)=>{const n=t??za(e),a=[];let s="",i=0,o="",l=!0;function c(){o.trim()!==""&&(s.length>0&&(s+=" "),s+=o.trim()),o=""}return e.forEach(u=>{if(!(u.startsWith("#")||u.startsWith("E"))){if(u.startsWith("-"))c(),s.trim().length>0&&(a.push({text:s.trim(),timestamp:i}),s=""),l=!0;else if(u.startsWith(":")||u.startsWith("*")){const h=u.indexOf(" "),p=u.indexOf(" ",h+1),g=u.indexOf(" ",p+1),y=u.indexOf(" ",g+1);if(y===-1)return;const m=un(parseFloat(u.substring(h+1,p)),n);s===""&&(i=m);const x=u.substring(y+1);if(x.trim()==="~")return;let b=x;b.startsWith("~")&&(b=b.substring(1)),l?(c(),o=b.trimEnd()):o+=b.trimEnd(),l=x.endsWith(" ")}}}),c(),s.trim().length>0&&a.push({text:s.trim(),timestamp:i}),a},Nu=(e,t)=>{const n=t??za(e),a=[];let s=[],i="",o=0,l=!0,c=null,u="";function h(){c&&u.trim()!==""&&(c.text=u.trim(),s.push({...c}),i.length>0&&(i+=" "),i+=c.text),c=null,u=""}return e.forEach(p=>{if(!(p.startsWith("#")||p.startsWith("E"))){if(p.startsWith("-"))h(),i.trim().length>0&&(a.push({text:i.trim(),timestamp:o,words:s}),i="",s=[]),l=!0;else if(p.startsWith(":")||p.startsWith("*")){const g=p.startsWith("*"),y=p.indexOf(" "),m=p.indexOf(" ",y+1),x=p.indexOf(" ",m+1),b=p.indexOf(" ",x+1);if(b===-1)return;const f=un(parseFloat(p.substring(y+1,m)),n),k=un(parseFloat(p.substring(m+1,x)),n),v=f+k;i===""&&(o=f);const w=p.substring(b+1);if(w.trim()==="~"){c&&(c.endTime=v);return}let R=w;R.startsWith("~")&&(R=R.substring(1)),l?(h(),u=R.trimEnd(),c={text:"",startTime:f,endTime:v,isGolden:g}):c?(u+=R.trimEnd(),c.endTime=v,g&&(c.isGolden=!0)):(u=R.trimEnd(),c={text:"",startTime:f,endTime:v,isGolden:g}),l=w.endsWith(" ")}}}),h(),i.trim().length>0&&a.push({text:i.trim(),timestamp:o,words:s}),a},ho=(e,t)=>{const n=t??za(e),a=[];let s=[],i=0;function o(){s.length>0&&(a.push({timestamp:i,syllables:[...s]}),s=[])}return e.forEach(l=>{if(!(l.startsWith("#")||l.startsWith("E"))){if(l.startsWith("-")){o();const c=l.trim().split(/\s+/);if(c.length>=2){const u=parseFloat(c[1]);isFinite(u)&&(i=un(u,n))}}else if(l.startsWith(":")||l.startsWith("*")){const c=l.startsWith("*"),u=l.indexOf(" "),h=l.indexOf(" ",u+1),p=l.indexOf(" ",h+1),g=l.indexOf(" ",p+1);if(g===-1)return;const y=parseFloat(l.substring(u+1,h)),m=parseFloat(l.substring(h+1,p)),x=un(y,n),b=x+un(m,n);s.length===0&&(i=x);const f=l.substring(g+1);if(f.trim()==="~"){s.length>0&&(s[s.length-1].endTime=b);return}let k=f;k.startsWith("~")&&(k=k.substring(1));const v=f.endsWith(" "),w=v?k.slice(0,-1):k;s.push({text:w,startTime:x,endTime:b,isGolden:c,hasTrailingSpace:v})}}}),o(),a},Tu=(e,t,n=3)=>{const a=[];let s=-1;for(let i=0;i<e.length;i++){const o=e[i].timestamp,l=e[i+1]?e[i+1].timestamp:o+5;if(t>=o&&t<l){s=i;break}}if(s>=0){const i=Math.max(0,s-(n-1));for(let o=i;o<=s;o++)a.push(e[o].text)}return a},Pu=(e,t)=>{const n=[];for(const a of e)for(const s of a.words)t>=s.startTime&&t<=s.endTime&&n.push(s);return n},js="var(--karaoke-sung-gradient, linear-gradient(90deg, #00e5ff 0%, #ffe600 60%, #ffab00 100%))",Ms="var(--karaoke-gold-glow-first, 0 0 12px #FFD700)",Eu="var(--karaoke-active-glow, 0 0 10px rgba(0,229,255,0.6), 0 0 4px rgba(255,230,0,0.4))",$u="var(--karaoke-active-drop-first, 0 0 6px rgba(0,229,255,0.5))",Au=({song:e,currentTime:t=0})=>{const{t:n}=xe(),a=d.useMemo(()=>!e||!e.notes.length?[]:ho(e.notes.map(c=>c.noteLine),e.bpm??void 0),[e]),s=t-((e==null?void 0:e.gap)??0)/1e3;let i=-1;for(let c=0;c<a.length;c++){const u=a[c].timestamp,h=c+1<a.length?a[c+1].timestamp:u+30;if(s>=u&&s<h){i=c;break}}const o=i>=0?a[i]:null,l=i>=0&&i+1<a.length?a[i+1]:null;return r.jsx("div",{className:"karaoke-lyrics",style:{textAlign:"center",fontSize:"28px",marginTop:"20px",minHeight:"80px",textShadow:"var(--karaoke-outline, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000)",fontWeight:700,fontStyle:"italic",fontFamily:"var(--karaoke-font-family, Arial)"},children:o?r.jsxs(r.Fragment,{children:[r.jsx("p",{style:{color:"var(--karaoke-primary-text, #fff)",margin:"5px 0",lineHeight:1.4,textShadow:Eu,background:"var(--karaoke-active-bg, linear-gradient(90deg, transparent 0%, rgba(0,229,255,0.08) 20%, rgba(255,230,0,0.06) 80%, transparent 100%))",borderRadius:8,padding:"2px 10px",transition:"text-shadow 0.3s ease, background 0.3s ease"},children:o.syllables.map((c,u)=>{let h=0;s>=c.endTime?h=1:s>c.startTime&&(h=(s-c.startTime)/(c.endTime-c.startTime));const p=Math.round(h*100),g=c.text+(c.hasTrailingSpace?" ":""),y=h>0&&h<1,m=c.isGolden;return h<=0?r.jsx("span",{style:{color:"var(--karaoke-syllable-dim, rgba(255,255,255,0.85))",transition:"color 0.15s ease"},children:g},u):h>=1?r.jsx("span",{style:{background:m?"var(--karaoke-gold-gradient, linear-gradient(90deg, #FFD700, #FFA000, #FFD700))":js,WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent",backgroundClip:"text",filter:m?`drop-shadow(${Ms})`:"none",transition:"filter 0.2s ease"},children:g},u):r.jsxs("span",{style:{position:"relative",display:"inline",filter:y?m?`drop-shadow(${Ms})`:`drop-shadow(${$u})`:"none",transition:"filter 0.15s ease"},children:[r.jsx("span",{style:{color:"var(--karaoke-syllable-dim, rgba(255,255,255,0.85))",visibility:"visible"},children:g}),r.jsx("span",{style:{position:"absolute",left:0,top:0,background:m?"var(--karaoke-gold-gradient, linear-gradient(90deg, #FFD700, #FFA000, #FFD700))":js,WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent",backgroundClip:"text",clipPath:`inset(0 ${100-p}% 0 0)`,pointerEvents:"none"},children:g})]},u)})}),l&&r.jsx("p",{style:{color:"var(--karaoke-next-text, #666)",margin:"5px 0",lineHeight:1.4,fontSize:"22px",transition:"opacity 0.3s ease"},children:l.syllables.map((c,u)=>r.jsx("span",{style:{color:c.isGolden?"var(--karaoke-golden-next, rgba(255,215,0,0.5))":"var(--karaoke-next-dim, #777)"},children:c.text+(c.hasTrailingSpace?" ":"")},u))})]}):a.length>0?r.jsx("p",{style:{color:"var(--karaoke-waiting-text, #999)"},children:r.jsx(F.NtdMusic,{size:20})}):r.jsxs("p",{style:{color:"var(--karaoke-waiting-text, #999)",display:"inline-flex",alignItems:"center",gap:6},children:[r.jsx(F.NtdMicrophone,{size:18})," ",n("karaokeLyrics.waitingForLyrics","Waiting for lyrics...")]})})},po=d.memo(Au),Zr={},Iu=typeof{url:typeof document>"u"?require("url").pathToFileURL(__filename).href:vt&&vt.tagName.toUpperCase()==="SCRIPT"&&vt.src||new URL("index.cjs",document.baseURI).href}<"u"&&(Zr==null?void 0:Zr.VITE_DEBUG_KARAOKE)==="true";function ha(e,t,...n){(Iu||typeof window<"u"&&window.DEBUG_KARAOKE)&&console.log(`%c[KARAOKE-DEBUG]%c [${e}] ${t}`,"background:var(--nice-color-accent-hover, #6c3483);color:var(--nice-text-on-primary, #FFF);padding: var(--nice-space-px, 1px) var(--nice-space-1, 4px);border-radius:var(--nice-radius-sm, 3px);font-weight:bold","color:var(--nice-color-accent-hover, #6c3483);font-weight:bold",...n)}const fo=e=>{for(const t of e){const n=t.trim();if(n.toUpperCase().startsWith("#BPM:")){const a=parseFloat(n.substring(5).replace(",","."));if(isFinite(a)&&a>0)return a}}return null},Rs=(e,t)=>t&&t>0?e*15/t:e/10,Hn=(e,t)=>{const n=t??fo(e),a=[];let s=[];return e.forEach(i=>{const o=i.split(" ");if(!(o.length<4))if(i.startsWith("-"))s.length>0&&(a.push(s),s=[]);else{const l=(o[0]||"").charAt(0),c=l==="*"||l==="G";s.push({startTime:Rs(parseFloat(o[1]),n),duration:Rs(parseFloat(o[2]),n),pitch:parseInt(o[3],10),isGold:c})}}),s.length>0&&a.push(s),a},mo=(e,t)=>{let a=(Math.round(12*Math.log2(e/440)+69)%12+12)%12;if(t!==null){for(;a-t>6;)a-=12;for(;a-t<-6;)a+=12}return a},go=st.scoped("karaokeScoringConfig"),Da={easy:{semitoneTolerance:2,preWindow:.25,postExtra:.3,difficultyMult:.9},normal:{semitoneTolerance:1,preWindow:.15,postExtra:.2,difficultyMult:1},hard:{semitoneTolerance:0,preWindow:.08,postExtra:.12,difficultyMult:1.05}},Lu="karaoke.scoringPresets";function _u(){try{const e=localStorage.getItem(Lu);return e?JSON.parse(e):null}catch(e){return go.warn("Failed to parse scoring presets overrides",e),null}}function yo(e){const t={...Da},n=_u();return n&&Object.keys(n).forEach(a=>{const s=n[a];s&&(t[a]={...t[a],...s})}),e&&Object.keys(e).forEach(a=>{const s=e[a];s&&(t[a]={...t[a],...s})}),t}exports.ScoringPresets=yo();const zu=async e=>{try{let t=null;if(e?t=await e.getKaraokeScoringConfig():(go.debug("No fetcher provided, using defaults"),t=null),t&&t.presets)return exports.ScoringPresets=yo(t.presets),exports.ScoringPresets}catch{}return exports.ScoringPresets},zr=(e="normal")=>exports.ScoringPresets[e]||Da.normal,Du=3,te=Du;function qt(e){const t=e/2|0;return{w:t,out:`M${t} 0H${t}V${e}H${t}A${t} ${t} 0 0 1 0 ${t}A${t} ${t} 0 0 1 ${t} 0Z`,inn:`M${t} ${te}V${e-te}A${t-te} ${t-te} 0 0 1 ${te} ${t}A${t-te} ${t-te} 0 0 1 ${t} ${te}Z`}}function hn(e){return{w:te+1,out:`M0 0H${te+1}V${e}H0Z`,inn:`M${te} ${te}H${te+1}V${e-te}H${te}Z`}}function Fa(e){const t=Math.min(14,e*.22)|0,n=t+2,a=Math.max(t-te,1);return{w:n,out:`M${t} 0H${n}V${e}H${t}Q0 ${e} 0 ${e-t}V${t}Q0 0 ${t} 0Z`,inn:`M${te+a} ${te}H${n}V${e-te}H${te+a}Q${te} ${e-te} ${te} ${e-te-a}V${te+a}Q${te} ${te} ${te+a} ${te}Z`}}function Mr(e){const t=e*.3|0,n=t+2,a=Math.max(t-te,1);return{w:n,out:`M${t} 0H${n}V${e}H${t}L0 ${e-t}V${t}Z`,inn:`M${te+a} ${te}H${n}V${e-te}H${te+a}L${te} ${e-te-a}V${te+a}Z`}}function Ot(e){const t=e*.42|0,n=t+2,a=Math.max(t-(te*1.4|0),2);return{w:n,out:`M${t} 0H${n}V${e}H${t}L0 ${e/2}Z`,inn:`M${te+a} ${te}H${n}V${e-te}H${te+a}L${te} ${e/2}Z`}}function Rr(e){const t=e*.3|0,n=t+4,a=Math.max(t-te,1);return{w:n,out:`M${t} 0H${n}V${e}H${t*.6|0}L0 ${e-t}V${t}Q0 0 ${t} 0Z`,inn:`M${te+a} ${te}H${n}V${e-te}H${te+(a*.6|0)}L${te} ${e-te-a}V${te+a}Q${te} ${te} ${te+a} ${te}Z`}}function Oa(e){const t=e*.16|0,n=t*2+4;return{w:n,out:`M${t*1.5|0} 0H${n}V${e}H${t*1.5|0}C${t*2.5|0} ${e*.35|0} ${t*2.5|0} ${e*.65|0} ${t*1.5|0} ${e}Z`,inn:`M${te+(t*1.2|0)} ${te}H${n}V${e-te}H${te+(t*1.2|0)}C${te+(t*2.2|0)} ${e*.37|0} ${te+(t*2.2|0)} ${e*.63|0} ${te+(t*1.2|0)} ${e-te}Z`}}function Ba(e){const t=e*.32|0,n=t+3,a=Math.max(t-te,1);return{w:n,out:`M0 0H${n}V${e}H${t}Q0 ${e} 0 ${e-t}Z`,inn:`M${te} ${te}H${n}V${e-te}H${te+a}Q${te} ${e-te} ${te} ${e-te-a}Z`}}function Nr(e){const t=e*.14|0,n=t*3+2;return{w:n,out:`M${t*2} 0H${n}V${e}H${t*2}C${t*.5|0} ${e*.8|0} ${t*3} ${e*.55|0} ${t*.5|0} ${e*.35|0}S${t} 0 ${t*2} 0Z`,inn:`M${te+(t*1.8|0)} ${te}H${n}V${e-te}H${te+(t*1.8|0)}C${te+(t*.4|0)} ${e*.78|0} ${te+(t*2.8|0)} ${e*.55|0} ${te+(t*.4|0)} ${e*.37|0}S${te+(t*.9|0)} ${te} ${te+(t*1.8|0)} ${te}Z`}}function Ga(e){const t=e*.09|0,n=e*.35|0;return{w:n,out:`M${t*3} 0H${n}V${e}H${t*3}L${t} ${e-t*2}L${t*2} ${e*.65|0}L0 ${e/2|0}L${t*2} ${e*.35|0}L${t} ${t*2}Z`,inn:`M${te+(t*2.5|0)} ${te}H${n}V${e-te}H${te+(t*2.5|0)}L${te+(t*.7|0)} ${e-te-(t*1.6|0)}L${te+(t*1.7|0)} ${e*.64|0}L${te} ${e/2|0}L${te+(t*1.7|0)} ${e*.36|0}L${te+(t*.7|0)} ${te+(t*1.6|0)}Z`}}function hr(e){const t=e*.42|0,n=t+2;return{w:n,out:`M${t} 0H${n}V${e}H0Z`,inn:`M${te+t-(te*1.3|0)} ${te}H${n}V${e-te}H${te+1}Z`}}function pa(e){const t=e*.42|0,n=t+2;return{w:n,out:`M0 0H${n}V${e}H${t}Z`,inn:`M${te} ${te}H${n}V${e-te}H${te+t-(te*1.3|0)+1}Z`}}function Dt(e){const t=e/2|0;return{w:t,out:`M0 0A${t} ${t} 0 0 1 ${t} ${t}A${t} ${t} 0 0 1 0 ${e}Z`,inn:`M0 ${te}A${t-te} ${t-te} 0 0 1 ${t-te} ${t}A${t-te} ${t-te} 0 0 1 0 ${e-te}Z`}}function pn(e){return{w:te+1,out:`M0 0H${te+1}V${e}H0Z`,inn:`M0 ${te}H1V${e-te}H0Z`}}function vo(e){const t=Math.min(14,e*.22)|0,n=t+2,a=Math.max(t-te,1);return{w:n,out:`M0 0H${n-t}Q${n} 0 ${n} ${t}V${e-t}Q${n} ${e} ${n-t} ${e}H0Z`,inn:`M0 ${te}H${n-te-a}Q${n-te} ${te} ${n-te} ${te+a}V${e-te-a}Q${n-te} ${e-te} ${n-te-a} ${e-te}H0Z`}}function fn(e){const t=e*.3|0,n=t+2,a=Math.max(t-te,1);return{w:n,out:`M0 0H${n-t}L${n} ${t}V${e-t}L${n-t} ${e}H0Z`,inn:`M0 ${te}H${n-te-a}L${n-te} ${te+a}V${e-te-a}L${n-te-a} ${e-te}H0Z`}}function Nt(e){const t=e*.42|0,n=t+2,a=Math.max(t-(te*1.4|0),2);return{w:n,out:`M0 0H${n-t}L${n} ${e/2}L${n-t} ${e}H0Z`,inn:`M0 ${te}H${n-te-a}L${n-te} ${e/2}L${n-te-a} ${e-te}H0Z`}}function bo(e){const t=e*.3|0,n=t+4,a=Math.max(t-te,1);return{w:n,out:`M0 0H${n-t}Q${n} 0 ${n} ${t}V${e-t}L${n-(t*.6|0)} ${e}H0Z`,inn:`M0 ${te}H${n-te-a}Q${n-te} ${te} ${n-te} ${te+a}V${e-te-a}L${n-te-(a*.6|0)} ${e-te}H0Z`}}function xo(e){const t=e*.16|0,n=t*2+4;return{w:n,out:`M0 0H${n-(t*1.5|0)}C${n-(t*2.5|0)} ${e*.35|0} ${n-(t*2.5|0)} ${e*.65|0} ${n-(t*1.5|0)} ${e}H0Z`,inn:`M0 ${te}H${n-te-(t*1.2|0)}C${n-te-(t*2.2|0)} ${e*.37|0} ${n-te-(t*2.2|0)} ${e*.63|0} ${n-te-(t*1.2|0)} ${e-te}H0Z`}}function So(e){const t=e*.32|0,n=t+3,a=Math.max(t-te,1);return{w:n,out:`M0 0H${n}V${e-t}Q${n} ${e} ${n-t} ${e}H0Z`,inn:`M0 ${te}H${n-te}V${e-te-a}Q${n-te} ${e-te} ${n-te-a} ${e-te}H0Z`}}function Wa(e){const t=e*.14|0,n=t*3+2;return{w:n,out:`M0 0H${n-t*2}C${n-t} 0 ${n+(t*.3|0)} ${e*.2|0} ${n-(t*.5|0)} ${e*.35|0}S${n-(t*.5|0)} ${e*.8|0} ${n-t*2} ${e}H0Z`,inn:`M0 ${te}H${n-te-(t*1.8|0)}C${n-te-(t*.9|0)} ${te} ${n-te+(t*.1|0)} ${e*.22|0} ${n-te-(t*.4|0)} ${e*.37|0}S${n-te-(t*.4|0)} ${e*.78|0} ${n-te-(t*1.8|0)} ${e-te}H0Z`}}function Tr(e){const t=e*.09|0,n=e*.35|0;return{w:n,out:`M0 0H${n-t*3}L${n-t} ${t*2}L${n-t*2} ${e*.35|0}L${n} ${e/2|0}L${n-t*2} ${e*.65|0}L${n-t} ${e-t*2}L${n-t*3} ${e}H0Z`,inn:`M0 ${te}H${n-te-(t*2.5|0)}L${n-te-(t*.7|0)} ${te+(t*1.6|0)}L${n-te-(t*1.7|0)} ${e*.36|0}L${n-te} ${e/2|0}L${n-te-(t*1.7|0)} ${e*.64|0}L${n-te-(t*.7|0)} ${e-te-(t*1.6|0)}L${n-te-(t*2.5|0)} ${e-te}H0Z`}}function fa(e){const t=e*.42|0,n=t+2;return{w:n,out:`M0 0H${n}L${n-t} ${e}H0Z`,inn:`M0 ${te}H${n-te}L${n-te-t+(te*1.3|0)} ${e-te}H0Z`}}function pr(e){const t=e*.42|0,n=t+2;return{w:n,out:`M0 0H${n-t}L${n} ${e}H0Z`,inn:`M0 ${te}H${n-te-t+(te*1.3|0)}L${n-te} ${e-te}H0Z`}}const Va=[{name:"Pill",L:qt,R:Dt},{name:"Sharp",L:hn,R:pn},{name:"Soft",L:Fa,R:vo},{name:"Chamfer",L:Mr,R:fn},{name:"Arrow",L:Ot,R:Nt},{name:"Shield",L:Rr,R:bo},{name:"Bracket",L:Oa,R:xo},{name:"Tab",L:Ba,R:So},{name:"Wave",L:Nr,R:Wa},{name:"Ornate",L:Ga,R:Tr}],ko=[{name:"Pill→Arrow",L:qt,R:Nt},{name:"Arrow→Pill",L:Ot,R:Dt},{name:"Pill→Sharp",L:qt,R:pn},{name:"Sharp→Pill",L:hn,R:Dt},{name:"Pill→Chamfer",L:qt,R:fn},{name:"Chamfer→Pill",L:Mr,R:Dt},{name:"Arrow→Sharp",L:Ot,R:pn},{name:"Sharp→Arrow",L:hn,R:Nt},{name:"Arrow→Chamfer",L:Ot,R:fn},{name:"Chamfer→Arrow",L:Mr,R:Nt},{name:"Soft→Arrow",L:Fa,R:Nt},{name:"Shield→Chamfer",L:Rr,R:fn},{name:"Pill→Wave",L:qt,R:Wa},{name:"Wave→Arrow",L:Nr,R:Nt},{name:"Tab→Pill",L:Ba,R:Dt},{name:"Ornate→Sharp",L:Ga,R:pn},{name:"Sharp→Ornate",L:hn,R:Tr},{name:"Bracket→Arrow",L:Oa,R:Nt},{name:"Shield→Pill",L:Rr,R:Dt},{name:"Wave→Ornate",L:Nr,R:Tr}],wo=[{name:"Skew ╲",L:hr,R:fa},{name:"Skew ╱",L:pa,R:pr},{name:"◇ Romb",L:Ot,R:Nt},{name:"╲→Pill",L:hr,R:Dt},{name:"Pill→╲",L:qt,R:fa},{name:"╱→Sharp",L:pa,R:pn},{name:"Sharp→╱",L:hn,R:pr},{name:"╲→Arrow",L:hr,R:Nt},{name:"Arrow→╱",L:Ot,R:pr},{name:"◇→Chamfer",L:Ot,R:fn}],Wn=(function(){return[...Va,...ko,...wo]})(),Co=Va[0];function Rn(e){return Wn.find(t=>t.name===e)||Co}const Pr=[{name:"Flames",mk:(e,t,n)=>{const a=n||t;return`<pattern id="${e}" width="12" height="16" patternUnits="userSpaceOnUse"><path d="M6 0C8 3 10 5 9 9C8 12 6 14 6 16C6 14 4 12 3 9C2 5 4 3 6 0Z" fill="${t}" opacity=".5"/><path d="M3 6C4 8 5 10 3 14C1 10 2 8 3 6Z" fill="${a}" opacity=".3"/><path d="M9 6C10 8 11 10 9 14C7 10 8 8 9 6Z" fill="${a}" opacity=".3"/></pattern>`}},{name:"Zigzag",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M0 5L5 0L10 5L5 10Z" fill="${n||t}" fill-opacity=".15" stroke="${t}" stroke-width="1.2" opacity=".55"/></pattern>`},{name:"Scales",mk:(e,t,n)=>{const a=n||t;return`<pattern id="${e}" width="12" height="8" patternUnits="userSpaceOnUse"><ellipse cx="6" cy="8" rx="6" ry="4.5" fill="none" stroke="${t}" stroke-width="1" opacity=".5"/><ellipse cx="0" cy="4" rx="6" ry="4.5" fill="none" stroke="${a}" stroke-width=".8" opacity=".3"/><ellipse cx="12" cy="4" rx="6" ry="4.5" fill="none" stroke="${a}" stroke-width=".8" opacity=".3"/></pattern>`}},{name:"Hex",mk:(e,t,n)=>`<pattern id="${e}" width="18" height="20" patternUnits="userSpaceOnUse"><path d="M9 2L16 6V14L9 18L2 14V6Z" fill="none" stroke="${t}" stroke-width="1" opacity=".45"/><path d="M9 12L13.5 14.5V19L9 21.5L4.5 19V14.5Z" fill="none" stroke="${n||t}" stroke-width=".6" opacity=".25"/></pattern>`},{name:"Dots",mk:(e,t,n)=>{const a=n||t;return`<pattern id="${e}" width="8" height="8" patternUnits="userSpaceOnUse"><circle cx="4" cy="4" r="2" fill="${t}" opacity=".5"/><circle cx="0" cy="0" r="1" fill="${a}" opacity=".3"/><circle cx="8" cy="8" r="1" fill="${a}" opacity=".3"/></pattern>`}},{name:"Stars",mk:(e,t,n)=>`<pattern id="${e}" width="14" height="14" patternUnits="userSpaceOnUse"><path d="M7 1L8.8 5.2L13.2 5.2L9.7 7.8L11 12.2L7 9.4L3 12.2L4.3 7.8L.8 5.2L5.2 5.2Z" fill="${t}" opacity=".45" stroke="${n||t}" stroke-width=".4" stroke-opacity=".3"/></pattern>`},{name:"Diamonds",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M5 .5L9.5 5L5 9.5L.5 5Z" fill="${n||"none"}" fill-opacity=".15" stroke="${t}" stroke-width="1" opacity=".5"/></pattern>`},{name:"Waves",mk:(e,t,n)=>`<pattern id="${e}" width="16" height="8" patternUnits="userSpaceOnUse"><path d="M0 4Q4 0 8 4Q12 8 16 4" fill="none" stroke="${t}" stroke-width="1.3" opacity=".5"/><path d="M0 6Q4 2 8 6Q12 10 16 6" fill="none" stroke="${n||t}" stroke-width=".6" opacity=".25"/></pattern>`},{name:"Crosses",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M5 2V8" stroke="${t}" stroke-width="1.3" stroke-linecap="round" opacity=".5"/><path d="M2 5H8" stroke="${n||t}" stroke-width="1.3" stroke-linecap="round" opacity=".5"/></pattern>`},{name:"Triangles",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="10" patternUnits="userSpaceOnUse"><path d="M6 1L11 9H1Z" fill="${n||"none"}" fill-opacity=".12" stroke="${t}" stroke-width="1" opacity=".5"/></pattern>`},{name:"Chevrons",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="10" patternUnits="userSpaceOnUse"><path d="M0 7L6 1.5L12 7" fill="none" stroke="${t}" stroke-width="1.2" opacity=".55"/><path d="M0 10L6 4.5L12 10" fill="none" stroke="${n||t}" stroke-width=".7" opacity=".25"/></pattern>`},{name:"Hatch ╲",mk:(e,t,n)=>`<pattern id="${e}" width="6" height="6" patternUnits="userSpaceOnUse"><path d="M0 6L6 0" stroke="${t}" stroke-width="1" opacity=".45"/><path d="M-1 1L1 -1M5 7L7 5" stroke="${n||t}" stroke-width=".8" opacity=".3"/></pattern>`},{name:"Hatch ╳",mk:(e,t,n)=>`<pattern id="${e}" width="7" height="7" patternUnits="userSpaceOnUse"><path d="M0 7L7 0" stroke="${t}" stroke-width=".8" opacity=".4"/><path d="M0 0L7 7" stroke="${n||t}" stroke-width=".8" opacity=".4"/></pattern>`},{name:"Grid",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M10 0V10" fill="none" stroke="${t}" stroke-width=".8" opacity=".4"/><path d="M0 10H10" fill="none" stroke="${n||t}" stroke-width=".8" opacity=".4"/></pattern>`},{name:"Bricks",mk:(e,t,n)=>`<pattern id="${e}" width="14" height="8" patternUnits="userSpaceOnUse"><rect width="14" height="8" fill="none" stroke="${t}" stroke-width=".8" opacity=".4"/><line x1="7" y1="0" x2="7" y2="4" stroke="${n||t}" stroke-width=".8" opacity=".4"/></pattern>`},{name:"Hearts",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="12" patternUnits="userSpaceOnUse"><path d="M6 10C4 8 1 6.5 1 4C1 2.3 2.8 1 4.5 2.2L6 4L7.5 2.2C9.2 1 11 2.3 11 4C11 6.5 8 8 6 10Z" fill="${t}" opacity=".4" stroke="${n||t}" stroke-width=".5" stroke-opacity=".3"/></pattern>`},{name:"Arrows",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="10" patternUnits="userSpaceOnUse"><path d="M3 2L9 5L3 8" fill="${n||"none"}" fill-opacity=".15" stroke="${t}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" opacity=".5"/></pattern>`},{name:"Bolts",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="16" patternUnits="userSpaceOnUse"><path d="M7 1L4 7H8L3 15" fill="none" stroke="${t}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" opacity=".5"/><circle cx="5" cy="11" r="1" fill="${n||t}" opacity=".3"/></pattern>`},{name:"Leaves",mk:(e,t,n)=>{const a=n||t;return`<pattern id="${e}" width="14" height="14" patternUnits="userSpaceOnUse"><path d="M7 2C10 4 12 7 10 11C8 13 5 12 4 10C3 7 4 4 7 2Z" fill="none" stroke="${t}" stroke-width="1" opacity=".45"/><path d="M7 3L6 10" stroke="${a}" stroke-width=".6" opacity=".3"/><path d="M5 5L7 6M5 8L7 7.5" stroke="${a}" stroke-width=".4" opacity=".25"/></pattern>`}},{name:"Spirals",mk:(e,t,n)=>`<pattern id="${e}" width="16" height="16" patternUnits="userSpaceOnUse"><path d="M8 4A4 4 0 0 1 12 8A3.5 3.5 0 0 1 8.5 11.5A2.5 2.5 0 0 1 6 9A1.5 1.5 0 0 1 7.5 7.5" fill="none" stroke="${t}" stroke-width="1.2" stroke-linecap="round" opacity=".45"/><circle cx="8" cy="8" r="1" fill="${n||t}" opacity=".25"/></pattern>`},{name:"Moons",mk:(e,t,n)=>`<pattern id="${e}" width="14" height="14" patternUnits="userSpaceOnUse"><path d="M9 2A5 5 0 1 0 9 12" fill="none" stroke="${t}" stroke-width="1" opacity=".4"/><path d="M9 2A3.5 3.5 0 0 1 9 12" fill="none" stroke="${n||t}" stroke-width="1" opacity=".3"/></pattern>`},{name:"Rings",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="12" patternUnits="userSpaceOnUse"><circle cx="6" cy="6" r="4" fill="none" stroke="${t}" stroke-width="1.2" opacity=".5"/><circle cx="6" cy="6" r="2" fill="none" stroke="${n||t}" stroke-width=".6" opacity=".25"/></pattern>`},{name:"Teeth",mk:(e,t,n)=>`<pattern id="${e}" width="8" height="10" patternUnits="userSpaceOnUse"><path d="M0 10V4L4 0L8 4V10" fill="${n||"none"}" fill-opacity=".12" stroke="${t}" stroke-width="1" opacity=".5"/></pattern>`},{name:"Swirl",mk:(e,t,n)=>`<pattern id="${e}" width="16" height="10" patternUnits="userSpaceOnUse"><path d="M0 5C3 0 6 0 8 5C10 10 13 10 16 5" fill="none" stroke="${t}" stroke-width="1.3" opacity=".5"/><path d="M0 7C3 2 6 2 8 7C10 12 13 12 16 7" fill="none" stroke="${n||t}" stroke-width=".6" opacity=".2"/></pattern>`},{name:"Chain",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="16" patternUnits="userSpaceOnUse"><ellipse cx="5" cy="4" rx="3.5" ry="4" fill="none" stroke="${t}" stroke-width="1" opacity=".45"/><ellipse cx="5" cy="12" rx="3.5" ry="4" fill="none" stroke="${n||t}" stroke-width="1" opacity=".45"/></pattern>`},{name:"Feathers",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="18" patternUnits="userSpaceOnUse"><path d="M6 1C9 5 10 9 6 17" fill="none" stroke="${t}" stroke-width=".8" opacity=".4"/><path d="M6 1C3 5 2 9 6 17" fill="none" stroke="${t}" stroke-width=".8" opacity=".4"/><path d="M4 5L6 4L8 5M4 9L6 8L8 9M4 13L6 12L8 13" stroke="${n||t}" stroke-width=".5" opacity=".3"/></pattern>`},{name:"DNA",mk:(e,t,n)=>`<pattern id="${e}" width="14" height="18" patternUnits="userSpaceOnUse"><path d="M3 0C3 4.5 11 4.5 11 9S3 13.5 3 18" fill="none" stroke="${t}" stroke-width="1" opacity=".45"/><path d="M11 0C11 4.5 3 4.5 3 9S11 13.5 11 18" fill="none" stroke="${n||t}" stroke-width="1" opacity=".45"/></pattern>`},{name:"Bubbles",mk:(e,t,n)=>{const a=n||t;return`<pattern id="${e}" width="18" height="18" patternUnits="userSpaceOnUse"><circle cx="5" cy="5" r="3.5" fill="none" stroke="${t}" stroke-width=".8" opacity=".4"/><circle cx="14" cy="12" r="4.5" fill="none" stroke="${a}" stroke-width=".8" opacity=".35"/><circle cx="11" cy="3" r="1.8" fill="${a}" opacity=".25"/></pattern>`}},{name:"Celtic",mk:(e,t,n)=>`<pattern id="${e}" width="16" height="16" patternUnits="userSpaceOnUse"><path d="M8 2C12 2 14 4 14 8C14 12 12 14 8 14C4 14 2 12 2 8C2 4 4 2 8 2Z" fill="none" stroke="${t}" stroke-width=".8" opacity=".35"/><path d="M4 4L12 12M12 4L4 12" stroke="${n||t}" stroke-width=".6" opacity=".2"/></pattern>`},{name:"Squares",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="10" patternUnits="userSpaceOnUse"><rect x="1.5" y="1.5" width="7" height="7" rx="1" fill="${n||"none"}" fill-opacity=".12" stroke="${t}" stroke-width="1" opacity=".5"/></pattern>`}];function Nn(e){return Pr.find(t=>t.name===e)||null}const Gt={color:null,capStyleName:"Pill",patternName:null,patternColor:null,patternOnly:!1,highlight:70,glow:55,glass:0,textureUrl:null,textureScale:1},Dr=(function(){return{...Gt,glass:85}})(),Fr=(function(){return{...Gt,patternName:"Stars"}})(),Or=(function(){return{...Gt,patternName:"Stars"}})(),Br={fontFamily:null,fontSize:18,fontColor:null,outlineColor:null,outlineWidth:0,shadow:null},jo=(function(){return{filledBar:{...Gt},emptyBar:{...Dr},goldFilledBar:{...Or},goldEmptyBar:{...Fr},font:{...Br},disableGoldNotes:!1}})(),Ns={capStyleName:"Pill",patternName:null,patternColor:null,patternOnly:!1,highlight:70,glow:55,emptyGlass:85,filledTextureUrl:null,emptyTextureUrl:null,textureScale:1,emptyPreset:"custom",goldPatternName:"Stars",goldPatternColor:null,goldHitPatternName:"Stars",goldHitPatternColor:null,goldEmptyTextureUrl:null,goldFilledTextureUrl:null,fontFamily:null,fontSize:18,fontColor:null,fontOutlineColor:null,fontOutlineWidth:0,fontShadow:null},Ts="nice2dev-player-bar-style",Ps="nice2dev-player-karaoke-settings";function mn(e){return e!=null?`${Ps}-${e}`:Ps}function Es(e){return e!=null?`${Ts}-${e}`:Ts}function $s(e){return{filledBar:{color:null,capStyleName:e.capStyleName,patternName:e.patternName,patternColor:e.patternColor,patternOnly:e.patternOnly,highlight:e.highlight,glow:e.glow,glass:0,textureUrl:e.filledTextureUrl,textureScale:e.textureScale},emptyBar:{color:null,capStyleName:e.capStyleName,patternName:e.patternName,patternColor:e.patternColor,patternOnly:e.patternOnly,highlight:e.highlight,glow:e.glow,glass:e.emptyGlass,textureUrl:e.emptyTextureUrl,textureScale:e.textureScale},goldFilledBar:{color:null,capStyleName:e.capStyleName,patternName:e.goldHitPatternName,patternColor:e.goldHitPatternColor,patternOnly:e.patternOnly,highlight:e.highlight,glow:e.glow,glass:0,textureUrl:e.goldFilledTextureUrl,textureScale:e.textureScale},goldEmptyBar:{color:null,capStyleName:e.capStyleName,patternName:e.goldPatternName,patternColor:e.goldPatternColor,patternOnly:e.patternOnly,highlight:e.highlight,glow:e.glow,glass:0,textureUrl:e.goldEmptyTextureUrl,textureScale:e.textureScale},font:{fontFamily:e.fontFamily,fontSize:e.fontSize,fontColor:e.fontColor,outlineColor:e.fontOutlineColor,outlineWidth:e.fontOutlineWidth,shadow:e.fontShadow}}}function As(e){const t=jo,n=(s,i)=>!i||typeof i!="object"?{...s}:{...s,...i},a=(s,i)=>!i||typeof i!="object"?{...s}:{...s,...i};return{filledBar:n(t.filledBar,e.filledBar),emptyBar:n(t.emptyBar,e.emptyBar),goldFilledBar:n(t.goldFilledBar,e.goldFilledBar),goldEmptyBar:n(t.goldEmptyBar,e.goldEmptyBar),font:a(t.font,e.font),disableGoldNotes:typeof e.disableGoldNotes=="boolean"?e.disableGoldNotes:t.disableGoldNotes}}function Ua(e){try{const t=localStorage.getItem(mn(e));if(t){const a=JSON.parse(t);return As(a)}const n=localStorage.getItem(Es(e));if(n){const a=JSON.parse(n),s=$s({...Ns,...a});return localStorage.setItem(mn(e),JSON.stringify(s)),s}if(e!=null){const a=localStorage.getItem(mn());if(a)return As(JSON.parse(a));const s=localStorage.getItem(Es());if(s)return $s({...Ns,...JSON.parse(s)})}}catch{}return{filledBar:{...Gt},emptyBar:{...Dr},goldFilledBar:{...Or},goldEmptyBar:{...Fr},font:{...Br}}}function Fu(e,t){const n=JSON.stringify(e);localStorage.setItem(mn(t),n)}let Is=!1;async function Ou(e){if(Is||(Is=!0,!e))return;const t=await e();if(t)try{localStorage.getItem(mn())||localStorage.setItem(mn(),t)}catch{}}function Bu(e){const t=new Map;for(const n of e)t.set(n,Ua(n));return t}const Gu={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Wu=/[&<>"']/g;function Vu(e){return e.replace(Wu,t=>Gu[t])}function Uu(e){const t=e.trim().toLowerCase();return!!(t.startsWith("http://")||t.startsWith("https://")||t.startsWith("blob:")||t.startsWith("data:image/")||t.startsWith("/")||t.startsWith("./")||t.startsWith("../"))}const qu=3,Ze=qu;function Er(e){const t=parseInt(e.slice(1,3),16)/255,n=parseInt(e.slice(3,5),16)/255,a=parseInt(e.slice(5,7),16)/255,s=Math.max(t,n,a),i=Math.min(t,n,a);let o=0,l=0;const c=(s+i)/2;if(s!==i){const u=s-i;switch(l=c>.5?u/(2-s-i):u/(s+i),s){case t:o=((n-a)/u+(n<a?6:0))/6;break;case n:o=((a-t)/u+2)/6;break;case a:o=((t-n)/u+4)/6;break}}return[Math.round(o*360),Math.round(l*100),Math.round(c*100)]}function $r(e){let t=e.replace("#","");return t.length===3&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),"#"+t.toLowerCase()}function dt(e,t){return e.replace(/([MLHVCSQTAZ])/gi,`
1
+ "use strict";var $c=Object.create;var gs=Object.defineProperty;var Ac=Object.getOwnPropertyDescriptor;var Ic=Object.getOwnPropertyNames;var Lc=Object.getPrototypeOf,_c=Object.prototype.hasOwnProperty;var Dc=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ic(t))!_c.call(e,s)&&s!==n&&gs(e,s,{get:()=>t[s],enumerable:!(a=Ac(t,s))||a.enumerable});return e};var Hr=(e,t,n)=>(n=e!=null?$c(Lc(e)):{},Dc(t||!e||!e.__esModule?gs(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),ve=require("@nice2dev/ui-core"),d=require("react"),ie=require("@nice2dev/ui"),B=require("@nice2dev/icons"),la=require("pitchy"),Pa=require("react-youtube");var vt=typeof document<"u"?document.currentScript:null;const Ti=d.createContext(null),zc=({t:e,children:t})=>r.jsx(Ti.Provider,{value:e,children:t});function xe(){const e=d.useContext(Ti),{t}=ve.useNiceTranslation();return{t:d.useMemo(()=>e??((a,s)=>t(a,s??a)),[e,t])}}function Fc({componentName:e,error:t,onReset:n}){const{t:a}=xe();return r.jsx("div",{className:"nice-audio-error-boundary",role:"alert",children:r.jsxs("div",{className:"nice-audio-error-boundary__content",children:[r.jsx("h3",{className:"nice-audio-error-boundary__title",children:e?a("audioErrorBoundary.componentError","{name} encountered an error").replace("{name}",e):a("audioErrorBoundary.somethingWentWrong","Something went wrong")}),r.jsx("p",{className:"nice-audio-error-boundary__message",children:t.message}),r.jsx("button",{className:"nice-audio-error-boundary__retry",onClick:n,children:a("audioErrorBoundary.tryAgain","Try Again")})]})})}class Oc extends d.Component{constructor(){super(...arguments),this.state={hasError:!1,error:null},this.reset=()=>{this.setState({hasError:!1,error:null})}}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,n){var s,i;const a=this.props.componentName?`[${this.props.componentName}]`:"[AudioErrorBoundary]";console.error(`${a} Caught error:`,t,n),(i=(s=this.props).onError)==null||i.call(s,t,n)}render(){return this.state.hasError&&this.state.error?typeof this.props.fallback=="function"?this.props.fallback(this.state.error,this.reset):this.props.fallback?this.props.fallback:r.jsx(Fc,{componentName:this.props.componentName,error:this.state.error,onReset:this.reset}):this.props.children}}function Bc(e){if(!e)return[128,128,128];const t=e.match(/^#([0-9a-f]{3,8})$/i);if(t){let a=t[1];if(a.length===3&&(a=a[0]+a[0]+a[1]+a[1]+a[2]+a[2]),a.length>=6)return[parseInt(a.slice(0,2),16),parseInt(a.slice(2,4),16),parseInt(a.slice(4,6),16)]}const n=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/i);return n?[+n[1],+n[2],+n[3]]:[128,128,128]}const Kr={},ca={DEBUG:0,INFO:1,WARN:2,ERROR:3,NONE:4};function Gc(){const e=typeof{url:typeof document>"u"?require("url").pathToFileURL(__filename).href:vt&&vt.tagName.toUpperCase()==="SCRIPT"&&vt.src||new URL("index.cjs",document.baseURI).href}<"u"?Kr==null?void 0:Kr.VITE_LOG_LEVEL:void 0;return e&&e in ca?e:"WARN"}const Wc=Gc();function Kn(e){return ca[e]>=ca[Wc]}function Yn(e){return`[${e}]`}const st=(function(){return{debug(e,t,...n){Kn("DEBUG")&&console.debug(Yn(e),t,...n)},info(e,t,...n){Kn("INFO")&&console.info(Yn(e),t,...n)},warn(e,t,...n){Kn("WARN")&&console.warn(Yn(e),t,...n)},error(e,t,...n){Kn("ERROR")&&console.error(Yn(e),t,...n)},scoped(e){return{debug:(t,...n)=>st.debug(e,t,...n),info:(t,...n)=>st.info(e,t,...n),warn:(t,...n)=>st.warn(e,t,...n),error:(t,...n)=>st.error(e,t,...n)}}}})(),ys=st.scoped("Waveform"),Uc=["audio/","video/"],Pi=({audioBlob:e,currentTime:t,duration:n,width:a=600,height:s=200,zoom:i=1,onSeek:o,onRegionSelect:l,markers:c=[],regions:u=[],displayMode:h="waveform",multiChannel:p=!1,waveColor:g="var(--nice-color-primary, #007bff)",progressColor:y="var(--nice-color-error, rgba(255,0,0,0.8))",backgroundColor:m="transparent",showRuler:x=!1,showChannelLabels:b=!0,showPeakMeter:f=!1,className:j})=>{const{t:v}=xe(),C=d.useRef(null),N=d.useRef(null),[M,k]=d.useState(null),[T,E]=d.useState(0),[A,I]=d.useState(!1),[L,P]=d.useState(null),[_,ee]=d.useState(null),[K,z]=d.useState(0),V=Math.max(a,a*i),W=x?24:0;d.useEffect(()=>{if(!e||e.size===0){k(null);return}e.type&&!Uc.some(R=>e.type.startsWith(R))&&ys.warn("Unexpected blob MIME type:",e.type);let w=!1;return(async()=>{let R=null;try{const S=await e.arrayBuffer();if(S.byteLength===0||w)return;R=new AudioContext;const F=await R.decodeAudioData(S);w||k(F)}catch(S){ys.error("Failed to decode audio:",S)}finally{R==null||R.close().catch(()=>{})}})(),()=>{w=!0}},[e]),d.useEffect(()=>{if(i>1&&n>0){const w=t/n*V;(w<T||w>T+a)&&E(Math.max(0,w-a/2))}},[t,n,i,a,V,T]),d.useEffect(()=>{const w=C.current,R=M;if(!w||!n||n===1/0)return;const S=w.getContext("2d");if(!S)return;const F=V,Y=s;if(w.width=F,w.height=Y+W,S.clearRect(0,0,F,Y+W),m!=="transparent"&&(S.fillStyle=ve.resolveCssColor(m),S.fillRect(0,0,F,Y+W)),x){const O=ve.resolveCssColor("var(--nice-text-secondary, #888)");S.fillStyle=ve.resolveCssColor("var(--nice-bg-secondary, rgba(128,128,128,0.15))"),S.fillRect(0,0,F,W),S.fillStyle=O,S.font="10px monospace",S.textAlign="center";const U=Math.max(1,Math.floor(n/(V/80)));for(let $=0;$<=n;$+=U){const q=$/n*F;S.fillText(Kc($),q,W-4),S.fillStyle=ve.resolveCssColor("var(--nice-border-color, rgba(128,128,128,0.3))"),S.fillRect(q,W,1,Y),S.fillStyle=O}}for(const O of u){const U=O.start/n*F,$=O.end/n*F;S.fillStyle=ve.resolveCssColor(O.color??"var(--nice-accent-tint-15, rgba(99, 102, 241, 0.15))"),S.fillRect(U,W,$-U,Y),O.label&&(S.fillStyle=ve.resolveCssColor(O.color??"var(--nice-info, #6366f1)"),S.font="10px sans-serif",S.textAlign="left",S.fillText(O.label,U+2,W+12))}if(L!==null&&_!==null){const O=Math.min(L,_),U=Math.max(L,_);S.fillStyle=ve.resolveCssColor("var(--nice-warning-tint-20, rgba(255,200,0,0.2))"),S.fillRect(O,W,U-O,Y)}if(R){const O=p?R.numberOfChannels:1,U=Y/O,$=ve.resolveCssColor(g);let q=0;for(let X=0;X<O;X++){const re=R.getChannelData(X),oe=W+X*U;if(h==="waveform"?Vc(S,re,F,U,oe,$):h==="bars"?qc(S,re,F,U,oe,$):h==="spectrogram"&&Hc(S,re,F,U,oe,R.sampleRate),f&&n>0){const se=Math.floor(t/n*re.length),D=Math.floor(R.sampleRate*.05);let J=0;for(let ce=Math.max(0,se-D);ce<Math.min(re.length,se+D);ce++)J+=re[ce]*re[ce];const ae=Math.sqrt(J/(D*2));q=Math.max(q,ae)}p&&b&&O>1&&(S.fillStyle=ve.resolveCssColor("var(--nice-overlay-light-60, rgba(255, 255, 255, 0.6))"),S.font="bold 11px sans-serif",S.textAlign="left",S.fillText(X===0?"L":X===1?"R":`Ch${X+1}`,4,oe+14))}z(q)}if(n>0){const O=Math.max(0,Math.min(t/n*F,F));S.beginPath(),S.strokeStyle=ve.resolveCssColor(y),S.lineWidth=2,S.moveTo(O,W),S.lineTo(O,Y+W),S.stroke()}for(const O of c){const U=O.time/n*F,$=ve.resolveCssColor(O.color??"var(--nice-warning, #f59e0b)");S.beginPath(),S.strokeStyle=$,S.lineWidth=2,S.setLineDash([4,4]),S.moveTo(U,W),S.lineTo(U,Y+W),S.stroke(),S.setLineDash([]),O.label&&(S.fillStyle=$,S.font="bold 10px sans-serif",S.textAlign="center",S.fillText(O.label,U,W+Y-4))}},[M,t,n,V,s,i,h,p,g,y,m,x,c,u,L,_,f,b,W]);const H=d.useCallback(w=>{var F;if(!n)return;const R=(F=C.current)==null?void 0:F.getBoundingClientRect();if(!R)return;const S=w.clientX-R.left+T;I(!0),P(S),ee(S)},[n,T]),G=d.useCallback(w=>{if(!A||!C.current)return;const R=C.current.getBoundingClientRect(),S=w.clientX-R.left+T;ee(S)},[A,T]),Z=d.useCallback(()=>{if(!A||L===null||_===null||!n){I(!1),P(null),ee(null);return}const w=Math.min(L,_),R=Math.max(L,_),S=(R-w)/V*n;if(I(!1),P(null),ee(null),S<.2){const F=w/V*n;o==null||o(F)}else{const F=w/V*n,Y=R/V*n;l==null||l({start:F,end:Y})}},[A,L,_,n,V,o,l]);return r.jsxs("div",{ref:N,className:`nice-waveform${j?` ${j}`:""}`,style:{position:"relative",width:a,overflow:i>1?"auto":"hidden",cursor:o?"crosshair":"default"},onScroll:w=>E(w.target.scrollLeft),children:[r.jsx("canvas",{ref:C,width:V,height:s+W,style:{display:"block"},role:"img","aria-label":v("waveform.waveformCanvas","Waveform canvas"),onMouseDown:H,onMouseMove:G,onMouseUp:Z,onMouseLeave:Z}),f&&r.jsx("div",{style:{position:"absolute",right:4,top:W+4,bottom:4,width:12,background:"var(--nice-overlay-30, rgba(0, 0, 0, 0.3))",borderRadius:4,overflow:"hidden"},children:r.jsx("div",{style:{position:"absolute",bottom:0,width:"100%",height:`${Math.min(100,K*300)}%`,background:K>.8?"var(--nice-danger, #ef4444)":K>.5?"var(--nice-warning, #f59e0b)":"var(--nice-success, #22c55e)",borderRadius:4,transition:"height 50ms"}})})]})};function Vc(e,t,n,a,s,i){const o=Math.floor(t.length/n),l=s+a/2;e.beginPath(),e.strokeStyle=i,e.lineWidth=1;for(let c=0;c<n;c++){const u=c*o,h=t.subarray(u,u+o);let p=0,g=0;for(let x=0;x<h.length;x++)h[x]<p&&(p=h[x]),h[x]>g&&(g=h[x]);const y=l-g*(a/2),m=l-p*(a/2);e.moveTo(c,y),e.lineTo(c,m)}e.stroke()}function qc(e,t,n,a,s,i){const o=Math.max(2,Math.floor(n/128)),l=Math.floor(n/o),c=Math.floor(t.length/l);for(let u=0;u<l;u++){const h=u*c,p=t.subarray(h,h+c);let g=0;for(let b=0;b<p.length;b++)g+=Math.abs(p[b]);const m=g/p.length*a*.9,x=u*o;e.fillStyle=i,e.fillRect(x+1,s+a-m,o-2,m)}}function Hc(e,t,n,a,s,i){const l=Math.min(n,512),c=Math.floor(t.length/l),u=n/l;for(let h=0;h<l;h++){const p=h*c,g=new Float32Array(256/2);for(let m=0;m<256/2;m++){let x=0,b=0;for(let f=0;f<256&&p+f<t.length;f++){const j=2*Math.PI*m*f/256;x+=t[p+f]*Math.cos(j),b-=t[p+f]*Math.sin(j)}g[m]=Math.sqrt(x*x+b*b)/256}const y=a/g.length;for(let m=0;m<g.length;m++){const x=Math.min(1,g[m]*10),b=Math.floor(x*255),f=Math.floor(x*100),j=Math.floor((1-x)*200);e.fillStyle=`rgb(${b},${f},${j})`,e.fillRect(h*u,s+a-(m+1)*y,u+1,y+1)}}}function Kc(e){const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`}const vs=88,Jt=16,Zn=16,Yc=320;function Zc(e){return e-21}function Xc(e){return e+21}const Ea=({notes:e,onAddNote:t,onRemoveNote:n,selectedNoteId:a,setSelectedNoteId:s,duration:i=4,zoom:o=1})=>{const l=d.useRef(null),c=Yc*o,u=vs*Jt,h=d.useRef(null);d.useEffect(()=>{},[e,o,i]);const p=y=>{const m=l.current;if(!m)return;const x=m.getBoundingClientRect(),b=y.clientX-x.left,f=y.clientY-x.top,j=Math.floor(f/Jt),v=Xc(j),C=b/c*i;h.current={drawing:!0,startX:b,key:j},t(v,C,i/Zn)},g=(y,m)=>{m.stopPropagation(),s==null||s(y)};return r.jsxs("svg",{ref:l,width:c,height:u,style:{background:"var(--nice-bg-secondary, #f8fafc)",border:"1px solid var(--nice-border-color, #cbd5e1)",userSelect:"none",display:"block"},onMouseDown:p,children:[[...Array(vs)].map((y,m)=>r.jsx("rect",{x:0,y:m*Jt,width:c,height:Jt,fill:m%2===0?"var(--nice-bg-secondary, #f8fafc)":"var(--nice-bg-tertiary, #f1f5f9)"},m)),[...Array(Zn+1)].map((y,m)=>r.jsx("line",{x1:m*c/Zn,y1:0,x2:m*c/Zn,y2:u,stroke:"var(--nice-border-muted, #ccc)",strokeWidth:m%4===0?2:1},m)),e.map(y=>{const m=Zc(y.pitch),x=y.start/i*c,b=y.duration/i*c;return r.jsx("rect",{x,y:m*Jt,width:Math.max(6,b),height:Jt-2,fill:y.id===a?"var(--nice-color-primary, #6366f1)":"color-mix(in srgb, var(--nice-color-primary, #6366f1) 55%, var(--nice-bg-primary, #ffffff))",stroke:"var(--nice-color-primary, #6366f1)",strokeWidth:y.id===a?2:1,rx:3,onClick:f=>g(y.id,f),onDoubleClick:()=>n(y.id),style:{cursor:"pointer"}},y.id)})]})},Qc=({ccEvents:e,onAddEvent:t,onUpdateEvent:n,onRemoveEvent:a,ccType:s,duration:i,width:o,height:l=60,curveType:c})=>{const u=d.useRef(null),{t:h}=xe(),[p,g]=d.useState(null),[y,m]=d.useState(null),[x,b]=d.useState(null),f=[...e].sort((P,_)=>P.time-_.time),j=P=>[P.time/i*o,(127-P.value)/127*l],v=(P,_,ee)=>Math.max(_,Math.min(ee,P)),C=P=>{var W;if(P.target instanceof SVGCircleElement)return;const _=(W=u.current)==null?void 0:W.getBoundingClientRect();if(!_)return;const ee=P.clientX-_.left,K=P.clientY-_.top,z=v(ee/o*i,0,i),V=v(127-Math.round(K/l*127),0,127);t(s,V,z)},N=(P,_)=>{var V;_.stopPropagation(),g(P.id),b(P.id);const[ee,K]=j(P),z=(V=u.current)==null?void 0:V.getBoundingClientRect();z&&m({dx:_.clientX-z.left-ee,dy:_.clientY-z.top-K})},M=P=>{var W;if(p==null||!y)return;const _=(W=u.current)==null?void 0:W.getBoundingClientRect();if(!_)return;const ee=v(P.clientX-_.left-y.dx,0,o),K=v(P.clientY-_.top-y.dy,0,l),z=v(ee/o*i,0,i),V=v(127-Math.round(K/l*127),0,127);n(p,V,z)},k=()=>{g(null),m(null)};d.useEffect(()=>{const P=_=>{(_.key==="Delete"||_.key==="Backspace")&&x!=null&&(a(x),b(null))};return window.addEventListener("keydown",P),()=>window.removeEventListener("keydown",P)},[x,a]),d.useEffect(()=>{if(p!=null)return window.addEventListener("mousemove",M),window.addEventListener("mouseup",k),()=>{window.removeEventListener("mousemove",M),window.removeEventListener("mouseup",k)}});const[T,E]=d.useState(null),A=(P,_)=>{const[ee,K]=j(P);E({x:ee+10,y:K-10,text:h("ccLane.valTimeS","Val: {value}, Time: {time}s").replace("{value}",String(P.value)).replace("{time}",String(P.time.toFixed(2)))})},I=()=>E(null),L=P=>{var W;const _=(W=u.current)==null?void 0:W.getBoundingClientRect();if(!_)return;const ee=P.clientX-_.left,K=P.clientY-_.top,z=v(ee/o*i,0,i),V=v(127-Math.round(K/l*127),0,127);t(s,V,z)};return r.jsxs("svg",{ref:u,width:o,height:l,style:{background:"var(--nice-bg-tertiary, #f3f3f3)",border:"1px solid var(--nice-border, #bbb)",cursor:p?"grabbing":"crosshair",display:"block"},onClick:C,onDoubleClick:L,tabIndex:0,children:[[...Array(9)].map((P,_)=>r.jsx("line",{x1:0,y1:_*l/8,x2:o,y2:_*l/8,stroke:"var(--nice-border-muted, #ddd)",strokeWidth:_===0||_===8?2:1},_)),f.length>1&&r.jsx("polyline",{fill:"none",stroke:"var(--nice-color-accent, #1976d2)",strokeWidth:2,points:f.map(P=>j(P).join(",")).join(" ")}),f.map(P=>{const[_,ee]=j(P);return r.jsxs("g",{children:[r.jsx("circle",{cx:_,cy:ee,r:x===P.id?8:6,fill:x===P.id?"var(--nice-color-accent, #1976d2)":"var(--nice-color-accent-light, #90caf9)",stroke:"var(--nice-color-accent, #1976d2)",strokeWidth:x===P.id?3:2,style:{cursor:"pointer"},onMouseDown:K=>N(P,K),onContextMenu:K=>{K.preventDefault(),a(P.id)},onClick:K=>{K.stopPropagation(),b(P.id)},onMouseOver:K=>A(P),onMouseOut:I}),x===P.id&&r.jsx("foreignObject",{x:_+10,y:ee-18,width:90,height:30,style:{pointerEvents:"auto"},children:r.jsxs("div",{style:{fontSize:12,background:"var(--nice-color-surface, #fff)",border:"1px solid var(--nice-border, #bbb)",borderRadius:4,padding:"2px 6px",display:"inline-block"},children:[r.jsxs("label",{style:{marginRight:4},children:[h("ccLane.curve","Curve"),":"]}),r.jsxs("select",{value:P.handleType||c||"linear",onChange:K=>{n(P.id,P.value,P.time,K.target.value)},children:[r.jsx("option",{value:"linear",children:h("ccLane.linear","Linear")}),r.jsx("option",{value:"step",children:h("ccLane.step","Step")}),r.jsx("option",{value:"exp",children:h("ccLane.exponential","Exponential")})]})]})})]},P.id)}),T&&r.jsxs("g",{pointerEvents:"none",children:[r.jsx("rect",{x:T.x,y:T.y-18,width:90,height:20,fill:"var(--nice-color-surface, #fff)",stroke:"var(--nice-color-accent, #1976d2)",rx:4}),r.jsx("text",{x:T.x+6,y:T.y-4,fontSize:13,fill:"var(--nice-color-accent, #1976d2)",children:T.text})]}),r.jsxs("text",{x:6,y:16,fontSize:14,fill:"var(--nice-color-accent, #1976d2)",children:["CC",s]})]})},Jc=st.scoped("audioContext");let Gn=null;function qn(){if(!Gn)try{Gn=new(window.AudioContext||window.webkitAudioContext)}catch(e){Jc.error("Error initializing AudioContext:",e)}return Gn}async function Yt(){const e=qn();e&&e.state==="suspended"&&await e.resume()}function Ei(){return!!Gn&&Gn.state==="running"}function $i(e){const t=e.bpm/60;switch(e.snapMode){case"bar":return 4/t;case"beat":return 1/t;case"sub-beat":return 1/(t*4);case"second":default:return 1}}function ed(e,t){if(!t.snapEnabled)return e;const n=$i(t);return Math.round(e/n)*n}function td(e,t=!1){const n=Math.floor(e/60),a=Math.floor(e%60),s=Math.floor(e%1*1e3);return t?`${n}:${a.toString().padStart(2,"0")}.${s.toString().padStart(3,"0")}`:`${n}:${a.toString().padStart(2,"0")}`}function nd(e,t){const n=t/60,a=e*n,s=Math.floor(a/4),i=Math.floor(a%4);return`${s+1}:${i+1}`}function Ai(e,t,n=!0){const a=e.getContext("2d");if(!a)return;const s=30*t.zoom*t.duration,i=Math.max(80,30*t.zoom);e.width=s,e.height=i,a.clearRect(0,0,s,i),a.fillStyle=ve.resolveCssColor("var(--nice-color-surface, #f5f5f5)",a.canvas),a.fillRect(0,0,s,i);const o=s/t.duration;let l=1;o<30?l=5:o<60?l=2:o>150&&(l=.5),a.strokeStyle=ve.resolveCssColor("var(--nice-border-secondary, #ddd)",a.canvas),a.lineWidth=1;for(let c=0;c<=t.duration;c+=l){const u=c/t.duration*s,h=c%1===0;if(a.strokeStyle=ve.resolveCssColor(h?"var(--nice-border-secondary, #ccc)":"var(--nice-border-muted, #eee)",a.canvas),a.lineWidth=h?1.5:.5,a.beginPath(),a.moveTo(u,0),a.lineTo(u,i),a.stroke(),h&&o>40){a.fillStyle=ve.resolveCssColor("var(--nice-text-muted, #666)",a.canvas),a.font="10px monospace",a.textAlign="center";const p=n?nd(c,t.bpm):td(c);a.fillText(p,u,12)}}if(t.snapEnabled){const c=$i(t);a.strokeStyle=ve.resolveCssColor("var(--nice-color-accent, #ffeb3b)",a.canvas),a.lineWidth=.5;for(let u=0;u<=t.duration;u+=c){const h=u/t.duration*s;a.beginPath(),a.moveTo(h,i-5),a.lineTo(h,i),a.stroke()}}}function rd(e,t,n,a){const s=e.getContext("2d");if(!s)return;const i=30*t.zoom*t.duration,o=Math.max(80,30*t.zoom),l=n/t.duration*i;Ai(e,t),s.strokeStyle=ve.resolveCssColor(a?"var(--nice-color-danger, #f44336)":"var(--nice-color-accent, #2196f3)",s.canvas),s.lineWidth=2,s.beginPath(),s.moveTo(l,0),s.lineTo(l,o),s.stroke(),s.fillStyle=ve.resolveCssColor(a?"var(--nice-color-danger, #f44336)":"var(--nice-color-accent, #2196f3)",s.canvas),s.beginPath(),s.moveTo(l,0),s.lineTo(l-5,-8),s.lineTo(l+5,-8),s.closePath(),s.fill()}function ad(e,t,n,a="var(--nice-color-success, #4caf50)"){const s=e.getContext("2d");if(!s||!(n!=null&&n.length))return;const i=30*t.zoom*t.duration,l=e.height/2,c=Math.max(10,l-6);s.save(),s.strokeStyle=ve.resolveCssColor(a,s.canvas),s.lineWidth=1,s.beginPath(),n.forEach((u,h)=>{const p=h/(n.length-1)*i,g=l-u*c;h===0?s.moveTo(p,g):s.lineTo(p,g)}),s.stroke(),s.restore()}const Ii=({zoom:e=1,duration:t=4,isPlaying:n,isRecording:a,currentTime:s,bpm:i=120,snapEnabled:o=!1,snapMode:l="beat",waveform:c,waveformColor:u,onCurrentTimeChange:h,onZoomChange:p})=>{const{t:g}=xe(),y=d.useRef(null),[m,x]=d.useState(!1),b=d.useRef(s);b.current=s;const f=d.useRef(t);f.current=t;const j=d.useRef(h);j.current=h;const v={bpm:i,snapEnabled:o,snapMode:l};d.useEffect(()=>{Yt();const E=y.current;if(!E)return;const A={zoom:e,duration:t,bpm:i,snapEnabled:o,snapMode:l};Ai(E,A),c!=null&&c.length&&ad(E,A,c,u),rd(E,A,s,a)},[e,t,s,a,i,o,l,c,u]),d.useEffect(()=>{if(!n)return;let E=performance.now(),A=0;const I=L=>{const P=Math.max(0,L-E)/1e3;E=L;const _=Math.min(b.current+P,f.current);b.current=_,j.current(_),_<f.current&&(A=requestAnimationFrame(I))};return A=requestAnimationFrame(I),()=>cancelAnimationFrame(A)},[n]);const C=E=>{x(!0),k(E)},N=E=>{m&&k(E)},M=()=>{x(!1)},k=E=>{if(!y.current)return;const A=y.current.getBoundingClientRect();let L=(E.clientX-A.left)/A.width*t;L=ed(L,v),h(Math.min(Math.max(L,0),t))},T=E=>{if(!p)return;E.preventDefault();const A=E.deltaY>0?-.1:.1,I=Math.max(.5,Math.min(5,e+A));p(I)};return r.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"10px"},children:r.jsx("canvas",{ref:y,style:{border:"1px solid black",backgroundColor:"white",width:`${30*e*t}px`,height:`${Math.max(80,30*e)}px`,cursor:m?"grabbing":"pointer"},onMouseDown:C,onMouseMove:N,onMouseUp:M,onMouseLeave:M,onWheel:T,role:"img","aria-label":g("audioTimeline.audioTimelineCanvas","Audio timeline canvas")})})},Xe=["var(--nice-primary, #2196f3)","var(--nice-danger, #e53935)","var(--nice-warning, #ffeb3b)","var(--nice-success, #43a047)","var(--nice-warning, #ff9800)","var(--nice-accent, #9c27b0)","var(--nice-info, #00bcd4)","var(--nice-warning, #ffc107)","var(--nice-success, #8bc34a)","var(--nice-danger, #f44336)","var(--nice-accent, #3f51b5)","var(--nice-text-secondary, #607d8b)","var(--nice-warning-dark, #795548)","var(--nice-warning, #cddc39)","var(--nice-accent, #673ab7)","var(--nice-success, #009688)"];function sd(e){for(const t of Xe)if(!e.includes(t))return t;return Xe[Math.floor(Math.random()*Xe.length)]}const ur=Xe.map((e,t)=>`var(--player-color-${t+1}, ${e})`);function id(e){for(let t=0;t<Xe.length;t++){const n=Xe[t],a=ur[t];if(!e.includes(n)&&!e.includes(a))return a}return ur[Math.floor(Math.random()*ur.length)]}const od="_panel_3bj7x_3",ld="_panelCompact_3bj7x_19",cd="_panelNarrow_3bj7x_25",dd="_panelWide_3bj7x_31",ud="_heading_3bj7x_37",hd="_row_3bj7x_53",pd="_field_3bj7x_65",fd="_buttonRow_3bj7x_71",md="_sliderW200_3bj7x_83",gd="_sliderW240_3bj7x_89",yd="_selectW160_3bj7x_95",vd="_inputW120_3bj7x_101",bd="_inputW160_3bj7x_107",xd="_inputW200_3bj7x_113",Sd="_noteText_3bj7x_123",kd="_noteTextMargin_3bj7x_131",wd="_presetDivider_3bj7x_145",Cd="_presetLabel_3bj7x_159",jd="_countInAlert_3bj7x_173",Md="_levelLabel_3bj7x_181",Rd="_levelMeter_3bj7x_189",Nd="_levelBar_3bj7x_205",Td="_panelInactive_3bj7x_225",Pd="_header_3bj7x_231",Ed="_title_3bj7x_245",$d="_grid2_3bj7x_257",Ad="_full_3bj7x_267",Id="_label_3bj7x_275",Ld="_grow_3bj7x_291",_d="_pushRight_3bj7x_299",Dd="_alignStart_3bj7x_305",zd="_toolbar_3bj7x_311",Fd="_subPanel_3bj7x_325",ye={panel:od,panelCompact:ld,panelNarrow:cd,panelWide:dd,heading:ud,row:hd,field:pd,buttonRow:fd,sliderW200:md,sliderW240:gd,selectW160:yd,inputW120:vd,inputW160:bd,inputW200:xd,noteText:Sd,noteTextMargin:kd,presetDivider:wd,presetLabel:Cd,countInAlert:jd,levelLabel:Md,levelMeter:Rd,levelBar:Nd,panelInactive:Td,header:Pd,title:Ed,grid2:$d,full:Ad,label:Id,grow:Ld,pushRight:_d,alignStart:Dd,toolbar:zd,subPanel:Fd},Tt=e=>Array.isArray(e)?e[0]??"":e,Li=({autoSaveMode:e,setAutoSaveMode:t,autoSaveInterval:n,setAutoSaveInterval:a})=>{const{t:s}=xe();return r.jsxs("div",{className:`${ye.panel} ${ye.panelNarrow}`,children:[r.jsx("h6",{className:ye.heading,children:s("editorPanels.autoSaveTitle","Project auto-save")}),r.jsx("div",{className:ye.field,children:r.jsx(ie.NiceSelect,{label:s("editorPanels.autoSaveMode","Auto-save mode"),size:"sm",value:e,onChange:i=>t(Tt(i)),options:[{value:"off",label:s("editorPanels.off","Off")},{value:"onChange",label:s("editorPanels.onChange","On every change")},{value:"interval",label:s("editorPanels.interval","At set interval")},{value:"both",label:s("editorPanels.both","Both")}]})}),(e==="interval"||e==="both")&&r.jsx("div",{className:ye.field,children:r.jsx(ie.NiceNumberInput,{label:s("editorPanels.autoSaveFrequency","Auto-save frequency (seconds)"),size:"sm",min:5,max:600,value:n,onChange:i=>a(Math.max(5,Math.min(600,i??5)))})}),r.jsxs("div",{className:ye.noteText,children:[r.jsxs("b",{children:[s("editorPanels.noteLabel","Note"),":"]})," ",s("editorPanels.autoSaveNote","Auto-save works locally (localStorage/browser). Manual save (PUT) always overwrites the project on the server.")]})]})},_i=({undoCount:e,redoCount:t,onUndo:n,onRedo:a})=>{const{t:s}=xe();return r.jsxs("div",{className:`${ye.panel} ${ye.panelNarrow}`,children:[r.jsx("h6",{className:ye.heading,children:s("editorPanels.changeHistory","Project change history")}),r.jsxs("div",{className:ye.buttonRow,children:[r.jsxs(ie.NiceButton,{variant:"secondary",size:"sm",onClick:n,disabled:e===0,title:s("editorPanels.undoTitle","Undo last change (Ctrl+Z)"),children:[r.jsx(B.NtdUndo,{size:14})," ",s("editorPanels.undo","Undo")]}),r.jsxs(ie.NiceButton,{variant:"secondary",size:"sm",onClick:a,disabled:t===0,title:s("editorPanels.redoTitle","Redo change (Ctrl+Y or Ctrl+Shift+Z)"),children:[r.jsx(B.NtdRedo,{size:14})," ",s("editorPanels.redo","Redo")]})]}),r.jsx("div",{className:ye.noteTextMargin,children:s("editorPanels.undoRedoNote","Undo/Redo works on the entire project (all editor changes). After each change Redo is cleared.")})]})},bs=e=>`${e.toFixed(1)}x`,$a=({zoom:e,setZoom:t,uiZoom:n,setUiZoom:a,snapEnabled:s,onToggleSnap:i,snapMode:o,onSnapModeChange:l,bpm:c,setBpm:u})=>{const{t:h}=xe();return r.jsx("div",{className:`${ye.panel} ${ye.panelCompact} ${ye.panelNarrow}`,children:r.jsxs("div",{className:ye.row,children:[r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{label:h("editorPanels.zoom","Zoom"),size:"sm",min:.5,max:5,step:.1,value:e,onChange:t,showValue:!0,formatValue:bs})}),r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{label:h("editorPanels.uiZoom","Zoom UI"),size:"sm",min:1,max:4,step:.1,value:n,onChange:a,showValue:!0,formatValue:bs})}),r.jsx(ie.NiceCheckbox,{label:h("editorPanels.snap","Snap"),size:"sm",checked:s,onChange:()=>i()}),s&&r.jsx("div",{className:ye.selectW160,children:r.jsx(ie.NiceSelect,{size:"sm","aria-label":h("editorPanels.snapTo","Snap to"),value:o,onChange:p=>l(Tt(p)),options:[{value:"bar",label:h("editorPanels.snapBar","Bar")},{value:"beat",label:h("editorPanels.snapBeat","Beat")},{value:"sub-beat",label:h("editorPanels.snap16","1/16")},{value:"second",label:h("editorPanels.snapSecond","Second")}]})}),r.jsx("div",{className:ye.inputW120,children:r.jsx(ie.NiceNumberInput,{label:h("editorPanels.bpm","BPM"),size:"sm",min:20,max:300,value:c,onChange:p=>u(p??c)})})]})})},Od=[["peaking","Peaking"],["lowpass","Low-pass"],["highpass","High-pass"],["lowshelf","Low shelf"],["highshelf","High shelf"],["notch","Notch"],["bandpass","Band-pass"]],Di=({masterVolume:e,onMasterVolumeChange:t,filterType:n,filterFreq:a,filterQ:s,filterGain:i,onFilterChange:o,masterEQPresets:l,customPresets:c,onLoadPreset:u,onSavePreset:h,onDeletePreset:p})=>{const{t:g}=xe(),[y,m]=d.useState(""),x=()=>{y.trim()&&(h(y.trim()),m(""))};return r.jsxs("div",{className:`${ye.panel} ${ye.panelCompact} ${ye.panelWide}`,children:[r.jsxs("div",{className:ye.row,children:[r.jsx("div",{className:ye.sliderW240,children:r.jsx(ie.NiceSlider,{label:g("editorPanels.masterVolume","Master Vol"),size:"sm",min:0,max:1,step:.01,value:e,onChange:t,showValue:!0,formatValue:b=>`${Math.round(b*100)}%`})}),r.jsx("div",{className:ye.selectW160,children:r.jsx(ie.NiceSelect,{label:g("editorPanels.filter","Filter"),size:"sm",value:n,onChange:b=>o({type:Tt(b)}),options:Od.map(([b,f])=>({value:b,label:g(`editorPanels.filter.${b}`,f)}))})}),r.jsx("div",{className:ye.sliderW240,children:r.jsx(ie.NiceSlider,{label:g("editorPanels.frequency","Freq"),size:"sm",min:40,max:12e3,step:10,value:a,onChange:b=>o({frequency:b}),showValue:!0,formatValue:b=>`${Math.round(b)} Hz`})}),r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{label:"Q",size:"sm",min:.1,max:12,step:.1,value:s,onChange:b=>o({q:b}),showValue:!0,formatValue:b=>b.toFixed(1)})}),(n==="peaking"||n==="lowshelf"||n==="highshelf")&&r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{label:g("editorPanels.gain","Gain"),size:"sm",min:-18,max:18,step:.5,value:i,onChange:b=>o({gain:b}),showValue:!0,formatValue:b=>`${b.toFixed(1)} dB`})})]}),r.jsxs("div",{className:ye.presetDivider,children:[r.jsxs("div",{className:ye.row,children:[r.jsxs("span",{className:ye.presetLabel,children:[g("editorPanels.eqPresets","EQ Presets"),":"]}),[...l,...c].map(b=>r.jsx(ie.NiceButton,{variant:"outline",size:"xs",onClick:()=>u(b),children:b.name},b.name)),c.length>0&&r.jsx("div",{className:ye.selectW160,children:r.jsx(ie.NiceSelect,{size:"sm","aria-label":g("editorPanels.deletePreset","Delete preset..."),placeholder:g("editorPanels.deletePreset","Delete preset..."),value:"",onChange:b=>{const f=Tt(b);f&&p(f)},options:c.map(b=>({value:b.name,label:b.name}))})})]}),r.jsxs("div",{className:ye.row,children:[r.jsx("div",{className:ye.inputW200,children:r.jsx(ie.NiceTextInput,{size:"sm",controlWidth:"100%","aria-label":g("editorPanels.presetName","Preset name..."),placeholder:g("editorPanels.presetName","Preset name..."),value:y,onChange:m,onKeyDown:b=>b.key==="Enter"&&x()})}),r.jsx(ie.NiceButton,{variant:"success",size:"xs",onClick:x,disabled:!y.trim(),children:g("editorPanels.saveCurrent","Save Current")})]})]})]})},zi=({countInBars:e,setCountInBars:t,isCountIn:n,countInRemaining:a,overdubEnabled:s,setOverdubEnabled:i,punchIn:o,setPunchIn:l,punchOut:c,setPunchOut:u,monitorLevel:h})=>{const{t:p}=xe();return r.jsx("div",{className:`${ye.panel} ${ye.panelCompact} ${ye.panelWide}`,children:r.jsxs("div",{className:ye.row,children:[r.jsx("div",{className:ye.inputW200,children:r.jsx(ie.NiceNumberInput,{label:p("editorPanels.countIn","Count-in (bars)"),size:"sm",min:0,max:8,step:1,value:e,onChange:g=>t(g??0)})}),n&&r.jsx("span",{className:ye.countInAlert,children:p("editorPanels.countInRemaining","Count-in: {seconds}s").replace("{seconds}",a.toFixed(1))}),r.jsx(ie.NiceCheckbox,{label:p("editorPanels.overdub","Overdub (play background)"),size:"sm",checked:s,onChange:i}),r.jsx("div",{className:ye.inputW160,children:r.jsx(ie.NiceNumberInput,{label:p("editorPanels.punchIn","Punch In (s)"),size:"sm",min:0,step:.1,value:o,onChange:l})}),r.jsx("div",{className:ye.inputW160,children:r.jsx(ie.NiceNumberInput,{label:p("editorPanels.punchOut","Punch Out (s)"),size:"sm",min:0,step:.1,value:c,onChange:u})}),r.jsx(ie.NiceButton,{variant:"outline",size:"xs",onClick:()=>{l(null),u(null)},children:p("editorPanels.clearPunch","Clear punch")}),r.jsx("div",{className:ye.levelLabel,children:p("editorPanels.level","Level")}),r.jsx("div",{className:ye.levelMeter,role:"meter","aria-label":p("editorPanels.level","Level"),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(Math.min(1,h*2)*100),children:r.jsx("div",{className:ye.levelBar,style:{width:`${Math.min(1,h*2)*100}%`,background:h>.7?"var(--nice-danger, #f44336)":"var(--nice-success, #4caf50)"}})})]})})},Bd=[{id:1,name:"Audio 1",type:"audio",color:Xe[0],volume:.8,audioBlob:null},{id:2,name:"MIDI 1",type:"midi",color:Xe[1],volume:.8,notes:[]}],Gd=({initialTracks:e,tracks:t,onTracksChange:n,initialBpm:a=120,duration:s=30,height:i=480,title:o,displayMode:l="standard",onNew:c,onOpen:u,onSave:h,onExport:p,t:g})=>{var ae,ce;const{t:y}=xe(),m=g??y,x=o??m("audioStudio.untitledProject","Untitled project"),[b,f]=d.useState(l),j=b==="advanced",v=b!=="basic",[C,N]=d.useState(e??Bd),M=t??C,k=d.useCallback(le=>{t===void 0&&N(le),n==null||n(le)},[t,n]),[T,E]=d.useState(!1),[A,I]=d.useState(0),[L,P]=d.useState(1),[_,ee]=d.useState(2),[K,z]=d.useState(!0),[V,W]=d.useState("beat"),[H,G]=d.useState(a),[Z,w]=d.useState(80),[R,S]=d.useState(((ae=M[0])==null?void 0:ae.id)??null),F=d.useRef(0),Y=d.useRef(0);d.useEffect(()=>{if(!T)return;Y.current=performance.now();const le=ne=>{const pe=(ne-Y.current)/1e3;Y.current=ne,I(fe=>{const ge=fe+pe;return ge>=s?(E(!1),s):ge}),F.current=requestAnimationFrame(le)};return F.current=requestAnimationFrame(le),()=>cancelAnimationFrame(F.current)},[T,s]);const O=d.useCallback((le,ne)=>k(M.map(pe=>pe.id===le?{...pe,...ne}:pe)),[M,k]),U=d.useCallback(le=>{const ne=M.reduce((fe,ge)=>Math.max(fe,ge.id),0)+1,pe=M.filter(fe=>fe.type===le).length+1;k([...M,{id:ne,name:`${le==="audio"?"Audio":"MIDI"} ${pe}`,type:le,color:Xe[M.length%Xe.length],volume:.8,...le==="audio"?{audioBlob:null}:{notes:[]}}]),S(ne)},[M,k]),$=d.useCallback(le=>k(M.filter(ne=>ne.id!==le)),[M,k]),q=d.useCallback(()=>{if(c){c();return}k([]),I(0),E(!1)},[c,k]),X=d.useCallback((le,ne,pe,fe)=>{const ge=M.find(je=>je.id===le),he=(ge==null?void 0:ge.notes)??[],we=he.reduce((je,Pe)=>Math.max(je,Pe.id),0)+1;O(le,{notes:[...he,{id:we,pitch:ne,start:pe,duration:fe,velocity:100}]})},[M,O]),re=d.useCallback((le,ne)=>{const pe=M.find(fe=>fe.id===le);O(le,{notes:((pe==null?void 0:pe.notes)??[]).filter(fe=>fe.id!==ne)})},[M,O]),oe=d.useMemo(()=>{const le=Math.floor(A/60),ne=Math.floor(A%60),pe=Math.floor(A%1*100);return`${le}:${ne.toString().padStart(2,"0")}.${pe.toString().padStart(2,"0")}`},[A]),se=d.useMemo(()=>{const le=(pe,fe)=>({id:`mode-${pe}`,label:`${b===pe?"• ":" "}${fe}`,onClick:()=>f(pe)}),ne=[{id:"file",label:m("studio.menu.file","File"),children:[{id:"new",label:m("studio.menu.new","New"),onClick:q},...u?[{id:"open",label:m("studio.menu.open","Open…"),onClick:u}]:[],{id:"save",label:m("studio.menu.save","Save"),onClick:()=>h==null?void 0:h(M)},{id:"export",label:m("studio.menu.export","Export…"),onClick:()=>p==null?void 0:p(M)}]}];return v&&ne.push({id:"edit",label:m("studio.menu.edit","Edit"),children:[{id:"add-audio",label:m("studio.addAudio","Add audio track"),onClick:()=>U("audio")},{id:"add-midi",label:m("studio.addMidi","Add MIDI track"),onClick:()=>U("midi")}]}),ne.push({id:"view",label:m("studio.menu.view","View"),children:[{id:"modes",label:m("studio.menu.modes","Display mode"),divider:!1,disabled:!0},le("basic",m("studio.mode.basic","Basic")),le("standard",m("studio.mode.standard","Standard")),le("advanced",m("studio.mode.advanced","Advanced")),{id:"d1",divider:!0},{id:"snap",label:`${K?"• ":" "}${m("studio.snap","Snap to grid")}`,onClick:()=>z(pe=>!pe)}]}),ne.push({id:"help",label:m("studio.menu.help","Help"),children:[{id:"about",label:m("studio.menu.about","About NiceAudioStudio"),disabled:!0}]}),ne},[m,b,v,K,q,u,h,p,M,U]),D=r.jsxs(r.Fragment,{children:[r.jsxs(ie.NiceButton,{variant:"primary",size:"sm",onClick:()=>E(le=>!le),children:[T?r.jsx(B.NtdPause,{size:14}):r.jsx(B.NtdPlay,{size:14})," ",T?m("studio.pause","Pause"):m("studio.play","Play")]}),r.jsxs(ie.NiceButton,{variant:"secondary",size:"sm",onClick:()=>{E(!1),I(0)},children:[r.jsx(B.NtdStop,{size:14})," ",m("studio.stop","Stop")]}),r.jsx("span",{style:{fontVariantNumeric:"tabular-nums",fontWeight:700,minWidth:80},children:oe}),r.jsx("span",{style:{flex:1}}),r.jsxs(ie.NiceButton,{variant:"outline",size:"sm",onClick:()=>U("audio"),children:[r.jsx(B.NtdPlus,{size:14})," ",m("studio.addAudioShort","Audio")]}),v&&r.jsxs(ie.NiceButton,{variant:"outline",size:"sm",onClick:()=>U("midi"),children:[r.jsx(B.NtdPlus,{size:14})," ",m("studio.addMidiShort","MIDI")]}),r.jsx("span",{style:{fontSize:12,color:"var(--nice-text-muted, #94a3b8)"},children:m("studio.master","Master")}),r.jsx("div",{style:{width:90},children:r.jsx(ie.NiceSlider,{value:Z,onChange:w,min:0,max:100})})]}),J=r.jsxs(r.Fragment,{children:[r.jsxs("span",{children:[H," BPM"]}),r.jsx("span",{children:"·"}),r.jsx("span",{style:{fontVariantNumeric:"tabular-nums"},children:oe}),r.jsx("span",{children:"·"}),r.jsxs("span",{children:[M.length," ",m("studio.tracks","tracks")]}),j&&R!=null&&r.jsxs(r.Fragment,{children:[r.jsx("span",{children:"·"}),r.jsxs("span",{children:[m("studio.active","Active"),": ",((ce=M.find(le=>le.id===R))==null?void 0:ce.name)??"—"]})]}),r.jsx("span",{style:{flex:1}}),r.jsx("span",{style:{textTransform:"capitalize"},children:b})]});return r.jsxs(ie.NiceAppShell,{className:"nice-audio-studio",height:i,menubar:r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12},children:[r.jsx(ie.NiceMenu,{items:se,orientation:"horizontal"}),r.jsx("span",{style:{color:"var(--nice-text-secondary)",fontSize:13},children:x})]}),toolbar:D,statusBar:J,children:[v&&r.jsx("div",{style:{padding:"6px 12px",borderBottom:"1px solid var(--nice-border-color)"},children:r.jsx($a,{zoom:L,setZoom:P,uiZoom:_,setUiZoom:ee,snapEnabled:K,onToggleSnap:()=>z(le=>!le),snapMode:V,onSnapModeChange:W,bpm:H,setBpm:G})}),r.jsx("div",{style:{padding:8},children:r.jsx(Ii,{zoom:L,duration:s,isPlaying:T,isRecording:!1,currentTime:A,bpm:H,snapEnabled:K,snapMode:V,onCurrentTimeChange:I,onZoomChange:P})}),M.length===0?r.jsx("div",{style:{padding:32,textAlign:"center",color:"var(--nice-text-muted, #94a3b8)"},children:m("studio.empty","No tracks — add an audio or MIDI track to start.")}):M.map(le=>r.jsxs("div",{role:"presentation",onFocus:()=>S(le.id),style:{display:"flex",gap:8,padding:8,borderTop:"1px solid var(--nice-border-color)",background:R===le.id?"color-mix(in srgb, var(--nice-color-primary) 8%, transparent)":"transparent"},onClick:()=>S(le.id),children:[r.jsxs("div",{style:{flex:"0 0 180px",display:"flex",flexDirection:"column",gap:6},children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[r.jsx("span",{style:{width:10,height:10,borderRadius:"50%",background:le.color||Xe[0],flex:"0 0 auto"}}),r.jsx("div",{style:{flex:1},children:r.jsx(ie.NiceTextInput,{value:le.name,onChange:ne=>O(le.id,{name:ne}),size:"sm"})})]}),r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4},children:[r.jsx(ie.NiceButton,{variant:le.muted?"danger":"ghost",size:"sm",onClick:()=>O(le.id,{muted:!le.muted}),children:"M"}),v&&r.jsx(ie.NiceButton,{variant:le.solo?"warning":"ghost",size:"sm",onClick:()=>O(le.id,{solo:!le.solo}),children:"S"}),r.jsx("div",{style:{flex:1},children:r.jsx(ie.NiceSlider,{value:Math.round((le.volume??.8)*100),onChange:ne=>O(le.id,{volume:ne/100}),min:0,max:100})}),r.jsx(ie.NiceButton,{variant:"ghost",size:"sm",onClick:()=>$(le.id),children:r.jsx(B.NtdClose,{size:14})})]})]}),r.jsx("div",{style:{flex:1,minWidth:0,opacity:le.muted?.5:1},children:le.type==="audio"?r.jsx(Pi,{audioBlob:le.audioBlob??null,currentTime:A,duration:s,zoom:L,height:80,waveColor:le.color,onSeek:I}):r.jsx(Ea,{notes:le.notes??[],onAddNote:(ne,pe,fe)=>X(le.id,ne,pe,fe),onRemoveNote:ne=>re(le.id,ne),duration:s,zoom:L})})]},le.id))]})},Fi=({data:e,width:t=200,height:n=40,color:a="var(--nice-accent, #8b5cf6)",progress:s=0,onClick:i})=>{const o=d.useRef(null);d.useEffect(()=>{const c=o.current;if(!c||!e)return;const u=c.getContext("2d");if(!u)return;const h=window.devicePixelRatio||1;c.width=t*h,c.height=n*h,u.scale(h,h),u.clearRect(0,0,t,n);const p=t/e.length,g=n/2;for(let y=0;y<e.length;y++){const m=y*p,x=e[y]*n*.9,b=y/e.length<s;u.fillStyle=b?a:`${a}66`,u.fillRect(m,g-x/2,Math.max(1,p-1),x)}s>0&&s<1&&(u.strokeStyle=ve.resolveCssColor("var(--nice-bg, #fff)",u.canvas),u.lineWidth=2,u.beginPath(),u.moveTo(s*t,0),u.lineTo(s*t,n),u.stroke())},[e,t,n,a,s]);const l=d.useCallback(c=>{if(!i)return;const u=c.currentTarget.getBoundingClientRect(),h=c.clientX-u.left;i(h/u.width)},[i]);return r.jsx("canvas",{ref:o,className:"nice-sample-waveform",width:t,height:n,style:{width:t,height:n},onClick:l})},Wd=({sample:e,isSelected:t,isPlaying:n,playProgress:a,showWaveform:s,showAnalysis:i,onSelect:o,onPlay:l,onStop:c,onDragStart:u,onFavorite:h})=>{const{t:p}=xe(),g=m=>{const x=Math.floor(m/60),b=Math.floor(m%60);return`${x}:${b.toString().padStart(2,"0")}`},y=m=>m<1024?`${m} B`:m<1024*1024?`${(m/1024).toFixed(1)} KB`:`${(m/(1024*1024)).toFixed(1)} MB`;return r.jsxs("div",{role:"button",tabIndex:0,onKeyDown:ve.clickOnActivationKey,className:`nice-sample-row ${t?"nice-sample-row--selected":""} ${n?"nice-sample-row--playing":""}`,onClick:o,draggable:!0,onDragStart:u,children:[r.jsx("button",{type:"button",className:"nice-sample-row__play",onClick:m=>{m.stopPropagation(),n?c():l()},"aria-label":n?p("sampleBrowser.stop","Stop"):p("sampleBrowser.play","Play"),title:n?p("sampleBrowser.stop","Stop"):p("sampleBrowser.play","Play"),children:n?r.jsx(B.NtdStop,{size:14}):r.jsx(B.NtdPlay,{size:14})}),r.jsx("button",{type:"button",className:`nice-sample-row__fav ${e.favorite?"nice-sample-row__fav--active":""}`,onClick:m=>{m.stopPropagation(),h()},"aria-label":p("sampleBrowser.favorite","Favorite"),children:r.jsx(B.NtdStar,{size:14,style:{color:e.favorite?"var(--nice-warning, #facc15)":"var(--nice-text-muted)"}})}),r.jsx("div",{className:"nice-sample-row__name",title:e.name,children:e.name}),s&&r.jsx("div",{className:"nice-sample-row__waveform",children:r.jsx(Fi,{data:e.waveformData,progress:a})}),r.jsx("div",{className:"nice-sample-row__duration",children:g(e.duration)}),i&&r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"nice-sample-row__bpm",children:e.bpm?`${e.bpm} BPM`:"—"}),r.jsx("div",{className:"nice-sample-row__key",children:e.key||"—"})]}),r.jsx("div",{className:"nice-sample-row__size",children:y(e.fileSize)}),e.tags&&e.tags.length>0&&r.jsx("div",{className:"nice-sample-row__tags",children:e.tags.slice(0,2).map(m=>r.jsx("span",{className:"nice-sample-row__tag",children:m},m))})]})},Ud=({folders:e=[],samples:t=[],onSampleSelect:n,onSampleDragStart:a,onFolderSelect:s,onAnalyze:i,audioContext:o,showWaveform:l=!0,showAnalysis:c=!0,sortBy:u="name",sortDirection:h="asc",filterTags:p,searchQuery:g="",className:y=""})=>{const{t:m}=xe(),[x,b]=d.useState(null),[f,j]=d.useState(null),[v,C]=d.useState(null),[N,M]=d.useState(0),[k,T]=d.useState(new Map),[E,A]=d.useState(t),I=d.useRef(null),L=d.useRef(null);d.useEffect(()=>(I.current=new Audio,I.current.addEventListener("ended",()=>{C(null),M(0)}),()=>{I.current&&(I.current.pause(),I.current=null),L.current&&clearInterval(L.current)}),[]);const P=d.useMemo(()=>{let H=[...E];if(g){const G=g.toLowerCase();H=H.filter(Z=>{var w;return Z.name.toLowerCase().includes(G)||((w=Z.tags)==null?void 0:w.some(R=>R.toLowerCase().includes(G)))})}return p&&p.length>0&&(H=H.filter(G=>{var Z;return(Z=G.tags)==null?void 0:Z.some(w=>p.includes(w))})),f&&(H=f.samples||[]),H.sort((G,Z)=>{var R,S;let w=0;switch(u){case"name":w=G.name.localeCompare(Z.name);break;case"duration":w=G.duration-Z.duration;break;case"bpm":w=(G.bpm||0)-(Z.bpm||0);break;case"key":w=(G.key||"").localeCompare(Z.key||"");break;case"date":w=(((R=G.dateAdded)==null?void 0:R.getTime())||0)-(((S=Z.dateAdded)==null?void 0:S.getTime())||0);break}return h==="asc"?w:-w}),H},[E,g,p,f,u,h]),_=d.useCallback(H=>{b(H),n==null||n(H)},[n]),ee=d.useCallback(async H=>{if(I.current&&(I.current.pause(),L.current&&clearInterval(L.current),I.current.src=H.url||H.path,I.current.play(),C(H.id),M(0),L.current=window.setInterval(()=>{I.current&&M(I.current.currentTime/I.current.duration)},50),c&&!k.has(H.id)&&i))try{const G=await i(H);T(Z=>new Map(Z).set(H.id,G)),A(Z=>Z.map(w=>w.id===H.id?{...w,bpm:G.bpm,key:G.key,waveformData:G.waveformData}:w))}catch(G){console.error("Failed to analyze sample:",G)}},[c,k,i]),K=d.useCallback(()=>{I.current&&(I.current.pause(),I.current.currentTime=0),L.current&&clearInterval(L.current),C(null),M(0)},[]),z=d.useCallback(H=>{A(G=>G.map(Z=>Z.id===H?{...Z,favorite:!Z.favorite}:Z))},[]),V=d.useCallback((H,G)=>{G.dataTransfer.setData("application/json",JSON.stringify(H)),G.dataTransfer.effectAllowed="copy",a==null||a(H,G)},[a]),W=(H,G=0)=>{var Z;return r.jsxs("div",{className:"nice-sample-folder",style:{paddingLeft:G*16},children:[r.jsxs("button",{type:"button",className:`nice-sample-folder__btn ${(f==null?void 0:f.id)===H.id?"nice-sample-folder__btn--selected":""}`,onClick:()=>{j(H),s==null||s(H)},children:[r.jsx("span",{className:"nice-sample-folder__icon","aria-hidden":"true",children:r.jsx(B.NtdFolder,{size:14})}),r.jsx("span",{className:"nice-sample-folder__name",children:H.name}),H.samples&&r.jsx("span",{className:"nice-sample-folder__count",children:H.samples.length})]}),(Z=H.children)==null?void 0:Z.map(w=>W(w,G+1))]},H.id)};return r.jsxs("div",{className:`nice-sample-browser ${y}`,children:[e.length>0&&r.jsx("div",{className:"nice-sample-browser__sidebar",children:r.jsxs("div",{className:"nice-sample-browser__folders",children:[r.jsxs("button",{type:"button",className:`nice-sample-folder__btn ${f?"":"nice-sample-folder__btn--selected"}`,onClick:()=>j(null),children:[r.jsx("span",{className:"nice-sample-folder__icon","aria-hidden":"true",children:r.jsx(B.NtdMusic,{size:14})}),r.jsx("span",{className:"nice-sample-folder__name",children:m("sampleBrowser.allSamples","All Samples")}),r.jsx("span",{className:"nice-sample-folder__count",children:E.length})]}),e.map(H=>W(H))]})}),r.jsxs("div",{className:"nice-sample-browser__main",children:[r.jsxs("div",{className:"nice-sample-browser__header",children:[r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--play"}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--fav"}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--name",children:m("sampleBrowser.name","Name")}),l&&r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--waveform",children:m("sampleBrowser.waveform","Waveform")}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--duration",children:m("sampleBrowser.duration","Duration")}),c&&r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--bpm",children:"BPM"}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--key",children:m("sampleBrowser.key2","Key")})]}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--size",children:m("sampleBrowser.size","Size")}),r.jsx("div",{className:"nice-sample-browser__col nice-sample-browser__col--tags",children:m("sampleBrowser.tags","Tags")})]}),r.jsx("div",{className:"nice-sample-browser__list",children:P.length===0?r.jsx("div",{className:"nice-sample-browser__empty",children:m("sampleBrowser.noSamplesFound","No samples found")}):P.map(H=>r.jsx(Wd,{sample:H,isSelected:(x==null?void 0:x.id)===H.id,isPlaying:v===H.id,playProgress:v===H.id?N:0,showWaveform:l,showAnalysis:c,onSelect:()=>_(H),onPlay:()=>ee(H),onStop:K,onDragStart:G=>V(H,G),onFavorite:()=>z(H.id)},H.id))})]}),x&&r.jsxs("div",{className:"nice-sample-browser__preview",children:[r.jsx("h3",{className:"nice-sample-browser__preview-title",children:x.name}),r.jsx(Fi,{data:x.waveformData,width:300,height:80,progress:v===x.id?N:0}),r.jsxs("div",{className:"nice-sample-browser__preview-info",children:[r.jsx("div",{children:m("sampleBrowser.durationS","Duration: {duration}s").replace("{duration}",String(x.duration.toFixed(2)))}),r.jsx("div",{children:m("sampleBrowser.sampleRateHz","Sample Rate: {sampleRate} Hz").replace("{sampleRate}",String(x.sampleRate))}),r.jsx("div",{children:m("sampleBrowser.channels","Channels: {channels}").replace("{channels}",String(x.channels))}),x.bpm&&r.jsx("div",{children:m("sampleBrowser.bpm","BPM: {bpm}").replace("{bpm}",String(x.bpm))}),x.key&&r.jsx("div",{children:m("sampleBrowser.key","Key: {key}").replace("{key}",String(x.key))})]})]})]})};function Oi(e){return{past:[],present:e,future:[]}}function Bi(e,t){return{past:[...e.past.slice(-99),e.present],present:t,future:[]}}function Gi(e){if(e.past.length===0)return e;const t=e.past[e.past.length-1];return{past:e.past.slice(0,-1),present:t,future:[e.present,...e.future]}}function Wi(e){if(e.future.length===0)return e;const t=e.future[0];return{past:[...e.past,e.present],present:t,future:e.future.slice(1)}}function Ui(e){return e.past.length>0}function Vi(e){return e.future.length>0}function da(e,t){return e.filter(n=>n.time>=t.start&&n.time<=t.end).map(n=>({...n}))}function qi(e,t,n){if(t.length===0)return e;const a=Math.min(...t.map(o=>o.time)),s=n-a,i=t.map(o=>({...o,id:Date.now()+Math.floor(Math.random()*1e4)+o.id,time:o.time+s}));return[...e,...i]}function Hi(e,t){const n=[],a=[];for(const s of e)s.time>=t.start&&s.time<=t.end?n.push({...s}):a.push(s);return{remaining:a,cut:n}}function Ki(e,t){return e.filter(n=>n.time<t.start||n.time>t.end)}function Vd(e,t){return e.filter(n=>n.time>=t.start&&n.time<=t.end).map(n=>n.id)}function Yi(e,t,n,a){const s={id:Date.now()+Math.floor(Math.random()*1e4),cc:t,value:n,time:a};return[...e,s]}function Zi(e,t=3){if(e.length<=2)return e;const n=[...e].sort((s,i)=>s.time-i.time),a=[n[0]];for(let s=1;s<n.length-1;s++)s%t===0&&a.push(n[s]);return a.push(n[n.length-1]),a}function Xi(e){return JSON.stringify(e,null,2)}function Qi(e){try{const t=JSON.parse(e);return Array.isArray(t)?t.filter(n=>typeof n=="object"&&n!==null&&"id"in n&&"cc"in n&&"value"in n&&"time"in n):[]}catch{return[]}}function gt(e,t){var n;return((n=e.find(a=>a.layerId===t))==null?void 0:n.events)??[]}function jt(e,t,n){return e.find(s=>s.layerId===t)?e.map(s=>s.layerId===t?{...s,events:n}:s):[...e,{layerId:t,events:n}]}function qd(e,t){switch(t.type){case"UNDO":return Gi(e);case"REDO":return Wi(e);default:{let n=e.present;switch(t.type){case"ADD_EVENT":{const a=[...gt(n,t.layerId),t.event];n=jt(n,t.layerId,a);break}case"UPDATE_EVENT":{const a=gt(n,t.layerId).map(s=>s.id===t.id?{...s,value:t.value,time:t.time,handleType:t.handleType??s.handleType}:s);n=jt(n,t.layerId,a);break}case"REMOVE_EVENT":{const a=gt(n,t.layerId).filter(s=>s.id!==t.id);n=jt(n,t.layerId,a);break}case"SET_EVENTS":n=jt(n,t.layerId,t.events);break;case"PASTE":{const a=gt(n,t.layerId),s=qi(a,t.clipboard,t.targetTime);n=jt(n,t.layerId,s);break}case"CUT":{const a=gt(n,t.layerId),{remaining:s}=Hi(a,t.range);n=jt(n,t.layerId,s);break}case"DELETE_RANGE":{const a=gt(n,t.layerId),s=Ki(a,t.range);n=jt(n,t.layerId,s);break}case"RECORD":{const a=gt(n,t.layerId),s=Yi(a,t.cc,t.value,t.time);n=jt(n,t.layerId,s);break}case"THIN":{const a=gt(n,t.layerId),s=Zi(a,t.keepEveryN);n=jt(n,t.layerId,s);break}case"IMPORT":{const a=Qi(t.json);a.length>0&&(n=jt(n,t.layerId,a));break}}return Bi(e,n)}}}function Ji(e=[]){const[t,n]=d.useReducer(qd,Oi(e)),a=d.useRef([]),s=d.useCallback(v=>gt(t.present,v),[t.present]),i=d.useCallback((v,C)=>n({type:"ADD_EVENT",layerId:v,event:C}),[]),o=d.useCallback((v,C,N,M,k)=>n({type:"UPDATE_EVENT",layerId:v,id:C,value:N,time:M,handleType:k}),[]),l=d.useCallback((v,C)=>n({type:"REMOVE_EVENT",layerId:v,id:C}),[]),c=d.useCallback((v,C)=>n({type:"SET_EVENTS",layerId:v,events:C}),[]),u=d.useCallback(()=>n({type:"UNDO"}),[]),h=d.useCallback(()=>n({type:"REDO"}),[]),p=d.useCallback((v,C)=>{a.current=da(gt(t.present,v),C)},[t.present]),g=d.useCallback((v,C)=>{a.current=da(gt(t.present,v),C),n({type:"CUT",layerId:v,range:C})},[t.present]),y=d.useCallback((v,C)=>{a.current.length>0&&n({type:"PASTE",layerId:v,clipboard:a.current,targetTime:C})},[]),m=d.useCallback((v,C)=>n({type:"DELETE_RANGE",layerId:v,range:C}),[]),x=d.useCallback((v,C,N,M)=>n({type:"RECORD",layerId:v,cc:C,value:N,time:M}),[]),b=d.useCallback((v,C)=>n({type:"THIN",layerId:v,keepEveryN:C}),[]),f=d.useCallback(v=>Xi(gt(t.present,v)),[t.present]),j=d.useCallback((v,C)=>n({type:"IMPORT",layerId:v,json:C}),[]);return{snapshots:t.present,getEvents:s,addEvent:i,updateEvent:o,removeEvent:l,setEvents:c,undo:u,redo:h,canUndo:Ui(t),canRedo:Vi(t),copy:p,cut:g,paste:y,clipboard:a.current,deleteRange:m,record:x,thin:b,exportLane:f,importLane:j}}let Hd=Date.now();function yn(){return Hd++}function Kd(e,t,n=.01){if(e.length===0)return[];const a=[];let s=-1/0;for(const i of e)i.time-s>=n&&(a.push({id:yn(),cc:t,value:vn(i.value),time:i.time}),s=i.time);return a}function xs(e,t,n,a=32){const s=[];for(let i=0;i<=a;i++){const o=i/a;s.push({id:yn(),cc:n,value:vn(jr(e.value,t.value,o)),time:jr(e.time,t.time,o)})}return s}function Yd(e,t,n,a,s=48){const i=[];for(let o=0;o<=s;o++){const l=o/s,c=Ss(e.time,t.time,n.time,l),u=Ss(e.value,t.value,n.value,l);i.push({id:yn(),cc:a,value:vn(u),time:c})}return i}function Zd(e,t,n,a=8){const s=[],i=(t.time-e.time)/a,o=(t.value-e.value)/a;for(let l=0;l<a;l++){const c=e.time+l*i,u=vn(e.value+l*o);s.push({id:yn(),cc:n,value:u,time:c}),s.push({id:yn(),cc:n,value:u,time:c+i-.001})}return s}function Xd(e,t,n,a=2,s=32){const i=[];for(let o=0;o<=s;o++){const l=o/s,c=Math.pow(l,a);i.push({id:yn(),cc:n,value:vn(jr(e.value,t.value,c)),time:jr(e.time,t.time,l)})}return i}function Qd(e,t=3){if(e.length<t)return e;const n=[...e].sort((a,s)=>a.time-s.time);return n.map((a,s)=>{const i=Math.max(0,s-Math.floor(t/2)),o=Math.min(n.length,i+t),l=n.slice(i,o),c=l.reduce((u,h)=>u+h.value,0)/l.length;return{...a,value:vn(Math.round(c))}})}function Jd(e,t){let n;switch(e.mode){case"pencil":n=Kd(t,e.cc,e.resolution);break;case"line":n=t.length>=2?xs(t[0],t[t.length-1],e.cc):[];break;case"curve":t.length>=3?n=Yd(t[0],t[Math.floor(t.length/2)],t[t.length-1],e.cc):t.length>=2?n=xs(t[0],t[t.length-1],e.cc):n=[];break;case"step":n=t.length>=2?Zd(t[0],t[t.length-1],e.cc):[];break;case"ramp":n=t.length>=2?Xd(t[0],t[t.length-1],e.cc):[];break;default:n=[]}if(e.smoothing>0){const a=Math.max(2,Math.round(e.smoothing*8));n=Qd(n,a)}return n}function vn(e){return Math.max(0,Math.min(127,Math.round(e)))}function jr(e,t,n){return e+(t-e)*n}function Ss(e,t,n,a){const s=1-a;return s*s*e+2*s*a*t+a*a*n}function _r(){return{waveform:"sine",rate:1,depth:.5,phase:0,center:.5,syncToBpm:!1,syncDivision:"1/4",enabled:!0}}const eu={"4/1":.25,"2/1":.5,"1/1":1,"1/2":2,"1/4":4,"1/8":8,"1/16":16,"1/32":32,"1/2t":3,"1/4t":6,"1/8t":12,"1/16t":24};function eo(e,t){return e/60*eu[t]/4}function to(e,t){const n=(t%1+1)%1;switch(e){case"sine":return Math.sin(n*2*Math.PI);case"triangle":return n<.5?4*n-1:3-4*n;case"sawtooth":return 2*n-1;case"square":return n<.5?1:-1;case"random":return Math.sin(n*127.1)*Math.cos(n*311.7)*2;case"sample-hold":return Math.sin(Math.floor(n*4)*2.399+.5)*2-1;default:return 0}}function Aa(e,t,n){if(!e.enabled)return e.center;const a=e.syncToBpm&&n?eo(n,e.syncDivision):e.rate,s=t*a+e.phase/(2*Math.PI),i=to(e.waveform,s),o=e.center+i*e.depth*.5;return Math.max(0,Math.min(1,o))}function Ia(e,t,n){return Math.round(Aa(e,t,n)*127)}function no(e,t,n,a,s=30,i){const o=n-t,l=Math.max(2,Math.ceil(o*s)),c=[];for(let u=0;u<=l;u++){const h=t+u/l*o,p=Ia(e,h,i);c.push({time:h,value:p,cc:a})}return c}function ro(e,t,n,a=2,s,i=200){const o=[];for(let l=0;l<=i;l++){const c=l/i*a,u=Aa(e,c,s);o.push({x:l/i*t,y:(1-u)*n})}return o}function tu(e){return JSON.stringify(e,null,2)}function nu(e){try{const t=JSON.parse(e);return!t||typeof t.waveform!="string"?null:t}catch{return null}}const Yr=140,bn=24,ru=[{cc:1,key:"modWheel",label:"Mod Wheel"},{cc:7,key:"volume",label:"Volume"},{cc:10,key:"pan",label:"Pan"},{cc:11,key:"expression",label:"Expression"},{cc:64,key:"sustain",label:"Sustain"},{cc:74,key:"brightness",label:"Brightness"}],au=[{mode:"pencil",label:"Pencil"},{mode:"line",label:"Line"},{mode:"curve",label:"Curve"},{mode:"step",label:"Step"},{mode:"ramp",label:"Ramp"}],su=["sine","triangle","sawtooth","square","random","sample-hold"],iu=({layerId:e=0,ccNumber:t,duration:n=8,zoom:a=1,automation:s,onChangeCCNumber:i})=>{const o=Ji(),l=s??o,[c,u]=ve.useControllableState({value:t,fallbackValue:1,onChange:i,componentName:"NiceCCAutomationLaneEditor"}),{t:h}=xe(),p=d.useRef(null),[g,y]=d.useState("pencil"),[m,x]=d.useState(!1),b=d.useRef([]),[f,j]=d.useState(null),[v,C]=d.useState(!1),[N,M]=d.useState(_r()),k=d.useRef(null),T=l.getEvents(e),E=T.filter(w=>w.cc===c),A=Math.max(400,n*30*a),I=d.useCallback(w=>w/A*n,[A,n]),L=d.useCallback(w=>Math.round(Math.max(0,Math.min(127,127-(w-bn)/Yr*127))),[]),P=d.useCallback(w=>w/n*A,[A,n]),_=d.useCallback(w=>bn+(127-w)/127*Yr,[]),ee=d.useCallback(()=>{const w=p.current;if(!w)return;const R=w.getContext("2d");if(!R)return;const S=w.width,F=w.height;R.clearRect(0,0,S,F),R.fillStyle=ve.resolveCssColor("var(--nice-bg, #1a1a2e)",R.canvas),R.fillRect(0,0,S,F);const Y=ve.resolveCssColor("var(--nice-border-color, #cbd5e1)",R.canvas);R.strokeStyle=Y,R.lineWidth=1,R.globalAlpha=.5;for(let $=0;$<=127;$+=16){const q=_($);R.beginPath(),R.moveTo(0,q),R.lineTo(S,q),R.stroke()}R.globalAlpha=1,R.fillStyle=ve.resolveCssColor("var(--nice-text-muted, #64748b)",R.canvas),R.font="10px monospace",R.textBaseline="middle";for(const $ of[0,32,64,96,127])R.fillText(String($),2,_($));R.strokeStyle=Y,R.globalAlpha=.3;for(let $=0;$<=n;$++){const q=P($);R.beginPath(),R.moveTo(q,0),R.lineTo(q,F),R.stroke()}R.globalAlpha=1;const O=[...E].sort(($,q)=>$.time-q.time);if(O.length>0){R.beginPath(),R.moveTo(P(O[0].time),F-bn);for(const $ of O)R.lineTo(P($.time),_($.value));R.lineTo(P(O[O.length-1].time),F-bn),R.closePath(),R.fillStyle=ve.resolveCssColor("var(--nice-primary-tint-15, rgba(59, 130, 246, 0.15))",R.canvas),R.fill(),R.beginPath(),R.strokeStyle=ve.resolveCssColor("var(--nice-primary, #3b82f6)",R.canvas),R.lineWidth=2;for(let $=0;$<O.length;$++){const q=P(O[$].time),X=_(O[$].value);$===0?R.moveTo(q,X):((O[$].handleType??"linear")==="step"&&R.lineTo(q,_(O[$-1].value)),R.lineTo(q,X))}R.stroke();for(const $ of O){const q=P($.time),X=_($.value),re=f===$.id;R.beginPath(),R.arc(q,X,re?6:4,0,Math.PI*2),R.fillStyle=ve.resolveCssColor(re?"var(--nice-primary-light, #60a5fa)":"var(--nice-primary, #3b82f6)",R.canvas),R.fill(),R.strokeStyle=ve.resolveCssColor("var(--nice-bg, #fff)",R.canvas),R.lineWidth=1.5,R.stroke()}}R.strokeStyle=Y,R.lineWidth=1,R.setLineDash([4,4]);const U=_(0);R.beginPath(),R.moveTo(0,U),R.lineTo(S,U),R.stroke(),R.setLineDash([])},[E,n,P,_,f]);d.useEffect(()=>{ee()},[ee]);const K=w=>{var Y;const R=(Y=p.current)==null?void 0:Y.getBoundingClientRect();if(!R)return;const S=w.clientX-R.left,F=w.clientY-R.top;g==="pencil"?(x(!0),b.current=[{time:I(S),value:L(F)}]):(x(!0),b.current=[{time:I(S),value:L(F)}])},z=w=>{var U;const R=(U=p.current)==null?void 0:U.getBoundingClientRect();if(!R)return;const S=w.clientX-R.left,F=w.clientY-R.top;m&&b.current.push({time:I(S),value:L(F)});const Y=[...E].sort(($,q)=>$.time-q.time);let O=null;for(const $ of Y){const q=P($.time),X=_($.value);if(Math.abs(S-q)<8&&Math.abs(F-X)<8){O=$.id;break}}j(O)},V=()=>{if(!m)return;x(!1);const w=b.current;if(w.length===0)return;const R=Jd({mode:g,cc:c,resolution:.02,smoothing:g==="pencil"?.3:0},w);R.length>0&&l.setEvents(e,[...T,...R]),b.current=[]},W=w=>{var Y;const R=(Y=p.current)==null?void 0:Y.getBoundingClientRect();if(!R)return;const S=w.clientX-R.left,F=w.clientY-R.top;for(const O of E){const U=P(O.time),$=_(O.value);if(Math.abs(S-U)<8&&Math.abs(F-$)<8){l.removeEvent(e,O.id);return}}l.addEvent(e,{id:Date.now()+Math.floor(Math.random()*1e4),cc:c,value:L(F),time:I(S)})},H=()=>{const R=no(N,0,n,c,Math.ceil(n*20),120).map((S,F)=>({...S,id:Date.now()+F}));l.setEvents(e,[...T,...R]),C(!1)},G=()=>{const w=l.exportLane(e),R=new Blob([w],{type:"application/json"}),S=URL.createObjectURL(R),F=document.createElement("a");F.href=S,F.download=`cc-lane-${c}-layer-${e}.json`,document.body.appendChild(F),F.click(),F.remove(),URL.revokeObjectURL(S)},Z=w=>{var S;const R=(S=w.target.files)==null?void 0:S[0];R&&(R.text().then(F=>{l.importLane(e,F)}),k.current&&(k.current.value=""))};return r.jsxs("div",{className:ye.panel,children:[r.jsxs("div",{className:ye.header,children:[r.jsx("h6",{className:ye.title,children:h("ccLane.title","CC Automation Lane")}),r.jsx(ie.NiceSelect,{size:"sm",controlWidth:180,"aria-label":h("ccLane.controller","Controller"),value:String(c),onChange:w=>u(Number(Tt(w))),options:ru.map(w=>({value:String(w.cc),label:h("ccLane.cc2","{label} (CC{cc})").replace("{label}",String(h(`ccLane.preset.${w.key}`,w.label))).replace("{cc}",String(w.cc))}))}),r.jsx(ie.NiceSegmentedControl,{size:"sm",value:g,onChange:y,options:au.map(w=>({value:w.mode,label:h(`ccLane.mode.${w.mode}`,w.label)}))}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",leftIcon:r.jsx(B.NtdUndo,{size:14}),ariaLabel:h("ccLane.undo","Undo"),title:h("ccLane.undo","Undo"),onClick:l.undo,disabled:!l.canUndo,children:null}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",leftIcon:r.jsx(B.NtdRedo,{size:14}),ariaLabel:h("ccLane.redo","Redo"),title:h("ccLane.redo","Redo"),onClick:l.redo,disabled:!l.canRedo,children:null})]}),r.jsxs("div",{className:ye.toolbar,children:[r.jsx(ie.NiceButton,{size:"sm",variant:v?"primary":"outline","aria-pressed":v,onClick:()=>C(!v),title:h("ccLane.lfoHint","Apply LFO modulation"),children:h("ccLane.lfo","LFO")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:G,title:h("ccLane.exportHint","Export CC lane as JSON"),children:h("ccLane.export","Export")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>{var w;return(w=k.current)==null?void 0:w.click()},title:h("ccLane.importHint","Import CC lane from JSON"),children:h("ccLane.import","Import")}),r.jsx("input",{ref:k,type:"file",accept:".json",hidden:!0,onChange:Z}),r.jsx(ie.NiceButton,{size:"sm",variant:"danger",onClick:()=>l.setEvents(e,T.filter(w=>w.cc!==c)),title:h("ccLane.clearHint","Clear all CC events for this lane"),children:h("ccLane.clear","Clear")}),r.jsxs("span",{className:`${ye.noteText} ${ye.pushRight}`,children:[E.length," ",h("ccLane.events","events")]})]}),v&&r.jsxs("div",{className:ye.subPanel,children:[r.jsxs("div",{className:`${ye.row} ${ye.alignStart} ${ye.field}`,children:[r.jsx(ie.NiceSelect,{size:"sm",controlWidth:130,label:h("ccLane.lfoWave","Wave"),value:N.waveform,onChange:w=>M(R=>({...R,waveform:Tt(w)})),options:su.map(w=>({value:w,label:w}))}),r.jsx(ie.NiceNumberInput,{size:"sm",className:ye.inputW120,label:h("ccLane.lfoRate","Rate (Hz)"),min:.01,max:20,step:.1,precision:2,value:N.rate,onChange:w=>{w!==null&&M(R=>({...R,rate:w}))}}),r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{size:"sm",label:h("ccLane.lfoDepth","Depth"),min:0,max:1,step:.01,value:N.depth,onChange:w=>M(R=>({...R,depth:w})),showValue:!0,formatValue:w=>w.toFixed(2)})}),r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{size:"sm",label:h("ccLane.lfoCenter","Center"),min:0,max:1,step:.01,value:N.center,onChange:w=>M(R=>({...R,center:w})),showValue:!0,formatValue:w=>w.toFixed(2)})})]}),r.jsxs("div",{className:ye.buttonRow,children:[r.jsx(ie.NiceButton,{size:"sm",variant:"primary",onClick:H,children:h("ccLane.applyLfo","Apply LFO")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>C(!1),children:h("ccLane.cancel","Cancel")})]})]}),r.jsx("div",{style:{overflowX:"auto",borderRadius:6},children:r.jsx("canvas",{ref:p,width:A,height:Yr+bn*2,style:{cursor:m?"crosshair":f?"pointer":"crosshair",display:"block",borderRadius:6},onMouseDown:K,onMouseMove:z,onMouseUp:V,onMouseLeave:()=>{m&&V()},onDoubleClick:W,role:"img","aria-label":h("ccLane.canvas","CC automation lane")})}),r.jsx("div",{className:ye.noteTextMargin,children:h("ccLane.hint","Click to draw. Double-click to add/remove points. Drag to draw curves.")})]})},ao={"1/1":4,"1/2":2,"1/4":1,"1/8":.5,"1/16":.25,"1/32":.125,"1/4T":1/1.5,"1/8T":.5/1.5,"1/16T":.25/1.5},ua={mode:"up",octaves:1,rate:"1/8",gate:.8,swing:0,repeats:1,latch:!1};function ou(e,t){const n=[];for(let a=0;a<t;a++)for(const s of e)n.push({...s,pitch:s.pitch+a*12});return n}function so(e,t){if(e.length===0)return[];const n=ou(e,t.octaves),a=[...n].sort((o,l)=>o.pitch-l.pitch),s=[...n].sort((o,l)=>l.pitch-o.pitch);let i;switch(t.mode){case"up":i=a;break;case"down":i=s;break;case"updown":i=[...a,...s.slice(1,-1)];break;case"downup":i=[...s,...a.slice(1,-1)];break;case"random":i=[...n].sort(()=>Math.random()-.5);break;case"as-played":i=[...n].sort((o,l)=>o.originalOrder-l.originalOrder);break;case"chord":i=n;break;default:i=a}if(t.repeats>1){const o=[];for(const l of i)for(let c=0;c<t.repeats;c++)o.push(l);i=o}return i}function lu(e,t,n,a=0,s=1){const i=so(e,t);if(i.length===0)return[];const o=60/n,l=ao[t.rate]*o,c=l*t.gate,u=[],h=t.mode==="chord",p=h?s:i.length*s;for(let g=0;g<p;g++){const y=g%2===1?l*t.swing*.5:0,m=a+g*l+y;if(h)for(const x of i){const b=t.velocityPattern?t.velocityPattern[g%t.velocityPattern.length]:x.velocity;u.push({pitch:x.pitch,velocity:b,startTime:m,duration:c,step:g})}else{const x=g%i.length,b=i[x],f=t.velocityPattern?t.velocityPattern[g%t.velocityPattern.length]:b.velocity;u.push({pitch:b.pitch,velocity:f,startTime:m,duration:c,step:g})}}return u}function io(){return[{mode:"up",label:"Up",description:"Notes played low to high"},{mode:"down",label:"Down",description:"Notes played high to low"},{mode:"updown",label:"Up/Down",description:"Alternates up then down"},{mode:"downup",label:"Down/Up",description:"Alternates down then up"},{mode:"random",label:"Random",description:"Random note order"},{mode:"as-played",label:"As Played",description:"Order in which notes were pressed"},{mode:"chord",label:"Chord",description:"All notes played simultaneously"}]}function oo(){return Object.keys(ao)}const ks=e=>`${Math.round(e*100)}%`,cu=({config:e=ua,onChange:t=()=>{},active:n=!1,onToggleActive:a=()=>{}})=>{const{t:s}=xe(),i=io(),o=oo(),l=c=>t({...e,...c});return r.jsxs("div",{className:`${ye.panel} ${n?"":ye.panelInactive}`,children:[r.jsxs("div",{className:ye.header,children:[r.jsx("h6",{className:ye.title,children:s("arp.title","Arpeggiator")}),r.jsx(ie.NiceButton,{size:"sm",variant:n?"success":"outline","aria-pressed":n,onClick:a,children:n?s("arp.on","ON"):s("arp.off","OFF")}),r.jsx(ie.NiceButton,{size:"sm",variant:e.latch?"warning":"outline","aria-pressed":!!e.latch,onClick:()=>l({latch:!e.latch}),title:s("arp.latchHint","Latch — keep arp running after releasing keys"),children:s("arp.latch","Latch")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>t(ua),title:s("arp.resetHint","Reset to defaults"),children:s("arp.reset","Reset")})]}),r.jsxs("div",{className:ye.grid2,children:[r.jsxs("div",{className:ye.full,children:[r.jsx("span",{className:ye.label,children:s("arp.mode","Mode")}),r.jsx(ie.NiceSegmentedControl,{size:"sm",block:!0,value:e.mode,onChange:c=>l({mode:c}),options:i.map(c=>({value:c.mode,label:r.jsx("span",{title:c.description,children:c.label})}))})]}),r.jsx(ie.NiceSelect,{size:"sm",label:s("arp.rate","Rate"),value:e.rate,onChange:c=>l({rate:Tt(c)}),options:o.map(c=>({value:c,label:c}))}),r.jsx(ie.NiceSlider,{size:"sm",label:s("arp.octaves","Octaves"),min:1,max:4,step:1,value:e.octaves,onChange:c=>l({octaves:c}),showValue:!0}),r.jsx(ie.NiceSlider,{size:"sm",label:s("arp.gate","Gate"),min:.05,max:1,step:.05,value:e.gate,onChange:c=>l({gate:c}),showValue:!0,formatValue:ks}),r.jsx(ie.NiceSlider,{size:"sm",label:s("arp.swing","Swing"),min:0,max:1,step:.01,value:e.swing,onChange:c=>l({swing:c}),showValue:!0,formatValue:ks}),r.jsx(ie.NiceSlider,{size:"sm",label:s("arp.repeats","Repeats"),min:1,max:4,step:1,value:e.repeats,onChange:c=>l({repeats:c}),showValue:!0})]})]})},ws=e=>`${Math.round(e*100)}%`,du=["sine","triangle","sawtooth","square","random","sample-hold"],uu=["1/1","1/2","1/4","1/8","1/16","1/32"],xn=200,en=48,hu=({config:e,onChange:t,index:n,onRemove:a})=>{const{t:s}=xe(),i=d.useRef(null),o=c=>t({...e,...c}),l=d.useCallback(()=>{const c=i.current;if(!c)return;const u=c.getContext("2d");if(!u)return;u.clearRect(0,0,xn,en),u.fillStyle=ve.resolveCssColor("var(--nice-bg-secondary, #161b22)",u.canvas),u.fillRect(0,0,xn,en),u.strokeStyle=ve.resolveCssColor("var(--nice-border-color, #cbd5e1)",u.canvas),u.lineWidth=1,u.setLineDash([3,3]),u.beginPath(),u.moveTo(0,en/2),u.lineTo(xn,en/2),u.stroke(),u.setLineDash([]);const h=ro(e,xn,en);if(h.length>0){u.beginPath(),u.strokeStyle=ve.resolveCssColor(e.enabled?"var(--nice-primary, #3b82f6)":"var(--nice-text-secondary, #484f58)",u.canvas),u.lineWidth=1.5;for(let p=0;p<h.length;p++){const g=h[p].x,y=h[p].y;p===0?u.moveTo(g,y):u.lineTo(g,y)}u.stroke()}},[e]);return d.useEffect(()=>{l()},[l]),r.jsxs("div",{className:`${ye.panel} ${ye.panelCompact} ${e.enabled?"":ye.panelInactive}`,children:[r.jsxs("div",{className:ye.header,children:[r.jsxs("h6",{className:ye.title,children:[s("lfo.title","LFO")," ",n!==void 0?`#${n+1}`:""]}),r.jsx(ie.NiceButton,{size:"xs",variant:e.enabled?"success":"outline","aria-pressed":e.enabled,onClick:()=>o({enabled:!e.enabled}),children:e.enabled?s("lfo.on","ON"):s("lfo.off","OFF")}),r.jsx(ie.NiceButton,{size:"xs",variant:"outline",onClick:()=>t(_r()),title:s("lfo.resetHint","Reset to defaults"),children:s("lfo.reset","Reset")}),a&&r.jsx("span",{className:ye.pushRight,children:r.jsx(ie.NiceButton,{size:"xs",variant:"ghost",onClick:a,"aria-label":s("lfo.remove","Remove LFO"),title:s("lfo.remove","Remove LFO"),children:r.jsx(B.NtdClose,{size:12})})})]}),r.jsxs("div",{className:`${ye.row} ${ye.alignStart}`,children:[r.jsx("canvas",{ref:i,width:xn,height:en,style:{borderRadius:4,border:"1px solid var(--nice-border-color, #30363d)",flexShrink:0},role:"img","aria-label":s("lfo.preview","LFO waveform preview")}),r.jsxs("div",{className:ye.grow,children:[r.jsx("div",{className:ye.field,children:r.jsx(ie.NiceSegmentedControl,{size:"xs",block:!0,value:e.waveform,onChange:c=>o({waveform:c}),options:du.map(c=>({value:c,label:r.jsx("span",{title:c,children:c==="sample-hold"?"S&H":c.slice(0,3)})}))})}),r.jsxs("div",{className:ye.grid2,children:[r.jsx(ie.NiceSlider,{size:"xs",label:s("lfo.rate","Rate"),min:.01,max:20,step:.1,value:e.rate,onChange:c=>o({rate:c}),showValue:!0,formatValue:c=>`${c.toFixed(1)} Hz`}),r.jsx(ie.NiceSlider,{size:"xs",label:s("lfo.depth","Depth"),min:0,max:1,step:.01,value:e.depth,onChange:c=>o({depth:c}),showValue:!0,formatValue:ws}),r.jsx(ie.NiceSlider,{size:"xs",label:s("lfo.center","Center"),min:0,max:1,step:.01,value:e.center,onChange:c=>o({center:c}),showValue:!0,formatValue:ws}),r.jsx(ie.NiceSlider,{size:"xs",label:s("lfo.phase","Phase"),min:0,max:360,step:1,value:e.phase,onChange:c=>o({phase:c}),showValue:!0,formatValue:c=>`${Math.round(c)}°`})]}),r.jsxs("div",{className:ye.row,children:[r.jsx(ie.NiceCheckbox,{size:"xs",label:s("lfo.bpmSync","BPM Sync"),checked:e.syncToBpm,onChange:c=>o({syncToBpm:c})}),e.syncToBpm&&r.jsx(ie.NiceSelect,{size:"xs","aria-label":s("lfo.syncDivision","Sync division"),value:e.syncDivision??"1/4",onChange:c=>o({syncDivision:Tt(c)}),options:uu.map(c=>({value:c,label:c}))}),r.jsx(ie.NiceNumberInput,{size:"xs",label:s("lfo.cc","CC"),min:0,max:127,value:e.targetCC??1,onChange:c=>o({targetCC:c??1})})]})]})]})]})},pu=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],fu=[16,32,64],mu=e=>`${Math.round(e*100)}%`;function Cs(e){const t=Math.floor(e/12)-1;return`${pu[e%12]}${t}`}const gu=({seq:e})=>{const{t}=xe(),n=e==null?void 0:e.pattern,a=d.useMemo(()=>n?n.steps.slice(0,n.length):[],[n]);if(!e||!n)return r.jsxs("div",{className:ye.panel,children:[r.jsx("h6",{className:ye.title,children:t("stepSeq.title","Step Sequencer")}),r.jsx("div",{className:ye.noteTextMargin,children:t("stepSeq.noSeq","Provide a `seq` prop (useStepSequencer) for live editing.")})]});const{currentStep:s,playing:i}=e,o=l=>c=>{var m;c.preventDefault();const u=c.currentTarget,h=u.getBoundingClientRect(),p=x=>e.setVelocity(l,Math.round(Math.max(1,Math.min(127,(1-(x-h.top)/h.height)*127)))),g=x=>p(x.clientY),y=()=>{u.removeEventListener("pointermove",g),u.removeEventListener("pointerup",y),u.removeEventListener("pointercancel",y)};(m=u.setPointerCapture)==null||m.call(u,c.pointerId),u.addEventListener("pointermove",g),u.addEventListener("pointerup",y),u.addEventListener("pointercancel",y),p(c.clientY)};return r.jsxs("div",{className:ye.panel,children:[r.jsxs("div",{className:ye.header,children:[r.jsx("h6",{className:ye.title,children:t("stepSeq.title","Step Sequencer")}),r.jsx(ie.NiceButton,{size:"sm",variant:i?"danger":"success",leftIcon:i?r.jsx(B.NtdStop,{size:12}):r.jsx(B.NtdPlay,{size:12}),onClick:e.togglePlayback,children:i?t("stepSeq.stop","Stop"):t("stepSeq.play","Play")})]}),r.jsxs("div",{className:`${ye.row} ${ye.alignStart} ${ye.field}`,children:[r.jsx(ie.NiceNumberInput,{size:"sm",className:ye.inputW120,label:t("stepSeq.bpm","BPM"),min:20,max:300,value:n.bpm,onChange:l=>{l!==null&&e.setBpm(l)}}),r.jsx("div",{className:ye.sliderW200,children:r.jsx(ie.NiceSlider,{size:"sm",label:t("stepSeq.swing","Swing"),min:0,max:1,step:.01,value:n.swing,onChange:e.setSwing,showValue:!0,formatValue:mu})}),r.jsxs("div",{children:[r.jsx("span",{className:ye.label,children:t("stepSeq.length","Steps")}),r.jsx(ie.NiceSegmentedControl,{size:"sm",value:n.length,onChange:e.setLength,options:fu.map(l=>({value:l,label:String(l)}))})]})]}),r.jsxs("div",{className:ye.toolbar,children:[r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>e.transpose(1),title:t("stepSeq.transposeUp","Transpose up one semitone"),children:"+1"}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>e.transpose(-1),title:t("stepSeq.transposeDown","Transpose down one semitone"),children:"-1"}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>e.transpose(12),title:t("stepSeq.octaveUpHint","Transpose up one octave"),children:t("stepSeq.octaveUp","+Oct")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>e.transpose(-12),title:t("stepSeq.octaveDownHint","Transpose down one octave"),children:t("stepSeq.octaveDown","-Oct")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:e.reverse,children:t("stepSeq.reverse","Reverse")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",rightIcon:r.jsx(B.NtdArrowRight,{size:12}),onClick:()=>e.shift(1),children:t("stepSeq.shift","Shift")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",leftIcon:r.jsx(B.NtdArrowLeft,{size:12}),onClick:()=>e.shift(-1),children:t("stepSeq.shift","Shift")}),r.jsx(ie.NiceButton,{size:"sm",variant:"outline",onClick:()=>e.randomizeVel(),title:t("stepSeq.randomVelocityHint","Randomize velocities"),children:t("stepSeq.randomVelocity","Rnd Vel")}),r.jsx(ie.NiceButton,{size:"sm",variant:"danger",onClick:e.clear,children:t("stepSeq.clear","Clear")})]}),r.jsx("div",{style:{overflowX:"auto"},children:r.jsx("div",{style:{display:"flex",gap:2,minWidth:n.length*36},children:a.map((l,c)=>{const u=l.active,h=s===c,p=c%4===0;return r.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",gap:2,minWidth:34},children:[r.jsx("span",{style:{fontSize:9,color:p?"var(--nice-text-muted, #8b949e)":"var(--nice-text-secondary, #30363d)"},children:c+1}),r.jsx("button",{type:"button","aria-pressed":u,"aria-label":`${t("stepSeq.step","Step")} ${c+1}${u?`, ${Cs(l.note)}`:""}`,onClick:()=>e.toggle(c),style:{width:32,height:32,borderRadius:4,border:h?"2px solid var(--nice-warning, #f0c040)":"1px solid var(--nice-border, #30363d)",background:u?`hsl(${210+l.velocity/127*40}, 80%, ${35+l.velocity/127*20}%)`:p?"var(--nice-bg-secondary, #21262d)":"var(--nice-bg-secondary, #161b22)",cursor:"pointer",padding:0,color:u?"var(--nice-color-white, #ffffff)":"var(--nice-text-secondary, #484f58)",fontSize:8,fontWeight:600,transition:"background 0.1s"},children:u?Cs(l.note):""}),r.jsx("div",{style:{width:32,height:20,background:"var(--nice-bg-secondary, #161b22)",borderRadius:2,position:"relative",overflow:"hidden",cursor:"ns-resize",touchAction:"none"},title:`${t("stepSeq.velocity","Velocity")}: ${l.velocity}`,onPointerDown:o(c),children:r.jsx("div",{style:{position:"absolute",bottom:0,left:0,width:"100%",height:`${l.velocity/127*100}%`,background:u?"var(--nice-primary-tint-60, rgba(59, 130, 246, 0.6))":"var(--nice-primary-tint-15, rgba(59, 130, 246, 0.15))",borderRadius:2,pointerEvents:"none"}})}),u&&l.probability<1&&r.jsxs("span",{style:{fontSize:8,color:"var(--nice-warning, #f0c040)"},children:[Math.round(l.probability*100),"%"]})]},c)})})}),r.jsx("div",{style:{fontSize:11,color:"var(--nice-text-muted, #8b949e)",marginTop:6},children:t("stepSeq.hint","Click steps to toggle. Drag velocity bars vertically.")})]})};function yu(e,t,n){const{t:a}=xe(),[s,i]=d.useState("interval"),[o,l]=d.useState(30),c=d.useRef(null),u=d.useCallback(()=>{if(e)try{localStorage.setItem("audioEditor.autoSave",JSON.stringify(e)),t(a("useAutoSave.projectAutoSavedLocally","Project auto-saved locally")),n("success"),setTimeout(()=>t(""),2e3)}catch(h){t(a("useAutoSave.autoSaveError","Auto-save error:")+" "+h.message),n("error")}},[e,t,n,a]);return d.useEffect(()=>{(s==="onChange"||s==="both")&&u()},[e,s,u]),d.useEffect(()=>(c.current&&(clearInterval(c.current),c.current=null),(s==="interval"||s==="both")&&o>0&&(c.current=window.setInterval(u,o*1e3)),()=>{c.current&&(clearInterval(c.current),c.current=null)}),[s,o,u]),{autoSaveMode:s,setAutoSaveMode:i,autoSaveInterval:o,setAutoSaveInterval:l}}function vu(e,t,n){const a=d.useRef(null),[s,i]=d.useState(!1),[o,l]=d.useState(0),[c,u]=d.useState(10),[h,p]=d.useState(!1),[g,y]=d.useState(120),m=d.useCallback((k,T)=>`L${k}-C${T}`,[]),x=d.useCallback((k,T)=>{if(!a.current||!T.audioBuffer)return;const E=m(k,T.id),A=e[k];a.current.addClip({id:E,buffer:T.audioBuffer,startTime:T.start,offset:0,duration:T.duration,layerId:k,volume:(A==null?void 0:A.volume)??1,pan:(A==null?void 0:A.pan)??0,stretchFactor:T.stretchFactor||1,effectChain:(A==null?void 0:A.effectChain)||[]})},[e,m]),b=d.useCallback((k,T)=>{var E;(E=a.current)==null||E.removeClip(m(k,T))},[m]);d.useEffect(()=>{Object.entries(t).forEach(([k,T])=>{const E=Number(k);T==null||T.forEach(A=>x(E,A))})},[t,e,x]),d.useEffect(()=>{a.current&&Object.entries(n).forEach(([k,T])=>{const E=Number(k);a.current.setMidiCCEvents(E,T)})},[n]);const f=d.useCallback(()=>{a.current&&(s?a.current.pause():a.current.play())},[s]),j=d.useCallback(()=>{var k;(k=a.current)==null||k.stop()},[]),v=d.useCallback(k=>{var T;(T=a.current)==null||T.seek(k)},[]),C=d.useCallback(()=>{if(!a.current)return;const k=!h;p(k),a.current.setLoopRegion(0,c,k)},[h,c]),N=d.useCallback(k=>{var E;const T=Math.max(1,c+k);u(T),(E=a.current)==null||E.setLoopRegion(0,T,h)},[c,h]),M=d.useCallback(async(k,T=1024)=>{const E=await k.arrayBuffer(),A=new(window.AudioContext||window.webkitAudioContext),I=await A.decodeAudioData(E.slice(0)),L=I.getChannelData(0),P=L.length,_=Math.max(1,Math.floor(P/T)),ee=[];for(let K=0;K<T;K++){const z=K*_;if(z>=P)break;ee.push(L[z])}return A.close(),{waveform:ee.map(K=>Math.max(-1,Math.min(1,K))),duration:I.duration,buffer:I}},[]);return{engineRef:a,isPlaying:s,setIsPlaying:i,currentTime:o,setCurrentTime:l,duration:c,setDuration:u,isLooping:h,setIsLooping:p,bpm:g,setBpm:y,handlePlayPause:f,handleStop:j,handleSeek:v,handleToggleLoop:C,handleAdjustDuration:N,upsertEngineClip:x,removeEngineClip:b,makeEngineClipId:m,blobToWaveform:M}}class La{constructor(){this.stream=null,this.mediaRecorder=null,this.audioChunks=[],this.isRecording=!1,this.audioContext=null,this.analyser=null,this.gainNode=null,this.monitorGain=null,this.levelRaf=null}async startRecording(t={}){if(this.isRecording)return;this.levelCallback=t.onLevel,this.stream=await navigator.mediaDevices.getUserMedia({audio:{deviceId:t.deviceId||void 0,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}});const n=t.mimeType||"audio/webm";this.mediaRecorder=new MediaRecorder(this.stream,{mimeType:n}),this.audioChunks=[],this.audioContext=new(window.AudioContext||window.webkitAudioContext);let s=this.audioContext.createMediaStreamSource(this.stream);t.gain!==void 0&&t.gain>0&&(this.gainNode=this.audioContext.createGain(),this.gainNode.gain.value=t.gain,s.connect(this.gainNode),s=this.gainNode),this.analyser=this.audioContext.createAnalyser(),this.analyser.fftSize=2048,s.connect(this.analyser),t.monitorEnabled&&(this.monitorGain=this.audioContext.createGain(),this.monitorGain.gain.value=(t.monitorVolume??100)/100,s.connect(this.monitorGain),this.monitorGain.connect(this.audioContext.destination));const i=()=>{if(!this.analyser)return;const o=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(o);let l=0;for(let u=0;u<o.length;u++){const h=(o[u]-128)/128;l+=h*h}const c=Math.sqrt(l/o.length);this.levelCallback&&this.levelCallback(c),this.isRecording&&(this.levelRaf=requestAnimationFrame(i))};this.mediaRecorder.ondataavailable=o=>{o.data&&o.data.size>0&&this.audioChunks.push(o.data)},this.mediaRecorder.start(),this.isRecording=!0,this.levelRaf=requestAnimationFrame(i)}getStream(){return this.stream}async stopRecording(){return!this.isRecording||!this.mediaRecorder?null:new Promise(t=>{const n=this.mediaRecorder;n.onstop=()=>{const a=new Blob(this.audioChunks,{type:n.mimeType});this.cleanup(),t(a)},n.stop(),this.isRecording=!1})}cleanup(){this.levelRaf&&(cancelAnimationFrame(this.levelRaf),this.levelRaf=null),this.levelCallback=void 0,this.monitorGain&&(this.monitorGain.disconnect(),this.monitorGain=null),this.gainNode&&(this.gainNode.disconnect(),this.gainNode=null),this.analyser&&(this.analyser.disconnect(),this.analyser=null),this.audioContext&&(this.audioContext.close(),this.audioContext=null),this.stream&&(this.stream.getTracks().forEach(t=>t.stop()),this.stream=null),this.mediaRecorder=null,this.audioChunks=[]}}function bu(e){const{t}=xe(),[n,a]=d.useState(!1),[s,i]=d.useState(!1),[o,l]=d.useState(0),[c,u]=d.useState(0),[h,p]=d.useState(null),g=d.useRef(null),y=d.useRef(null),m=d.useRef(0),x=d.useRef(null),b=d.useRef(null),f=d.useCallback(()=>{x.current&&(clearInterval(x.current),x.current=null),b.current&&(clearTimeout(b.current),b.current=null)},[]),j=d.useCallback(async()=>{if(!e.activeLayer){e.showToast("Select a layer to record.","error");return}n||(g.current||(g.current=new La),m.current=y.current??e.currentTime,a(!0),l(0),await g.current.startRecording({onLevel:l}))},[e,n]),v=d.useCallback(async()=>{var P;if(f(),i(!1),u(0),y.current=null,!g.current){a(!1),l(0);return}const M=await g.current.stopRecording();if(a(!1),l(0),!M||!e.activeLayer)return;const{waveform:k,duration:T,buffer:E}=await e.blobToWaveform(M),A=e.activeLayer.id;e.setWaveforms(_=>({..._,[A]:k}));const I=Math.max(0,m.current||0),L={id:Date.now(),label:t("useRecording.recording","Recording"),start:I,duration:T,fadeIn:0,fadeOut:0,reverse:!1,stretchFactor:1,color:(P=e.layerSettings[A])==null?void 0:P.color,blob:M,blobUrl:URL.createObjectURL(M),audioBuffer:E};e.setLayerClips(_=>({..._,[A]:[..._[A]||[],L]})),e.upsertEngineClip(A,L),e.setSelectedClip({layerId:A,clipId:L.id})},[e,f,t]),C=d.useCallback(M=>{if(M<=0){j();return}i(!0),u(M);const k=performance.now();x.current=window.setInterval(()=>{const T=(performance.now()-k)/1e3;u(Math.max(0,M-T))},100),b.current=window.setTimeout(()=>{f(),i(!1),u(0),y.current||j()},M*1e3)},[j,f]),N=d.useCallback(async()=>{if(n||s){await v();return}if(!e.activeLayer){e.showToast("Select a layer before recording","error");return}const M=Math.max(0,e.countInBars)*4*(60/e.bpm),k=e.punchIn!=null&&e.punchIn>e.currentTime?e.punchIn:null;k&&(y.current=k),e.overdubEnabled&&!e.isPlaying&&e.playEngine(),k?M>0&&C(M):C(M)},[n,s,e,v,C]);return{isRecording:n,isCountIn:s,monitorLevel:o,countInRemaining:c,punchOut:h,setPunchOut:p,armedPunchInRef:y,recorderRef:g,clearCountInTimers:f,startRecordingNow:j,stopRecordingFlow:v,handleRecord:N}}var lo=(e=>(e.Recorder="Recorder",e.AudioClip="Audio Clip",e.SpeechSynth="Speech Synth",e.Stream="Stream",e.KeyboardPad="Keyboard/Pads",e.Keyboard="Keyboard",e.AudioClipCompact="AudioClip",e))(lo||{});const xu={};class Xn{constructor(t,n,a,s={}){this.type=t,this.name=n,this.component=xu[t]??(()=>null),this.audioType=a,this.parameters=s}}new Xn("Recorder","Recorder","vocal",{deviceId:"",gain:1,sensitivity:"high"}),new Xn("Audio Clip","Audio Clip","instrumental",{clipId:null,octave:"4"}),new Xn("Speech Synth","Speech Synth","vocal",{text:"",voice:"default"}),new Xn("Keyboard/Pads","Keyboard","instrumental",{instrument:"piano",preset:"default",velocity:100});function co(e,t,n,a,s){n(i=>t?[...i,t]:i),a([]),s(e)}function Su(e,t,n,a){t(s=>{if(s.length===0)return s;const i=s[s.length-1];return n(o=>e?[e,...o]:o),a(i),s.slice(0,-1)})}function ku(e,t,n,a){n(s=>{if(s.length===0)return s;const i=s[0];return t(o=>e?[...o,e]:o),a(i),s.slice(1)})}class wu{constructor(t={}){this.undoStack=[],this.redoStack=[],this.maxSize=t.maxSize??100,this.onChange=t.onChange}push(t,n,a,s){this.undoStack.push({label:t,category:n,timestamp:Date.now(),oldState:a,newState:s}),this.undoStack.length>this.maxSize&&this.undoStack.shift(),this.redoStack.length=0}undo(){var n;const t=this.undoStack.pop();return t?(this.redoStack.push(t),(n=this.onChange)==null||n.call(this,t,"undo"),t.oldState):null}redo(){var n;const t=this.redoStack.pop();return t?(this.undoStack.push(t),(n=this.onChange)==null||n.call(this,t,"redo"),t.newState):null}get canUndo(){return this.undoStack.length>0}get canRedo(){return this.redoStack.length>0}get undoLabel(){return this.undoStack.length>0?this.undoStack[this.undoStack.length-1].label:null}get redoLabel(){return this.redoStack.length>0?this.redoStack[this.redoStack.length-1].label:null}get undoCount(){return this.undoStack.length}get redoCount(){return this.redoStack.length}getHistory(){return[...this.undoStack].reverse()}clear(){this.undoStack.length=0,this.redoStack.length=0}undoTo(t){const n=Math.min(t+1,this.undoStack.length);let a=null;for(let s=0;s<n;s++)a=this.undo();return a}}const Cu=st.scoped("useProjectCRUD");function ju(e){const{t}=xe(),{project:n,activeSection:a,setProject:s,setActiveSection:i,setLayers:o,setActiveLayer:l,setUndoStack:c,setRedoStack:u,addSection:h,addLayer:p}=e,g=d.useCallback(v=>co(v,n,c,u,s),[n,c,u,s]),y=d.useCallback(async()=>{var k;if(!n)return;const v=(((k=n.sections)==null?void 0:k.length)??0)+1,C=t("useProjectCRUD.section","Section"),M={id:await h(n.id,C,v),projectId:n.id,name:C,orderNumber:v,layers:[]};g({...n,sections:[...n.sections||[],M]}),i(M)},[n,g,i,h,t]),m=d.useCallback(async v=>{var M,k,T;if(!n||!await e.confirm(t("useProjectCRUD.deleteSectionConfirm","Delete this section?")))return;await e.deleteSection(v);const N=(n.sections??[]).filter(E=>E.id!==v);g({...n,sections:N}),i(N[0]??null),o(((M=N[0])==null?void 0:M.layers)??[]),l(((T=(k=N[0])==null?void 0:k.layers)==null?void 0:T[0])??null)},[n,g,i,o,l,e,t]),x=d.useCallback(async()=>{var C;if(!a)return;const v={id:-Date.now(),name:t("useProjectCRUD.newLayer","New Layer"),sectionId:a.id,audioSource:lo.AudioClip,audioSourceParameters:JSON.stringify({clipId:null}),items:[]};o(N=>[...N,v]),l(v);try{const N=await p(a.id,v.name,v.audioSource,v.audioSourceParameters);o(M=>M.map(k=>k.id===v.id?{...v,id:N}:k)),n&&g({...n,sections:((C=n.sections)==null?void 0:C.map(M=>M.id===a.id?{...M,layers:[...(M.layers??[]).filter(k=>k.id!==N),{...v,id:N}]}:M))??[]})}catch(N){o(M=>M.filter(k=>k.id!==v.id)),Cu.error("Failed to add layer:",N)}},[a,n,g,o,l,p,t]),b=d.useCallback(async v=>{var N,M;if((N=e.layerSettings[v])!=null&&N.locked){e.showToast(t("useProjectCRUD.layerLocked","Layer is locked. Unlock to delete."),"error");return}await e.confirm(t("useProjectCRUD.deleteLayerConfirm","Delete this layer?"))&&((e.layerClips[v]||[]).forEach(k=>e.removeEngineClip(v,k.id)),e.setLayerMidiNotes(k=>{const T={...k};return delete T[v],T}),await e.deleteLayer(v),o(k=>k.filter(T=>T.id!==v)),l(k=>(k==null?void 0:k.id)===v?null:k),n&&g({...n,sections:((M=n.sections)==null?void 0:M.map(k=>k.id===(a==null?void 0:a.id)?{...k,layers:(k.layers??[]).filter(T=>T.id!==v)}:k))??[]}))},[n,a,g,o,l,e,t]),f=d.useCallback(async()=>{if(!n)return;const v=e.projectVolume===""?void 0:Number(e.projectVolume);if(Number.isNaN(v)){e.setStatusType("error"),e.setStatusMessage(t("useProjectCRUD.volumeNotNumber","Volume must be a number"));return}if(!e.projectName.trim()){e.setStatusType("error"),e.setStatusMessage(t("useProjectCRUD.projectNameEmpty","Project name cannot be empty"));return}await e.updateProject(n.id,{name:e.projectName||n.name,isTemplate:e.projectIsTemplate,volume:v}),g({...n,name:e.projectName||n.name,isTemplate:e.projectIsTemplate,volume:v}),e.setStatusType("success"),e.setStatusMessage(t("useProjectCRUD.projectSaved","Project saved"))},[n,e,g,t]),j=d.useCallback(async()=>{var N;if(!a)return;const v=e.sectionName||a.name,C=e.sectionOrder===""?a.orderNumber:Number(e.sectionOrder);if(!v.trim()){e.setStatusType("error"),e.setStatusMessage(t("useProjectCRUD.sectionNameEmpty","Section name cannot be empty"));return}if(Number.isNaN(C)){e.setStatusType("error"),e.setStatusMessage(t("useProjectCRUD.orderNotNumber","Order must be a number"));return}await e.updateSection(a.id,{name:v,orderNumber:C}),i({...a,name:v,orderNumber:C}),n&&g({...n,sections:((N=n.sections)==null?void 0:N.map(M=>M.id===a.id?{...M,name:v,orderNumber:C}:M))??[]}),e.setStatusType("success"),e.setStatusMessage(t("useProjectCRUD.sectionSaved","Section saved"))},[a,n,e,g,i,t]);return{handleAddSection:y,handleDeleteSection:m,handleAddLayer:x,handleDeleteLayer:b,handleSaveProject:f,handleSaveSection:j}}const uo=d.createContext(null);function Mu(){const e=d.useContext(uo);if(!e)throw new Error("useEditorTrack must be used within <EditorTrackProvider>");return e}const _a=({value:e,children:t})=>r.jsx(uo.Provider,{value:e,children:t});process.env.NODE_ENV!=="production"&&(_a.displayName="EditorTrackProvider");const un=(e,t)=>t&&t>0?e*15/t:e/10,Da=e=>{for(const t of e){const n=t.trim();if(n.toUpperCase().startsWith("#BPM:")){const a=parseFloat(n.substring(5).replace(",","."));if(isFinite(a)&&a>0)return a}}return null},Ru=(e,t)=>{const n=t??Da(e),a=[];let s="",i=0,o="",l=!0;function c(){o.trim()!==""&&(s.length>0&&(s+=" "),s+=o.trim()),o=""}return e.forEach(u=>{if(!(u.startsWith("#")||u.startsWith("E"))){if(u.startsWith("-"))c(),s.trim().length>0&&(a.push({text:s.trim(),timestamp:i}),s=""),l=!0;else if(u.startsWith(":")||u.startsWith("*")){const h=u.indexOf(" "),p=u.indexOf(" ",h+1),g=u.indexOf(" ",p+1),y=u.indexOf(" ",g+1);if(y===-1)return;const m=un(parseFloat(u.substring(h+1,p)),n);s===""&&(i=m);const x=u.substring(y+1);if(x.trim()==="~")return;let b=x;b.startsWith("~")&&(b=b.substring(1)),l?(c(),o=b.trimEnd()):o+=b.trimEnd(),l=x.endsWith(" ")}}}),c(),s.trim().length>0&&a.push({text:s.trim(),timestamp:i}),a},Nu=(e,t)=>{const n=t??Da(e),a=[];let s=[],i="",o=0,l=!0,c=null,u="";function h(){c&&u.trim()!==""&&(c.text=u.trim(),s.push({...c}),i.length>0&&(i+=" "),i+=c.text),c=null,u=""}return e.forEach(p=>{if(!(p.startsWith("#")||p.startsWith("E"))){if(p.startsWith("-"))h(),i.trim().length>0&&(a.push({text:i.trim(),timestamp:o,words:s}),i="",s=[]),l=!0;else if(p.startsWith(":")||p.startsWith("*")){const g=p.startsWith("*"),y=p.indexOf(" "),m=p.indexOf(" ",y+1),x=p.indexOf(" ",m+1),b=p.indexOf(" ",x+1);if(b===-1)return;const f=un(parseFloat(p.substring(y+1,m)),n),j=un(parseFloat(p.substring(m+1,x)),n),v=f+j;i===""&&(o=f);const C=p.substring(b+1);if(C.trim()==="~"){c&&(c.endTime=v);return}let N=C;N.startsWith("~")&&(N=N.substring(1)),l?(h(),u=N.trimEnd(),c={text:"",startTime:f,endTime:v,isGolden:g}):c?(u+=N.trimEnd(),c.endTime=v,g&&(c.isGolden=!0)):(u=N.trimEnd(),c={text:"",startTime:f,endTime:v,isGolden:g}),l=C.endsWith(" ")}}}),h(),i.trim().length>0&&a.push({text:i.trim(),timestamp:o,words:s}),a},ho=(e,t)=>{const n=t??Da(e),a=[];let s=[],i=0;function o(){s.length>0&&(a.push({timestamp:i,syllables:[...s]}),s=[])}return e.forEach(l=>{if(!(l.startsWith("#")||l.startsWith("E"))){if(l.startsWith("-")){o();const c=l.trim().split(/\s+/);if(c.length>=2){const u=parseFloat(c[1]);isFinite(u)&&(i=un(u,n))}}else if(l.startsWith(":")||l.startsWith("*")){const c=l.startsWith("*"),u=l.indexOf(" "),h=l.indexOf(" ",u+1),p=l.indexOf(" ",h+1),g=l.indexOf(" ",p+1);if(g===-1)return;const y=parseFloat(l.substring(u+1,h)),m=parseFloat(l.substring(h+1,p)),x=un(y,n),b=x+un(m,n);s.length===0&&(i=x);const f=l.substring(g+1);if(f.trim()==="~"){s.length>0&&(s[s.length-1].endTime=b);return}let j=f;j.startsWith("~")&&(j=j.substring(1));const v=f.endsWith(" "),C=v?j.slice(0,-1):j;s.push({text:C,startTime:x,endTime:b,isGolden:c,hasTrailingSpace:v})}}}),o(),a},Tu=(e,t,n=3)=>{const a=[];let s=-1;for(let i=0;i<e.length;i++){const o=e[i].timestamp,l=e[i+1]?e[i+1].timestamp:o+5;if(t>=o&&t<l){s=i;break}}if(s>=0){const i=Math.max(0,s-(n-1));for(let o=i;o<=s;o++)a.push(e[o].text)}return a},Pu=(e,t)=>{const n=[];for(const a of e)for(const s of a.words)t>=s.startTime&&t<=s.endTime&&n.push(s);return n},js="var(--karaoke-sung-gradient, linear-gradient(90deg, #00e5ff 0%, #ffe600 60%, #ffab00 100%))",Ms="var(--karaoke-gold-glow-first, 0 0 12px #FFD700)",Eu="var(--karaoke-active-glow, 0 0 10px rgba(0,229,255,0.6), 0 0 4px rgba(255,230,0,0.4))",$u="var(--karaoke-active-drop-first, 0 0 6px rgba(0,229,255,0.5))",Au=({song:e,currentTime:t=0})=>{const{t:n}=xe(),a=d.useMemo(()=>!e||!e.notes.length?[]:ho(e.notes.map(c=>c.noteLine),e.bpm??void 0),[e]),s=t-((e==null?void 0:e.gap)??0)/1e3;let i=-1;for(let c=0;c<a.length;c++){const u=a[c].timestamp,h=c+1<a.length?a[c+1].timestamp:u+30;if(s>=u&&s<h){i=c;break}}const o=i>=0?a[i]:null,l=i>=0&&i+1<a.length?a[i+1]:null;return r.jsx("div",{className:"karaoke-lyrics",style:{textAlign:"center",fontSize:"28px",marginTop:"20px",minHeight:"80px",textShadow:"var(--karaoke-outline, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000)",fontWeight:700,fontStyle:"italic",fontFamily:"var(--karaoke-font-family, Arial)"},children:o?r.jsxs(r.Fragment,{children:[r.jsx("p",{style:{color:"var(--karaoke-primary-text, #fff)",margin:"5px 0",lineHeight:1.4,textShadow:Eu,background:"var(--karaoke-active-bg, linear-gradient(90deg, transparent 0%, rgba(0,229,255,0.08) 20%, rgba(255,230,0,0.06) 80%, transparent 100%))",borderRadius:8,padding:"2px 10px",transition:"text-shadow 0.3s ease, background 0.3s ease"},children:o.syllables.map((c,u)=>{let h=0;s>=c.endTime?h=1:s>c.startTime&&(h=(s-c.startTime)/(c.endTime-c.startTime));const p=Math.round(h*100),g=c.text+(c.hasTrailingSpace?" ":""),y=h>0&&h<1,m=c.isGolden;return h<=0?r.jsx("span",{style:{color:"var(--karaoke-syllable-dim, rgba(255,255,255,0.85))",transition:"color 0.15s ease"},children:g},u):h>=1?r.jsx("span",{style:{background:m?"var(--karaoke-gold-gradient, linear-gradient(90deg, #FFD700, #FFA000, #FFD700))":js,WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent",backgroundClip:"text",filter:m?`drop-shadow(${Ms})`:"none",transition:"filter 0.2s ease"},children:g},u):r.jsxs("span",{style:{position:"relative",display:"inline",filter:y?m?`drop-shadow(${Ms})`:`drop-shadow(${$u})`:"none",transition:"filter 0.15s ease"},children:[r.jsx("span",{style:{color:"var(--karaoke-syllable-dim, rgba(255,255,255,0.85))",visibility:"visible"},children:g}),r.jsx("span",{style:{position:"absolute",left:0,top:0,background:m?"var(--karaoke-gold-gradient, linear-gradient(90deg, #FFD700, #FFA000, #FFD700))":js,WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent",backgroundClip:"text",clipPath:`inset(0 ${100-p}% 0 0)`,pointerEvents:"none"},children:g})]},u)})}),l&&r.jsx("p",{style:{color:"var(--karaoke-next-text, #666)",margin:"5px 0",lineHeight:1.4,fontSize:"22px",transition:"opacity 0.3s ease"},children:l.syllables.map((c,u)=>r.jsx("span",{style:{color:c.isGolden?"var(--karaoke-golden-next, rgba(255,215,0,0.5))":"var(--karaoke-next-dim, #777)"},children:c.text+(c.hasTrailingSpace?" ":"")},u))})]}):a.length>0?r.jsx("p",{style:{color:"var(--karaoke-waiting-text, #999)"},children:r.jsx(B.NtdMusic,{size:20})}):r.jsxs("p",{style:{color:"var(--karaoke-waiting-text, #999)",display:"inline-flex",alignItems:"center",gap:6},children:[r.jsx(B.NtdMicrophone,{size:18})," ",n("karaokeLyrics.waitingForLyrics","Waiting for lyrics...")]})})},po=d.memo(Au),Zr={},Iu=typeof{url:typeof document>"u"?require("url").pathToFileURL(__filename).href:vt&&vt.tagName.toUpperCase()==="SCRIPT"&&vt.src||new URL("index.cjs",document.baseURI).href}<"u"&&(Zr==null?void 0:Zr.VITE_DEBUG_KARAOKE)==="true";function ha(e,t,...n){(Iu||typeof window<"u"&&window.DEBUG_KARAOKE)&&console.log(`%c[KARAOKE-DEBUG]%c [${e}] ${t}`,"background:var(--nice-color-accent-hover, #6c3483);color:var(--nice-text-on-primary, #FFF);padding: var(--nice-space-px, 1px) var(--nice-space-1, 4px);border-radius:var(--nice-radius-sm, 3px);font-weight:bold","color:var(--nice-color-accent-hover, #6c3483);font-weight:bold",...n)}const fo=e=>{for(const t of e){const n=t.trim();if(n.toUpperCase().startsWith("#BPM:")){const a=parseFloat(n.substring(5).replace(",","."));if(isFinite(a)&&a>0)return a}}return null},Rs=(e,t)=>t&&t>0?e*15/t:e/10,Hn=(e,t)=>{const n=t??fo(e),a=[];let s=[];return e.forEach(i=>{const o=i.split(" ");if(!(o.length<4))if(i.startsWith("-"))s.length>0&&(a.push(s),s=[]);else{const l=(o[0]||"").charAt(0),c=l==="*"||l==="G";s.push({startTime:Rs(parseFloat(o[1]),n),duration:Rs(parseFloat(o[2]),n),pitch:parseInt(o[3],10),isGold:c})}}),s.length>0&&a.push(s),a},mo=(e,t)=>{let a=(Math.round(12*Math.log2(e/440)+69)%12+12)%12;if(t!==null){for(;a-t>6;)a-=12;for(;a-t<-6;)a+=12}return a},go=st.scoped("karaokeScoringConfig"),za={easy:{semitoneTolerance:2,preWindow:.25,postExtra:.3,difficultyMult:.9},normal:{semitoneTolerance:1,preWindow:.15,postExtra:.2,difficultyMult:1},hard:{semitoneTolerance:0,preWindow:.08,postExtra:.12,difficultyMult:1.05}},Lu="karaoke.scoringPresets";function _u(){try{const e=localStorage.getItem(Lu);return e?JSON.parse(e):null}catch(e){return go.warn("Failed to parse scoring presets overrides",e),null}}function yo(e){const t={...za},n=_u();return n&&Object.keys(n).forEach(a=>{const s=n[a];s&&(t[a]={...t[a],...s})}),e&&Object.keys(e).forEach(a=>{const s=e[a];s&&(t[a]={...t[a],...s})}),t}exports.ScoringPresets=yo();const Du=async e=>{try{let t=null;if(e?t=await e.getKaraokeScoringConfig():(go.debug("No fetcher provided, using defaults"),t=null),t&&t.presets)return exports.ScoringPresets=yo(t.presets),exports.ScoringPresets}catch{}return exports.ScoringPresets},Dr=(e="normal")=>exports.ScoringPresets[e]||za.normal,zu=3,te=zu;function qt(e){const t=e/2|0;return{w:t,out:`M${t} 0H${t}V${e}H${t}A${t} ${t} 0 0 1 0 ${t}A${t} ${t} 0 0 1 ${t} 0Z`,inn:`M${t} ${te}V${e-te}A${t-te} ${t-te} 0 0 1 ${te} ${t}A${t-te} ${t-te} 0 0 1 ${t} ${te}Z`}}function hn(e){return{w:te+1,out:`M0 0H${te+1}V${e}H0Z`,inn:`M${te} ${te}H${te+1}V${e-te}H${te}Z`}}function Fa(e){const t=Math.min(14,e*.22)|0,n=t+2,a=Math.max(t-te,1);return{w:n,out:`M${t} 0H${n}V${e}H${t}Q0 ${e} 0 ${e-t}V${t}Q0 0 ${t} 0Z`,inn:`M${te+a} ${te}H${n}V${e-te}H${te+a}Q${te} ${e-te} ${te} ${e-te-a}V${te+a}Q${te} ${te} ${te+a} ${te}Z`}}function Mr(e){const t=e*.3|0,n=t+2,a=Math.max(t-te,1);return{w:n,out:`M${t} 0H${n}V${e}H${t}L0 ${e-t}V${t}Z`,inn:`M${te+a} ${te}H${n}V${e-te}H${te+a}L${te} ${e-te-a}V${te+a}Z`}}function Ot(e){const t=e*.42|0,n=t+2,a=Math.max(t-(te*1.4|0),2);return{w:n,out:`M${t} 0H${n}V${e}H${t}L0 ${e/2}Z`,inn:`M${te+a} ${te}H${n}V${e-te}H${te+a}L${te} ${e/2}Z`}}function Rr(e){const t=e*.3|0,n=t+4,a=Math.max(t-te,1);return{w:n,out:`M${t} 0H${n}V${e}H${t*.6|0}L0 ${e-t}V${t}Q0 0 ${t} 0Z`,inn:`M${te+a} ${te}H${n}V${e-te}H${te+(a*.6|0)}L${te} ${e-te-a}V${te+a}Q${te} ${te} ${te+a} ${te}Z`}}function Oa(e){const t=e*.16|0,n=t*2+4;return{w:n,out:`M${t*1.5|0} 0H${n}V${e}H${t*1.5|0}C${t*2.5|0} ${e*.35|0} ${t*2.5|0} ${e*.65|0} ${t*1.5|0} ${e}Z`,inn:`M${te+(t*1.2|0)} ${te}H${n}V${e-te}H${te+(t*1.2|0)}C${te+(t*2.2|0)} ${e*.37|0} ${te+(t*2.2|0)} ${e*.63|0} ${te+(t*1.2|0)} ${e-te}Z`}}function Ba(e){const t=e*.32|0,n=t+3,a=Math.max(t-te,1);return{w:n,out:`M0 0H${n}V${e}H${t}Q0 ${e} 0 ${e-t}Z`,inn:`M${te} ${te}H${n}V${e-te}H${te+a}Q${te} ${e-te} ${te} ${e-te-a}Z`}}function Nr(e){const t=e*.14|0,n=t*3+2;return{w:n,out:`M${t*2} 0H${n}V${e}H${t*2}C${t*.5|0} ${e*.8|0} ${t*3} ${e*.55|0} ${t*.5|0} ${e*.35|0}S${t} 0 ${t*2} 0Z`,inn:`M${te+(t*1.8|0)} ${te}H${n}V${e-te}H${te+(t*1.8|0)}C${te+(t*.4|0)} ${e*.78|0} ${te+(t*2.8|0)} ${e*.55|0} ${te+(t*.4|0)} ${e*.37|0}S${te+(t*.9|0)} ${te} ${te+(t*1.8|0)} ${te}Z`}}function Ga(e){const t=e*.09|0,n=e*.35|0;return{w:n,out:`M${t*3} 0H${n}V${e}H${t*3}L${t} ${e-t*2}L${t*2} ${e*.65|0}L0 ${e/2|0}L${t*2} ${e*.35|0}L${t} ${t*2}Z`,inn:`M${te+(t*2.5|0)} ${te}H${n}V${e-te}H${te+(t*2.5|0)}L${te+(t*.7|0)} ${e-te-(t*1.6|0)}L${te+(t*1.7|0)} ${e*.64|0}L${te} ${e/2|0}L${te+(t*1.7|0)} ${e*.36|0}L${te+(t*.7|0)} ${te+(t*1.6|0)}Z`}}function hr(e){const t=e*.42|0,n=t+2;return{w:n,out:`M${t} 0H${n}V${e}H0Z`,inn:`M${te+t-(te*1.3|0)} ${te}H${n}V${e-te}H${te+1}Z`}}function pa(e){const t=e*.42|0,n=t+2;return{w:n,out:`M0 0H${n}V${e}H${t}Z`,inn:`M${te} ${te}H${n}V${e-te}H${te+t-(te*1.3|0)+1}Z`}}function zt(e){const t=e/2|0;return{w:t,out:`M0 0A${t} ${t} 0 0 1 ${t} ${t}A${t} ${t} 0 0 1 0 ${e}Z`,inn:`M0 ${te}A${t-te} ${t-te} 0 0 1 ${t-te} ${t}A${t-te} ${t-te} 0 0 1 0 ${e-te}Z`}}function pn(e){return{w:te+1,out:`M0 0H${te+1}V${e}H0Z`,inn:`M0 ${te}H1V${e-te}H0Z`}}function vo(e){const t=Math.min(14,e*.22)|0,n=t+2,a=Math.max(t-te,1);return{w:n,out:`M0 0H${n-t}Q${n} 0 ${n} ${t}V${e-t}Q${n} ${e} ${n-t} ${e}H0Z`,inn:`M0 ${te}H${n-te-a}Q${n-te} ${te} ${n-te} ${te+a}V${e-te-a}Q${n-te} ${e-te} ${n-te-a} ${e-te}H0Z`}}function fn(e){const t=e*.3|0,n=t+2,a=Math.max(t-te,1);return{w:n,out:`M0 0H${n-t}L${n} ${t}V${e-t}L${n-t} ${e}H0Z`,inn:`M0 ${te}H${n-te-a}L${n-te} ${te+a}V${e-te-a}L${n-te-a} ${e-te}H0Z`}}function Nt(e){const t=e*.42|0,n=t+2,a=Math.max(t-(te*1.4|0),2);return{w:n,out:`M0 0H${n-t}L${n} ${e/2}L${n-t} ${e}H0Z`,inn:`M0 ${te}H${n-te-a}L${n-te} ${e/2}L${n-te-a} ${e-te}H0Z`}}function bo(e){const t=e*.3|0,n=t+4,a=Math.max(t-te,1);return{w:n,out:`M0 0H${n-t}Q${n} 0 ${n} ${t}V${e-t}L${n-(t*.6|0)} ${e}H0Z`,inn:`M0 ${te}H${n-te-a}Q${n-te} ${te} ${n-te} ${te+a}V${e-te-a}L${n-te-(a*.6|0)} ${e-te}H0Z`}}function xo(e){const t=e*.16|0,n=t*2+4;return{w:n,out:`M0 0H${n-(t*1.5|0)}C${n-(t*2.5|0)} ${e*.35|0} ${n-(t*2.5|0)} ${e*.65|0} ${n-(t*1.5|0)} ${e}H0Z`,inn:`M0 ${te}H${n-te-(t*1.2|0)}C${n-te-(t*2.2|0)} ${e*.37|0} ${n-te-(t*2.2|0)} ${e*.63|0} ${n-te-(t*1.2|0)} ${e-te}H0Z`}}function So(e){const t=e*.32|0,n=t+3,a=Math.max(t-te,1);return{w:n,out:`M0 0H${n}V${e-t}Q${n} ${e} ${n-t} ${e}H0Z`,inn:`M0 ${te}H${n-te}V${e-te-a}Q${n-te} ${e-te} ${n-te-a} ${e-te}H0Z`}}function Wa(e){const t=e*.14|0,n=t*3+2;return{w:n,out:`M0 0H${n-t*2}C${n-t} 0 ${n+(t*.3|0)} ${e*.2|0} ${n-(t*.5|0)} ${e*.35|0}S${n-(t*.5|0)} ${e*.8|0} ${n-t*2} ${e}H0Z`,inn:`M0 ${te}H${n-te-(t*1.8|0)}C${n-te-(t*.9|0)} ${te} ${n-te+(t*.1|0)} ${e*.22|0} ${n-te-(t*.4|0)} ${e*.37|0}S${n-te-(t*.4|0)} ${e*.78|0} ${n-te-(t*1.8|0)} ${e-te}H0Z`}}function Tr(e){const t=e*.09|0,n=e*.35|0;return{w:n,out:`M0 0H${n-t*3}L${n-t} ${t*2}L${n-t*2} ${e*.35|0}L${n} ${e/2|0}L${n-t*2} ${e*.65|0}L${n-t} ${e-t*2}L${n-t*3} ${e}H0Z`,inn:`M0 ${te}H${n-te-(t*2.5|0)}L${n-te-(t*.7|0)} ${te+(t*1.6|0)}L${n-te-(t*1.7|0)} ${e*.36|0}L${n-te} ${e/2|0}L${n-te-(t*1.7|0)} ${e*.64|0}L${n-te-(t*.7|0)} ${e-te-(t*1.6|0)}L${n-te-(t*2.5|0)} ${e-te}H0Z`}}function fa(e){const t=e*.42|0,n=t+2;return{w:n,out:`M0 0H${n}L${n-t} ${e}H0Z`,inn:`M0 ${te}H${n-te}L${n-te-t+(te*1.3|0)} ${e-te}H0Z`}}function pr(e){const t=e*.42|0,n=t+2;return{w:n,out:`M0 0H${n-t}L${n} ${e}H0Z`,inn:`M0 ${te}H${n-te-t+(te*1.3|0)}L${n-te} ${e-te}H0Z`}}const Ua=[{name:"Pill",L:qt,R:zt},{name:"Sharp",L:hn,R:pn},{name:"Soft",L:Fa,R:vo},{name:"Chamfer",L:Mr,R:fn},{name:"Arrow",L:Ot,R:Nt},{name:"Shield",L:Rr,R:bo},{name:"Bracket",L:Oa,R:xo},{name:"Tab",L:Ba,R:So},{name:"Wave",L:Nr,R:Wa},{name:"Ornate",L:Ga,R:Tr}],ko=[{name:"Pill→Arrow",L:qt,R:Nt},{name:"Arrow→Pill",L:Ot,R:zt},{name:"Pill→Sharp",L:qt,R:pn},{name:"Sharp→Pill",L:hn,R:zt},{name:"Pill→Chamfer",L:qt,R:fn},{name:"Chamfer→Pill",L:Mr,R:zt},{name:"Arrow→Sharp",L:Ot,R:pn},{name:"Sharp→Arrow",L:hn,R:Nt},{name:"Arrow→Chamfer",L:Ot,R:fn},{name:"Chamfer→Arrow",L:Mr,R:Nt},{name:"Soft→Arrow",L:Fa,R:Nt},{name:"Shield→Chamfer",L:Rr,R:fn},{name:"Pill→Wave",L:qt,R:Wa},{name:"Wave→Arrow",L:Nr,R:Nt},{name:"Tab→Pill",L:Ba,R:zt},{name:"Ornate→Sharp",L:Ga,R:pn},{name:"Sharp→Ornate",L:hn,R:Tr},{name:"Bracket→Arrow",L:Oa,R:Nt},{name:"Shield→Pill",L:Rr,R:zt},{name:"Wave→Ornate",L:Nr,R:Tr}],wo=[{name:"Skew ╲",L:hr,R:fa},{name:"Skew ╱",L:pa,R:pr},{name:"◇ Romb",L:Ot,R:Nt},{name:"╲→Pill",L:hr,R:zt},{name:"Pill→╲",L:qt,R:fa},{name:"╱→Sharp",L:pa,R:pn},{name:"Sharp→╱",L:hn,R:pr},{name:"╲→Arrow",L:hr,R:Nt},{name:"Arrow→╱",L:Ot,R:pr},{name:"◇→Chamfer",L:Ot,R:fn}],Wn=(function(){return[...Ua,...ko,...wo]})(),Co=Ua[0];function Rn(e){return Wn.find(t=>t.name===e)||Co}const Pr=[{name:"Flames",mk:(e,t,n)=>{const a=n||t;return`<pattern id="${e}" width="12" height="16" patternUnits="userSpaceOnUse"><path d="M6 0C8 3 10 5 9 9C8 12 6 14 6 16C6 14 4 12 3 9C2 5 4 3 6 0Z" fill="${t}" opacity=".5"/><path d="M3 6C4 8 5 10 3 14C1 10 2 8 3 6Z" fill="${a}" opacity=".3"/><path d="M9 6C10 8 11 10 9 14C7 10 8 8 9 6Z" fill="${a}" opacity=".3"/></pattern>`}},{name:"Zigzag",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M0 5L5 0L10 5L5 10Z" fill="${n||t}" fill-opacity=".15" stroke="${t}" stroke-width="1.2" opacity=".55"/></pattern>`},{name:"Scales",mk:(e,t,n)=>{const a=n||t;return`<pattern id="${e}" width="12" height="8" patternUnits="userSpaceOnUse"><ellipse cx="6" cy="8" rx="6" ry="4.5" fill="none" stroke="${t}" stroke-width="1" opacity=".5"/><ellipse cx="0" cy="4" rx="6" ry="4.5" fill="none" stroke="${a}" stroke-width=".8" opacity=".3"/><ellipse cx="12" cy="4" rx="6" ry="4.5" fill="none" stroke="${a}" stroke-width=".8" opacity=".3"/></pattern>`}},{name:"Hex",mk:(e,t,n)=>`<pattern id="${e}" width="18" height="20" patternUnits="userSpaceOnUse"><path d="M9 2L16 6V14L9 18L2 14V6Z" fill="none" stroke="${t}" stroke-width="1" opacity=".45"/><path d="M9 12L13.5 14.5V19L9 21.5L4.5 19V14.5Z" fill="none" stroke="${n||t}" stroke-width=".6" opacity=".25"/></pattern>`},{name:"Dots",mk:(e,t,n)=>{const a=n||t;return`<pattern id="${e}" width="8" height="8" patternUnits="userSpaceOnUse"><circle cx="4" cy="4" r="2" fill="${t}" opacity=".5"/><circle cx="0" cy="0" r="1" fill="${a}" opacity=".3"/><circle cx="8" cy="8" r="1" fill="${a}" opacity=".3"/></pattern>`}},{name:"Stars",mk:(e,t,n)=>`<pattern id="${e}" width="14" height="14" patternUnits="userSpaceOnUse"><path d="M7 1L8.8 5.2L13.2 5.2L9.7 7.8L11 12.2L7 9.4L3 12.2L4.3 7.8L.8 5.2L5.2 5.2Z" fill="${t}" opacity=".45" stroke="${n||t}" stroke-width=".4" stroke-opacity=".3"/></pattern>`},{name:"Diamonds",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M5 .5L9.5 5L5 9.5L.5 5Z" fill="${n||"none"}" fill-opacity=".15" stroke="${t}" stroke-width="1" opacity=".5"/></pattern>`},{name:"Waves",mk:(e,t,n)=>`<pattern id="${e}" width="16" height="8" patternUnits="userSpaceOnUse"><path d="M0 4Q4 0 8 4Q12 8 16 4" fill="none" stroke="${t}" stroke-width="1.3" opacity=".5"/><path d="M0 6Q4 2 8 6Q12 10 16 6" fill="none" stroke="${n||t}" stroke-width=".6" opacity=".25"/></pattern>`},{name:"Crosses",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M5 2V8" stroke="${t}" stroke-width="1.3" stroke-linecap="round" opacity=".5"/><path d="M2 5H8" stroke="${n||t}" stroke-width="1.3" stroke-linecap="round" opacity=".5"/></pattern>`},{name:"Triangles",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="10" patternUnits="userSpaceOnUse"><path d="M6 1L11 9H1Z" fill="${n||"none"}" fill-opacity=".12" stroke="${t}" stroke-width="1" opacity=".5"/></pattern>`},{name:"Chevrons",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="10" patternUnits="userSpaceOnUse"><path d="M0 7L6 1.5L12 7" fill="none" stroke="${t}" stroke-width="1.2" opacity=".55"/><path d="M0 10L6 4.5L12 10" fill="none" stroke="${n||t}" stroke-width=".7" opacity=".25"/></pattern>`},{name:"Hatch ╲",mk:(e,t,n)=>`<pattern id="${e}" width="6" height="6" patternUnits="userSpaceOnUse"><path d="M0 6L6 0" stroke="${t}" stroke-width="1" opacity=".45"/><path d="M-1 1L1 -1M5 7L7 5" stroke="${n||t}" stroke-width=".8" opacity=".3"/></pattern>`},{name:"Hatch ╳",mk:(e,t,n)=>`<pattern id="${e}" width="7" height="7" patternUnits="userSpaceOnUse"><path d="M0 7L7 0" stroke="${t}" stroke-width=".8" opacity=".4"/><path d="M0 0L7 7" stroke="${n||t}" stroke-width=".8" opacity=".4"/></pattern>`},{name:"Grid",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M10 0V10" fill="none" stroke="${t}" stroke-width=".8" opacity=".4"/><path d="M0 10H10" fill="none" stroke="${n||t}" stroke-width=".8" opacity=".4"/></pattern>`},{name:"Bricks",mk:(e,t,n)=>`<pattern id="${e}" width="14" height="8" patternUnits="userSpaceOnUse"><rect width="14" height="8" fill="none" stroke="${t}" stroke-width=".8" opacity=".4"/><line x1="7" y1="0" x2="7" y2="4" stroke="${n||t}" stroke-width=".8" opacity=".4"/></pattern>`},{name:"Hearts",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="12" patternUnits="userSpaceOnUse"><path d="M6 10C4 8 1 6.5 1 4C1 2.3 2.8 1 4.5 2.2L6 4L7.5 2.2C9.2 1 11 2.3 11 4C11 6.5 8 8 6 10Z" fill="${t}" opacity=".4" stroke="${n||t}" stroke-width=".5" stroke-opacity=".3"/></pattern>`},{name:"Arrows",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="10" patternUnits="userSpaceOnUse"><path d="M3 2L9 5L3 8" fill="${n||"none"}" fill-opacity=".15" stroke="${t}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" opacity=".5"/></pattern>`},{name:"Bolts",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="16" patternUnits="userSpaceOnUse"><path d="M7 1L4 7H8L3 15" fill="none" stroke="${t}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" opacity=".5"/><circle cx="5" cy="11" r="1" fill="${n||t}" opacity=".3"/></pattern>`},{name:"Leaves",mk:(e,t,n)=>{const a=n||t;return`<pattern id="${e}" width="14" height="14" patternUnits="userSpaceOnUse"><path d="M7 2C10 4 12 7 10 11C8 13 5 12 4 10C3 7 4 4 7 2Z" fill="none" stroke="${t}" stroke-width="1" opacity=".45"/><path d="M7 3L6 10" stroke="${a}" stroke-width=".6" opacity=".3"/><path d="M5 5L7 6M5 8L7 7.5" stroke="${a}" stroke-width=".4" opacity=".25"/></pattern>`}},{name:"Spirals",mk:(e,t,n)=>`<pattern id="${e}" width="16" height="16" patternUnits="userSpaceOnUse"><path d="M8 4A4 4 0 0 1 12 8A3.5 3.5 0 0 1 8.5 11.5A2.5 2.5 0 0 1 6 9A1.5 1.5 0 0 1 7.5 7.5" fill="none" stroke="${t}" stroke-width="1.2" stroke-linecap="round" opacity=".45"/><circle cx="8" cy="8" r="1" fill="${n||t}" opacity=".25"/></pattern>`},{name:"Moons",mk:(e,t,n)=>`<pattern id="${e}" width="14" height="14" patternUnits="userSpaceOnUse"><path d="M9 2A5 5 0 1 0 9 12" fill="none" stroke="${t}" stroke-width="1" opacity=".4"/><path d="M9 2A3.5 3.5 0 0 1 9 12" fill="none" stroke="${n||t}" stroke-width="1" opacity=".3"/></pattern>`},{name:"Rings",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="12" patternUnits="userSpaceOnUse"><circle cx="6" cy="6" r="4" fill="none" stroke="${t}" stroke-width="1.2" opacity=".5"/><circle cx="6" cy="6" r="2" fill="none" stroke="${n||t}" stroke-width=".6" opacity=".25"/></pattern>`},{name:"Teeth",mk:(e,t,n)=>`<pattern id="${e}" width="8" height="10" patternUnits="userSpaceOnUse"><path d="M0 10V4L4 0L8 4V10" fill="${n||"none"}" fill-opacity=".12" stroke="${t}" stroke-width="1" opacity=".5"/></pattern>`},{name:"Swirl",mk:(e,t,n)=>`<pattern id="${e}" width="16" height="10" patternUnits="userSpaceOnUse"><path d="M0 5C3 0 6 0 8 5C10 10 13 10 16 5" fill="none" stroke="${t}" stroke-width="1.3" opacity=".5"/><path d="M0 7C3 2 6 2 8 7C10 12 13 12 16 7" fill="none" stroke="${n||t}" stroke-width=".6" opacity=".2"/></pattern>`},{name:"Chain",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="16" patternUnits="userSpaceOnUse"><ellipse cx="5" cy="4" rx="3.5" ry="4" fill="none" stroke="${t}" stroke-width="1" opacity=".45"/><ellipse cx="5" cy="12" rx="3.5" ry="4" fill="none" stroke="${n||t}" stroke-width="1" opacity=".45"/></pattern>`},{name:"Feathers",mk:(e,t,n)=>`<pattern id="${e}" width="12" height="18" patternUnits="userSpaceOnUse"><path d="M6 1C9 5 10 9 6 17" fill="none" stroke="${t}" stroke-width=".8" opacity=".4"/><path d="M6 1C3 5 2 9 6 17" fill="none" stroke="${t}" stroke-width=".8" opacity=".4"/><path d="M4 5L6 4L8 5M4 9L6 8L8 9M4 13L6 12L8 13" stroke="${n||t}" stroke-width=".5" opacity=".3"/></pattern>`},{name:"DNA",mk:(e,t,n)=>`<pattern id="${e}" width="14" height="18" patternUnits="userSpaceOnUse"><path d="M3 0C3 4.5 11 4.5 11 9S3 13.5 3 18" fill="none" stroke="${t}" stroke-width="1" opacity=".45"/><path d="M11 0C11 4.5 3 4.5 3 9S11 13.5 11 18" fill="none" stroke="${n||t}" stroke-width="1" opacity=".45"/></pattern>`},{name:"Bubbles",mk:(e,t,n)=>{const a=n||t;return`<pattern id="${e}" width="18" height="18" patternUnits="userSpaceOnUse"><circle cx="5" cy="5" r="3.5" fill="none" stroke="${t}" stroke-width=".8" opacity=".4"/><circle cx="14" cy="12" r="4.5" fill="none" stroke="${a}" stroke-width=".8" opacity=".35"/><circle cx="11" cy="3" r="1.8" fill="${a}" opacity=".25"/></pattern>`}},{name:"Celtic",mk:(e,t,n)=>`<pattern id="${e}" width="16" height="16" patternUnits="userSpaceOnUse"><path d="M8 2C12 2 14 4 14 8C14 12 12 14 8 14C4 14 2 12 2 8C2 4 4 2 8 2Z" fill="none" stroke="${t}" stroke-width=".8" opacity=".35"/><path d="M4 4L12 12M12 4L4 12" stroke="${n||t}" stroke-width=".6" opacity=".2"/></pattern>`},{name:"Squares",mk:(e,t,n)=>`<pattern id="${e}" width="10" height="10" patternUnits="userSpaceOnUse"><rect x="1.5" y="1.5" width="7" height="7" rx="1" fill="${n||"none"}" fill-opacity=".12" stroke="${t}" stroke-width="1" opacity=".5"/></pattern>`}];function Nn(e){return Pr.find(t=>t.name===e)||null}const Gt={color:null,capStyleName:"Pill",patternName:null,patternColor:null,patternOnly:!1,highlight:70,glow:55,glass:0,textureUrl:null,textureScale:1},zr=(function(){return{...Gt,glass:85}})(),Fr=(function(){return{...Gt,patternName:"Stars"}})(),Or=(function(){return{...Gt,patternName:"Stars"}})(),Br={fontFamily:null,fontSize:18,fontColor:null,outlineColor:null,outlineWidth:0,shadow:null},jo=(function(){return{filledBar:{...Gt},emptyBar:{...zr},goldFilledBar:{...Or},goldEmptyBar:{...Fr},font:{...Br},disableGoldNotes:!1}})(),Ns={capStyleName:"Pill",patternName:null,patternColor:null,patternOnly:!1,highlight:70,glow:55,emptyGlass:85,filledTextureUrl:null,emptyTextureUrl:null,textureScale:1,emptyPreset:"custom",goldPatternName:"Stars",goldPatternColor:null,goldHitPatternName:"Stars",goldHitPatternColor:null,goldEmptyTextureUrl:null,goldFilledTextureUrl:null,fontFamily:null,fontSize:18,fontColor:null,fontOutlineColor:null,fontOutlineWidth:0,fontShadow:null},Ts="nice2dev-player-bar-style",Ps="nice2dev-player-karaoke-settings";function mn(e){return e!=null?`${Ps}-${e}`:Ps}function Es(e){return e!=null?`${Ts}-${e}`:Ts}function $s(e){return{filledBar:{color:null,capStyleName:e.capStyleName,patternName:e.patternName,patternColor:e.patternColor,patternOnly:e.patternOnly,highlight:e.highlight,glow:e.glow,glass:0,textureUrl:e.filledTextureUrl,textureScale:e.textureScale},emptyBar:{color:null,capStyleName:e.capStyleName,patternName:e.patternName,patternColor:e.patternColor,patternOnly:e.patternOnly,highlight:e.highlight,glow:e.glow,glass:e.emptyGlass,textureUrl:e.emptyTextureUrl,textureScale:e.textureScale},goldFilledBar:{color:null,capStyleName:e.capStyleName,patternName:e.goldHitPatternName,patternColor:e.goldHitPatternColor,patternOnly:e.patternOnly,highlight:e.highlight,glow:e.glow,glass:0,textureUrl:e.goldFilledTextureUrl,textureScale:e.textureScale},goldEmptyBar:{color:null,capStyleName:e.capStyleName,patternName:e.goldPatternName,patternColor:e.goldPatternColor,patternOnly:e.patternOnly,highlight:e.highlight,glow:e.glow,glass:0,textureUrl:e.goldEmptyTextureUrl,textureScale:e.textureScale},font:{fontFamily:e.fontFamily,fontSize:e.fontSize,fontColor:e.fontColor,outlineColor:e.fontOutlineColor,outlineWidth:e.fontOutlineWidth,shadow:e.fontShadow}}}function As(e){const t=jo,n=(s,i)=>!i||typeof i!="object"?{...s}:{...s,...i},a=(s,i)=>!i||typeof i!="object"?{...s}:{...s,...i};return{filledBar:n(t.filledBar,e.filledBar),emptyBar:n(t.emptyBar,e.emptyBar),goldFilledBar:n(t.goldFilledBar,e.goldFilledBar),goldEmptyBar:n(t.goldEmptyBar,e.goldEmptyBar),font:a(t.font,e.font),disableGoldNotes:typeof e.disableGoldNotes=="boolean"?e.disableGoldNotes:t.disableGoldNotes}}function Va(e){try{const t=localStorage.getItem(mn(e));if(t){const a=JSON.parse(t);return As(a)}const n=localStorage.getItem(Es(e));if(n){const a=JSON.parse(n),s=$s({...Ns,...a});return localStorage.setItem(mn(e),JSON.stringify(s)),s}if(e!=null){const a=localStorage.getItem(mn());if(a)return As(JSON.parse(a));const s=localStorage.getItem(Es());if(s)return $s({...Ns,...JSON.parse(s)})}}catch{}return{filledBar:{...Gt},emptyBar:{...zr},goldFilledBar:{...Or},goldEmptyBar:{...Fr},font:{...Br}}}function Fu(e,t){const n=JSON.stringify(e);localStorage.setItem(mn(t),n)}let Is=!1;async function Ou(e){if(Is||(Is=!0,!e))return;const t=await e();if(t)try{localStorage.getItem(mn())||localStorage.setItem(mn(),t)}catch{}}function Bu(e){const t=new Map;for(const n of e)t.set(n,Va(n));return t}const Gu={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Wu=/[&<>"']/g;function Uu(e){return e.replace(Wu,t=>Gu[t])}function Vu(e){const t=e.trim().toLowerCase();return!!(t.startsWith("http://")||t.startsWith("https://")||t.startsWith("blob:")||t.startsWith("data:image/")||t.startsWith("/")||t.startsWith("./")||t.startsWith("../"))}const qu=3,Ze=qu;function Er(e){const t=parseInt(e.slice(1,3),16)/255,n=parseInt(e.slice(3,5),16)/255,a=parseInt(e.slice(5,7),16)/255,s=Math.max(t,n,a),i=Math.min(t,n,a);let o=0,l=0;const c=(s+i)/2;if(s!==i){const u=s-i;switch(l=c>.5?u/(2-s-i):u/(s+i),s){case t:o=((n-a)/u+(n<a?6:0))/6;break;case n:o=((a-t)/u+2)/6;break;case a:o=((t-n)/u+4)/6;break}}return[Math.round(o*360),Math.round(l*100),Math.round(c*100)]}function $r(e){let t=e.replace("#","");return t.length===3&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),"#"+t.toLowerCase()}function dt(e,t){return e.replace(/([MLHVCSQTAZ])/gi,`
2
2
  $1`).split(`
3
- `).filter(Boolean).map(n=>{const a=n[0],s=n.slice(1).trim().split(/[\s,]+/).map(Number);if(a==="H")return`H${s[0]+t}`;if(a==="V"||a==="Z")return n;if("MLCSQT".includes(a.toUpperCase())){for(let i=0;i<s.length;i+=2)s[i]+=t;return a+s.join(" ")}return a==="A"&&s.length>=7?(s[5]+=t,a+s.join(" ")):n}).join("")}function Mo(e){const{width:t,height:n,capStyle:a,color:s,highlight:i=70,glow:o=55,glass:l=0,pattern:c=null,patternColor:u=null,patternOnly:h=!1,textureUrl:p=null,textureScale:g=1}=e,y=p&&Uu(p)?Vu(p):null,[m,x,b]=Er($r(s)),f="c"+Math.random().toString(36).slice(2,7),k=a.L(n),v=a.R(n),w=t-k.w-v.w;if(w<4)return"";if(h&&c){const X=`hsl(${m},${x}%,${b}%)`,re=`hsl(${m},${Math.max(x-20,0)}%,${Math.min(b+30,95)}%)`,oe=u||re,se=k.w,D=k.w+w,J=k.inn,ae=`M${se} ${Ze}H${D}V${n-Ze}H${se}Z`,ce=dt(v.inn,D),le=k.out,ne=`M${se} 0H${D}V${n}H${se}Z`,pe=dt(v.out,D),fe=c.mk(f+"pat",oe,u||void 0),me=Math.round(256*g),he=Math.round(256*g),we=y?`<pattern id="${f}tex" patternUnits="userSpaceOnUse" width="${me}" height="${he}"><image href="${y}" width="${me}" height="${he}" preserveAspectRatio="none"/></pattern>`:"",je=y?`<rect x="0" y="0" width="${t}" height="${n}" fill="url(#${f}tex)" opacity=".85" clip-path="url(#${f}c)"/>`:"";return`<svg xmlns="http://www.w3.org/2000/svg" width="${t}" height="${n}" viewBox="0 0 ${t} ${n}"><defs>
3
+ `).filter(Boolean).map(n=>{const a=n[0],s=n.slice(1).trim().split(/[\s,]+/).map(Number);if(a==="H")return`H${s[0]+t}`;if(a==="V"||a==="Z")return n;if("MLCSQT".includes(a.toUpperCase())){for(let i=0;i<s.length;i+=2)s[i]+=t;return a+s.join(" ")}return a==="A"&&s.length>=7?(s[5]+=t,a+s.join(" ")):n}).join("")}function Mo(e){const{width:t,height:n,capStyle:a,color:s,highlight:i=70,glow:o=55,glass:l=0,pattern:c=null,patternColor:u=null,patternOnly:h=!1,textureUrl:p=null,textureScale:g=1}=e,y=p&&Vu(p)?Uu(p):null,[m,x,b]=Er($r(s)),f="c"+Math.random().toString(36).slice(2,7),j=a.L(n),v=a.R(n),C=t-j.w-v.w;if(C<4)return"";if(h&&c){const X=`hsl(${m},${x}%,${b}%)`,re=`hsl(${m},${Math.max(x-20,0)}%,${Math.min(b+30,95)}%)`,oe=u||re,se=j.w,D=j.w+C,J=j.inn,ae=`M${se} ${Ze}H${D}V${n-Ze}H${se}Z`,ce=dt(v.inn,D),le=j.out,ne=`M${se} 0H${D}V${n}H${se}Z`,pe=dt(v.out,D),fe=c.mk(f+"pat",oe,u||void 0),ge=Math.round(256*g),he=Math.round(256*g),we=y?`<pattern id="${f}tex" patternUnits="userSpaceOnUse" width="${ge}" height="${he}"><image href="${y}" width="${ge}" height="${he}" preserveAspectRatio="none"/></pattern>`:"",je=y?`<rect x="0" y="0" width="${t}" height="${n}" fill="url(#${f}tex)" opacity=".85" clip-path="url(#${f}c)"/>`:"";return`<svg xmlns="http://www.w3.org/2000/svg" width="${t}" height="${n}" viewBox="0 0 ${t} ${n}"><defs>
4
4
  ${fe}
5
5
  ${we}
6
6
  <clipPath id="${f}c"><path d="${J}"/><path d="${ae}"/><path d="${ce}"/></clipPath>
@@ -9,22 +9,22 @@ ${we}
9
9
  <path d="${J}" fill="${X}" opacity=".22"/><path d="${ae}" fill="${X}" opacity=".22"/><path d="${ce}" fill="${X}" opacity=".22"/>
10
10
  ${je}
11
11
  <rect x="0" y="0" width="${t}" height="${n}" fill="url(#${f}pat)" clip-path="url(#${f}c)"/>
12
- </svg>`}const R=`hsl(${m},${Math.min(x+10,100)}%,${Math.max(b-22,4)}%)`,M=`hsl(${m},${x}%,${b}%)`,j=`hsl(${m},${Math.max(x-12,0)}%,${Math.min(b+18,88)}%)`,T=`hsl(${m},${Math.min(x+20,100)}%,${Math.min(b+30,93)}%)`,P=`hsl(${m},${Math.max(x-20,0)}%,${Math.min(b+30,95)}%)`,A=u||P,I=i/100*.78,L=o/100*.65,N=1-l/100*.87,_=Ze,ee=n-Ze,Y=_+(ee-_)*.44,O=_+(ee-_)*.58,U=k.w,V=k.w+w,K=k.out,G=`M${U} 0H${V}V${n}H${U}Z`,W=dt(v.out,V),C=k.inn,$=`M${U} ${Ze}H${V}V${n-Ze}H${U}Z`,S=dt(v.inn,V),B=c?c.mk(f+"pat",A,u||void 0):"",H=c?`<rect x="0" y="0" width="${t}" height="${n}" fill="url(#${f}pat)" clip-path="url(#${f}c)"/>`:"",z=Math.round(256*g),Z=Math.round(256*g),E=y?`<pattern id="${f}tex" patternUnits="userSpaceOnUse" width="${z}" height="${Z}"><image href="${y}" width="${z}" height="${Z}" preserveAspectRatio="none"/></pattern>`:"",q=y?`<rect x="0" y="0" width="${t}" height="${n}" fill="url(#${f}tex)" opacity="${N*.9}" clip-path="url(#${f}c)"/>`:"";return`<svg xmlns="http://www.w3.org/2000/svg" width="${t}" height="${n}" viewBox="0 0 ${t} ${n}"><defs>
13
- ${B}
14
- ${E}
12
+ </svg>`}const N=`hsl(${m},${Math.min(x+10,100)}%,${Math.max(b-22,4)}%)`,M=`hsl(${m},${x}%,${b}%)`,k=`hsl(${m},${Math.max(x-12,0)}%,${Math.min(b+18,88)}%)`,T=`hsl(${m},${Math.min(x+20,100)}%,${Math.min(b+30,93)}%)`,E=`hsl(${m},${Math.max(x-20,0)}%,${Math.min(b+30,95)}%)`,A=u||E,I=i/100*.78,L=o/100*.65,P=1-l/100*.87,_=Ze,ee=n-Ze,K=_+(ee-_)*.44,z=_+(ee-_)*.58,V=j.w,W=j.w+C,H=j.out,G=`M${V} 0H${W}V${n}H${V}Z`,Z=dt(v.out,W),w=j.inn,R=`M${V} ${Ze}H${W}V${n-Ze}H${V}Z`,S=dt(v.inn,W),F=c?c.mk(f+"pat",A,u||void 0):"",Y=c?`<rect x="0" y="0" width="${t}" height="${n}" fill="url(#${f}pat)" clip-path="url(#${f}c)"/>`:"",O=Math.round(256*g),U=Math.round(256*g),$=y?`<pattern id="${f}tex" patternUnits="userSpaceOnUse" width="${O}" height="${U}"><image href="${y}" width="${O}" height="${U}" preserveAspectRatio="none"/></pattern>`:"",q=y?`<rect x="0" y="0" width="${t}" height="${n}" fill="url(#${f}tex)" opacity="${P*.9}" clip-path="url(#${f}c)"/>`:"";return`<svg xmlns="http://www.w3.org/2000/svg" width="${t}" height="${n}" viewBox="0 0 ${t} ${n}"><defs>
13
+ ${F}
14
+ ${$}
15
15
  <linearGradient id="${f}b" x1="0" y1="0" x2="0" y2="${n}" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="rgba(255,255,255,.55)"/><stop offset=".3" stop-color="rgba(255,255,255,.35)"/><stop offset="1" stop-color="rgba(255,255,255,.08)"/></linearGradient>
16
- <linearGradient id="${f}f" x1="0" y1="${_}" x2="0" y2="${ee}" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="${j}"/><stop offset=".5" stop-color="${M}"/><stop offset="1" stop-color="${R}"/></linearGradient>
17
- <linearGradient id="${f}h" x1="0" y1="${_}" x2="0" y2="${Y}" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff" stop-opacity="${I}"/><stop offset=".5" stop-color="#fff" stop-opacity="${I*.25}"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient>
18
- <linearGradient id="${f}g" x1="0" y1="${O}" x2="0" y2="${ee}" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="${T}" stop-opacity="0"/><stop offset=".6" stop-color="${T}" stop-opacity="${L*.6}"/><stop offset="1" stop-color="${T}" stop-opacity="${L}"/></linearGradient>
19
- <clipPath id="${f}c"><path d="${C}"/><path d="${$}"/><path d="${S}"/></clipPath>
16
+ <linearGradient id="${f}f" x1="0" y1="${_}" x2="0" y2="${ee}" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="${k}"/><stop offset=".5" stop-color="${M}"/><stop offset="1" stop-color="${N}"/></linearGradient>
17
+ <linearGradient id="${f}h" x1="0" y1="${_}" x2="0" y2="${K}" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff" stop-opacity="${I}"/><stop offset=".5" stop-color="#fff" stop-opacity="${I*.25}"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient>
18
+ <linearGradient id="${f}g" x1="0" y1="${z}" x2="0" y2="${ee}" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="${T}" stop-opacity="0"/><stop offset=".6" stop-color="${T}" stop-opacity="${L*.6}"/><stop offset="1" stop-color="${T}" stop-opacity="${L}"/></linearGradient>
19
+ <clipPath id="${f}c"><path d="${w}"/><path d="${R}"/><path d="${S}"/></clipPath>
20
20
  </defs>
21
- <path d="${K}" fill="url(#${f}b)"/><path d="${G}" fill="url(#${f}b)"/><path d="${W}" fill="url(#${f}b)"/>
22
- <path d="${C}" fill="url(#${f}f)" opacity="${N}"/><path d="${$}" fill="url(#${f}f)" opacity="${N}"/><path d="${S}" fill="url(#${f}f)" opacity="${N}"/>
21
+ <path d="${H}" fill="url(#${f}b)"/><path d="${G}" fill="url(#${f}b)"/><path d="${Z}" fill="url(#${f}b)"/>
22
+ <path d="${w}" fill="url(#${f}f)" opacity="${P}"/><path d="${R}" fill="url(#${f}f)" opacity="${P}"/><path d="${S}" fill="url(#${f}f)" opacity="${P}"/>
23
23
  ${q}
24
- ${H}
25
- <rect x="0" y="${O}" width="${t}" height="${ee-O}" fill="url(#${f}g)" clip-path="url(#${f}c)"/>
26
- <rect x="0" y="${_}" width="${t}" height="${Y-_}" fill="url(#${f}h)" clip-path="url(#${f}c)"/>
27
- </svg>`}function et(e,t){const n=t.match(/[MLHVCSQTAZmlhvcsqtaz][^MLHVCSQTAZmlhvcsqtaz]*/g);if(!n)return;let a=0,s=0;for(const i of n){const o=i[0],l=i.slice(1).trim().split(/[\s,]+/).filter(Boolean).map(Number);switch(o){case"M":a=l[0],s=l[1],e.moveTo(a,s);break;case"L":a=l[0],s=l[1],e.lineTo(a,s);break;case"H":a=l[0],e.lineTo(a,s);break;case"V":s=l[0],e.lineTo(a,s);break;case"C":e.bezierCurveTo(l[0],l[1],l[2],l[3],l[4],l[5]),a=l[4],s=l[5];break;case"Q":e.quadraticCurveTo(l[0],l[1],l[2],l[3]),a=l[2],s=l[3];break;case"S":{e.bezierCurveTo(a,s,l[0],l[1],l[2],l[3]),a=l[2],s=l[3];break}case"A":{const c=Math.abs(l[0]),u=Math.abs(l[1]),h=l[3]!==0,p=l[4]!==0,g=l[5],y=l[6],m=a,x=s;if(Math.abs(m-g)<.001&&Math.abs(x-y)<.001||c<.001||u<.001){e.lineTo(g,y),a=g,s=y;break}const b=(c+u)/2,f=(m-g)/2,k=(x-y)/2,v=f*f+k*k,w=v>b*b?Math.sqrt(v):b,R=w*w,M=Math.sqrt(Math.max(0,(R-v)/v)),j=h!==p?1:-1,T=(m+g)/2+j*M*k,P=(x+y)/2-j*M*f,A=Math.atan2(x-P,m-T),I=Math.atan2(y-P,g-T);e.arc(T,P,w,A,I,!p),a=g,s=y;break}case"Z":e.closePath();break}}}function Tn(e,t,n,a,s,i,o,l=70,c=55,u=0,h,p,g=!1,y,m){const[x,b,f]=Er($r(o)),k=i.L(s),v=i.R(s),w=a-k.w-v.w;if(w<0){const[C,,$]=Er($r(o));e.save(),e.translate(t,n),e.globalAlpha=1-u/100*.87,e.fillStyle=`hsl(${C},50%,${Math.min($+10,80)}%)`;const S=Math.min(a/2,s/2);e.beginPath(),e.moveTo(S,0),e.lineTo(a-S,0),e.quadraticCurveTo(a,0,a,S),e.lineTo(a,s-S),e.quadraticCurveTo(a,s,a-S,s),e.lineTo(S,s),e.quadraticCurveTo(0,s,0,s-S),e.lineTo(0,S),e.quadraticCurveTo(0,0,S,0),e.closePath(),e.fill(),e.restore();return}const R=k.w,M=k.w+w;if(g){const C=`hsla(${x},${b}%,${f}%,0.22)`;e.save(),e.translate(t,n),e.fillStyle="rgba(255,255,255,0.18)",e.beginPath(),et(e,k.out),e.fill(),e.fillRect(R,0,w,s),e.beginPath(),et(e,dt(v.out,M)),e.fill(),e.fillStyle=C,e.beginPath(),et(e,k.inn),e.fill(),e.fillRect(R,Ze,w,s-2*Ze),e.beginPath(),et(e,dt(v.inn,M)),e.fill(),y&&(e.save(),e.beginPath(),et(e,k.inn),e.rect(R,Ze,w,s-2*Ze),et(e,dt(v.inn,M)),e.clip(),e.globalAlpha=.85,e.fillStyle=y,e.fillRect(0,0,a,s),e.globalAlpha=1,e.restore()),m&&(e.save(),e.beginPath(),et(e,k.inn),e.rect(R,Ze,w,s-2*Ze),et(e,dt(v.inn,M)),e.clip(),e.globalAlpha=.85,e.fillStyle=m,e.fillRect(0,0,a,s),e.globalAlpha=1,e.restore()),e.restore();return}const j=`hsl(${x},${Math.min(b+10,100)}%,${Math.max(f-22,4)}%)`,T=`hsl(${x},${b}%,${f}%)`,P=`hsl(${x},${Math.max(b-12,0)}%,${Math.min(f+18,88)}%)`,A=`hsl(${x},${Math.min(b+20,100)}%,${Math.min(f+30,93)}%)`,I=l/100*.78,L=c/100*.65,N=1-u/100*.87,_=Ze,ee=s-Ze,Y=ee-_,O=_+Y*.44,U=_+Y*.58;e.save(),e.translate(t,n);const V=e.createLinearGradient(0,0,0,s);V.addColorStop(0,"rgba(255,255,255,0.55)"),V.addColorStop(.3,"rgba(255,255,255,0.35)"),V.addColorStop(1,"rgba(255, 255, 255, 0.08)"),e.fillStyle=V,e.beginPath(),et(e,k.out),e.fill(),e.fillRect(R,0,w,s),e.beginPath(),et(e,dt(v.out,M)),e.fill();const K=e.createLinearGradient(0,_,0,ee);K.addColorStop(0,P),K.addColorStop(.5,T),K.addColorStop(1,j),e.globalAlpha=N,e.fillStyle=K,e.beginPath(),et(e,k.inn),e.fill(),e.fillRect(R,Ze,w,s-2*Ze),e.beginPath(),et(e,dt(v.inn,M)),e.fill(),e.globalAlpha=1,y&&(e.save(),e.beginPath(),et(e,k.inn),e.rect(R,Ze,w,s-2*Ze),et(e,dt(v.inn,M)),e.clip(),e.globalAlpha=N*.9,e.fillStyle=y,e.fillRect(0,0,a,s),e.globalAlpha=1,e.restore()),m&&(e.save(),e.beginPath(),et(e,k.inn),e.rect(R,Ze,w,s-2*Ze),et(e,dt(v.inn,M)),e.clip(),e.globalAlpha=N*.85,e.fillStyle=m,e.fillRect(0,0,a,s),e.globalAlpha=1,e.restore()),e.save(),e.beginPath(),et(e,k.inn),e.rect(R,Ze,w,s-2*Ze),et(e,dt(v.inn,M)),e.clip();const G=e.createLinearGradient(0,U,0,ee);G.addColorStop(0,"transparent"),G.addColorStop(.6,A.replace(")",`, ${L*.6})`).replace("hsl","hsla")),G.addColorStop(1,A.replace(")",`, ${L})`).replace("hsl","hsla")),e.fillStyle=G,e.fillRect(0,U,a,ee-U);const W=e.createLinearGradient(0,_,0,O);W.addColorStop(0,`rgba(255,255,255,${I})`),W.addColorStop(.5,`rgba(255,255,255,${I*.25})`),W.addColorStop(1,"rgba(255,255,255,0)"),e.fillStyle=W,e.fillRect(0,_,a,O-_),e.restore(),e.restore()}const Ht="var(--nice-warning, #FFD700)",Ro="var(--nice-warning-bg, #fff0a8)";function Hu(e){const{ctx:t,ballX:n,height:a,playerColor:s,currentTime:i}=e;t.save(),t.globalCompositeOperation="source-over";const o=t.createLinearGradient(Math.max(0,n-60),0,n,0);o.addColorStop(0,"transparent"),o.addColorStop(1,s),t.globalAlpha=.18,t.fillStyle=o,t.fillRect(Math.max(0,n-60),0,60,a),t.globalAlpha=.9,t.strokeStyle=s,t.lineWidth=3,t.shadowColor=s,t.shadowBlur=12,t.beginPath(),t.moveTo(n,0),t.lineTo(n,a),t.stroke();const l=6+Math.sin(i*6)*2;t.fillStyle=e.ballIsGold?ke.resolveCssColor(Ht,t.canvas):s,t.beginPath(),t.moveTo(n,e.ballY-l),t.lineTo(n+l*.7,e.ballY),t.lineTo(n,e.ballY+l),t.lineTo(n-l*.7,e.ballY),t.closePath(),t.fill(),t.restore(),t.save(),t.globalCompositeOperation="source-atop",t.globalAlpha=.35;for(const c of e.visibleNotes)c.isSung&&(t.fillStyle=c.isGold?ke.resolveCssColor(Ht,t.canvas):s,t.fillRect(c.x,c.y,c.w,c.h));t.restore()}function Ku(e){const{ctx:t,ballX:n,ballY:a,ballRadius:s,playerColor:i,ballIsGold:o,currentTime:l}=e,c=3,u=s*1.5,h=l*4;t.save();for(let g=0;g<c;g++){const y=(h+g*2.1)%(Math.PI*2),m=Math.sin(y)*.5+.5,x=u+m*s*3,b=(1-m)*.5;t.globalAlpha=b,t.strokeStyle=o?ke.resolveCssColor(Ht,t.canvas):i,t.lineWidth=2-m,t.beginPath(),t.arc(n,a,x,0,Math.PI*2),t.stroke()}t.globalAlpha=.8,t.shadowColor=o?ke.resolveCssColor(Ht,t.canvas):i,t.shadowBlur=16+Math.sin(l*8)*4,t.fillStyle=o?ke.resolveCssColor(Ro,t.canvas):i;const p=s*(.8+Math.sin(l*10)*.2);t.beginPath(),t.arc(n,a,p,0,Math.PI*2),t.fill();for(const g of e.visibleNotes){if(!g.isSung)continue;const y=(l*6+g.x*.01)%(Math.PI*2),m=.15+Math.sin(y)*.1;t.globalAlpha=m,t.fillStyle=g.isGold?ke.resolveCssColor(Ht,t.canvas):i,t.fillRect(g.x,g.y,g.w,g.h)}t.restore()}function Yu(e){const{ctx:t,ballX:n,ballY:a,ballRadius:s,playerColor:i,ballIsGold:o,currentTime:l}=e,c=20+Math.abs(Math.sin(l*3))*15,u=l*5%(Math.PI*2),h=-Math.abs(Math.sin(u))*c,p=a+h;t.save(),t.globalAlpha=.3,t.fillStyle=ke.resolveCssColor("var(--nice-overlay-50, rgba(0, 0, 0, 0.5))",t.canvas);const g=1-Math.abs(h)/(c+20);t.beginPath(),t.ellipse(n,a+s*.5,s*g*1.5,s*.3*g,0,0,Math.PI*2),t.fill(),t.restore(),t.save();const y=5;for(let b=0;b<y;b++){const f=(b+1)*.04,k=(l-f)*5%(Math.PI*2),v=a+-Math.abs(Math.sin(k))*c,w=.15*(1-b/y),R=s*(.6-b*.08);t.globalAlpha=w,t.fillStyle=i,t.beginPath(),t.arc(n-b*3,v,Math.max(2,R),0,Math.PI*2),t.fill()}t.restore(),t.save();const m=1+Math.abs(Math.sin(u))*.15,x=1/m;if(t.translate(n,p),t.scale(x,m),t.shadowColor=o?ke.resolveCssColor(Ht,t.canvas):i,t.shadowBlur=12,t.fillStyle=o?ke.resolveCssColor(Ro,t.canvas):i,t.beginPath(),t.arc(0,0,s,0,Math.PI*2),t.fill(),t.lineWidth=1.5,t.strokeStyle=ke.resolveCssColor("var(--nice-overlay-35, rgba(0, 0, 0, 0.35))",t.canvas),t.stroke(),t.restore(),Math.abs(Math.sin(u))<.1){t.save(),t.globalAlpha=.6,t.fillStyle=o?ke.resolveCssColor(Ht,t.canvas):i;for(let b=0;b<4;b++){const f=b/4*Math.PI*2+l,k=n+Math.cos(f)*(s+4),v=a+Math.sin(f)*2;t.beginPath(),t.arc(k,v,2,0,Math.PI*2),t.fill()}t.restore()}}function Zu(e,t){switch(e){case"wipe":return Hu(t),!0;case"pulse":return Ku(t),!0;case"bounce":return Yu(t),!0;case"ball":default:return!1}}const Xu=1e3,Qu=20,Ju=70,eh=5,Ls=26,_s="rgba(255,215,70,0.98)",zs=new Map,th=(e,t,n,a,s)=>{const i=`g${s}`,o=`<?xml version="1.0" encoding="UTF-8"?>
24
+ ${Y}
25
+ <rect x="0" y="${z}" width="${t}" height="${ee-z}" fill="url(#${f}g)" clip-path="url(#${f}c)"/>
26
+ <rect x="0" y="${_}" width="${t}" height="${K-_}" fill="url(#${f}h)" clip-path="url(#${f}c)"/>
27
+ </svg>`}function et(e,t){const n=t.match(/[MLHVCSQTAZmlhvcsqtaz][^MLHVCSQTAZmlhvcsqtaz]*/g);if(!n)return;let a=0,s=0;for(const i of n){const o=i[0],l=i.slice(1).trim().split(/[\s,]+/).filter(Boolean).map(Number);switch(o){case"M":a=l[0],s=l[1],e.moveTo(a,s);break;case"L":a=l[0],s=l[1],e.lineTo(a,s);break;case"H":a=l[0],e.lineTo(a,s);break;case"V":s=l[0],e.lineTo(a,s);break;case"C":e.bezierCurveTo(l[0],l[1],l[2],l[3],l[4],l[5]),a=l[4],s=l[5];break;case"Q":e.quadraticCurveTo(l[0],l[1],l[2],l[3]),a=l[2],s=l[3];break;case"S":{e.bezierCurveTo(a,s,l[0],l[1],l[2],l[3]),a=l[2],s=l[3];break}case"A":{const c=Math.abs(l[0]),u=Math.abs(l[1]),h=l[3]!==0,p=l[4]!==0,g=l[5],y=l[6],m=a,x=s;if(Math.abs(m-g)<.001&&Math.abs(x-y)<.001||c<.001||u<.001){e.lineTo(g,y),a=g,s=y;break}const b=(c+u)/2,f=(m-g)/2,j=(x-y)/2,v=f*f+j*j,C=v>b*b?Math.sqrt(v):b,N=C*C,M=Math.sqrt(Math.max(0,(N-v)/v)),k=h!==p?1:-1,T=(m+g)/2+k*M*j,E=(x+y)/2-k*M*f,A=Math.atan2(x-E,m-T),I=Math.atan2(y-E,g-T);e.arc(T,E,C,A,I,!p),a=g,s=y;break}case"Z":e.closePath();break}}}function Tn(e,t,n,a,s,i,o,l=70,c=55,u=0,h,p,g=!1,y,m){const[x,b,f]=Er($r(o)),j=i.L(s),v=i.R(s),C=a-j.w-v.w;if(C<0){const[w,,R]=Er($r(o));e.save(),e.translate(t,n),e.globalAlpha=1-u/100*.87,e.fillStyle=`hsl(${w},50%,${Math.min(R+10,80)}%)`;const S=Math.min(a/2,s/2);e.beginPath(),e.moveTo(S,0),e.lineTo(a-S,0),e.quadraticCurveTo(a,0,a,S),e.lineTo(a,s-S),e.quadraticCurveTo(a,s,a-S,s),e.lineTo(S,s),e.quadraticCurveTo(0,s,0,s-S),e.lineTo(0,S),e.quadraticCurveTo(0,0,S,0),e.closePath(),e.fill(),e.restore();return}const N=j.w,M=j.w+C;if(g){const w=`hsla(${x},${b}%,${f}%,0.22)`;e.save(),e.translate(t,n),e.fillStyle="rgba(255,255,255,0.18)",e.beginPath(),et(e,j.out),e.fill(),e.fillRect(N,0,C,s),e.beginPath(),et(e,dt(v.out,M)),e.fill(),e.fillStyle=w,e.beginPath(),et(e,j.inn),e.fill(),e.fillRect(N,Ze,C,s-2*Ze),e.beginPath(),et(e,dt(v.inn,M)),e.fill(),y&&(e.save(),e.beginPath(),et(e,j.inn),e.rect(N,Ze,C,s-2*Ze),et(e,dt(v.inn,M)),e.clip(),e.globalAlpha=.85,e.fillStyle=y,e.fillRect(0,0,a,s),e.globalAlpha=1,e.restore()),m&&(e.save(),e.beginPath(),et(e,j.inn),e.rect(N,Ze,C,s-2*Ze),et(e,dt(v.inn,M)),e.clip(),e.globalAlpha=.85,e.fillStyle=m,e.fillRect(0,0,a,s),e.globalAlpha=1,e.restore()),e.restore();return}const k=`hsl(${x},${Math.min(b+10,100)}%,${Math.max(f-22,4)}%)`,T=`hsl(${x},${b}%,${f}%)`,E=`hsl(${x},${Math.max(b-12,0)}%,${Math.min(f+18,88)}%)`,A=`hsl(${x},${Math.min(b+20,100)}%,${Math.min(f+30,93)}%)`,I=l/100*.78,L=c/100*.65,P=1-u/100*.87,_=Ze,ee=s-Ze,K=ee-_,z=_+K*.44,V=_+K*.58;e.save(),e.translate(t,n);const W=e.createLinearGradient(0,0,0,s);W.addColorStop(0,"rgba(255,255,255,0.55)"),W.addColorStop(.3,"rgba(255,255,255,0.35)"),W.addColorStop(1,"rgba(255, 255, 255, 0.08)"),e.fillStyle=W,e.beginPath(),et(e,j.out),e.fill(),e.fillRect(N,0,C,s),e.beginPath(),et(e,dt(v.out,M)),e.fill();const H=e.createLinearGradient(0,_,0,ee);H.addColorStop(0,E),H.addColorStop(.5,T),H.addColorStop(1,k),e.globalAlpha=P,e.fillStyle=H,e.beginPath(),et(e,j.inn),e.fill(),e.fillRect(N,Ze,C,s-2*Ze),e.beginPath(),et(e,dt(v.inn,M)),e.fill(),e.globalAlpha=1,y&&(e.save(),e.beginPath(),et(e,j.inn),e.rect(N,Ze,C,s-2*Ze),et(e,dt(v.inn,M)),e.clip(),e.globalAlpha=P*.9,e.fillStyle=y,e.fillRect(0,0,a,s),e.globalAlpha=1,e.restore()),m&&(e.save(),e.beginPath(),et(e,j.inn),e.rect(N,Ze,C,s-2*Ze),et(e,dt(v.inn,M)),e.clip(),e.globalAlpha=P*.85,e.fillStyle=m,e.fillRect(0,0,a,s),e.globalAlpha=1,e.restore()),e.save(),e.beginPath(),et(e,j.inn),e.rect(N,Ze,C,s-2*Ze),et(e,dt(v.inn,M)),e.clip();const G=e.createLinearGradient(0,V,0,ee);G.addColorStop(0,"transparent"),G.addColorStop(.6,A.replace(")",`, ${L*.6})`).replace("hsl","hsla")),G.addColorStop(1,A.replace(")",`, ${L})`).replace("hsl","hsla")),e.fillStyle=G,e.fillRect(0,V,a,ee-V);const Z=e.createLinearGradient(0,_,0,z);Z.addColorStop(0,`rgba(255,255,255,${I})`),Z.addColorStop(.5,`rgba(255,255,255,${I*.25})`),Z.addColorStop(1,"rgba(255,255,255,0)"),e.fillStyle=Z,e.fillRect(0,_,a,z-_),e.restore(),e.restore()}const Ht="var(--nice-warning, #FFD700)",Ro="var(--nice-warning-bg, #fff0a8)";function Hu(e){const{ctx:t,ballX:n,height:a,playerColor:s,currentTime:i}=e;t.save(),t.globalCompositeOperation="source-over";const o=t.createLinearGradient(Math.max(0,n-60),0,n,0);o.addColorStop(0,"transparent"),o.addColorStop(1,s),t.globalAlpha=.18,t.fillStyle=o,t.fillRect(Math.max(0,n-60),0,60,a),t.globalAlpha=.9,t.strokeStyle=s,t.lineWidth=3,t.shadowColor=s,t.shadowBlur=12,t.beginPath(),t.moveTo(n,0),t.lineTo(n,a),t.stroke();const l=6+Math.sin(i*6)*2;t.fillStyle=e.ballIsGold?ve.resolveCssColor(Ht,t.canvas):s,t.beginPath(),t.moveTo(n,e.ballY-l),t.lineTo(n+l*.7,e.ballY),t.lineTo(n,e.ballY+l),t.lineTo(n-l*.7,e.ballY),t.closePath(),t.fill(),t.restore(),t.save(),t.globalCompositeOperation="source-atop",t.globalAlpha=.35;for(const c of e.visibleNotes)c.isSung&&(t.fillStyle=c.isGold?ve.resolveCssColor(Ht,t.canvas):s,t.fillRect(c.x,c.y,c.w,c.h));t.restore()}function Ku(e){const{ctx:t,ballX:n,ballY:a,ballRadius:s,playerColor:i,ballIsGold:o,currentTime:l}=e,c=3,u=s*1.5,h=l*4;t.save();for(let g=0;g<c;g++){const y=(h+g*2.1)%(Math.PI*2),m=Math.sin(y)*.5+.5,x=u+m*s*3,b=(1-m)*.5;t.globalAlpha=b,t.strokeStyle=o?ve.resolveCssColor(Ht,t.canvas):i,t.lineWidth=2-m,t.beginPath(),t.arc(n,a,x,0,Math.PI*2),t.stroke()}t.globalAlpha=.8,t.shadowColor=o?ve.resolveCssColor(Ht,t.canvas):i,t.shadowBlur=16+Math.sin(l*8)*4,t.fillStyle=o?ve.resolveCssColor(Ro,t.canvas):i;const p=s*(.8+Math.sin(l*10)*.2);t.beginPath(),t.arc(n,a,p,0,Math.PI*2),t.fill();for(const g of e.visibleNotes){if(!g.isSung)continue;const y=(l*6+g.x*.01)%(Math.PI*2),m=.15+Math.sin(y)*.1;t.globalAlpha=m,t.fillStyle=g.isGold?ve.resolveCssColor(Ht,t.canvas):i,t.fillRect(g.x,g.y,g.w,g.h)}t.restore()}function Yu(e){const{ctx:t,ballX:n,ballY:a,ballRadius:s,playerColor:i,ballIsGold:o,currentTime:l}=e,c=20+Math.abs(Math.sin(l*3))*15,u=l*5%(Math.PI*2),h=-Math.abs(Math.sin(u))*c,p=a+h;t.save(),t.globalAlpha=.3,t.fillStyle=ve.resolveCssColor("var(--nice-overlay-50, rgba(0, 0, 0, 0.5))",t.canvas);const g=1-Math.abs(h)/(c+20);t.beginPath(),t.ellipse(n,a+s*.5,s*g*1.5,s*.3*g,0,0,Math.PI*2),t.fill(),t.restore(),t.save();const y=5;for(let b=0;b<y;b++){const f=(b+1)*.04,j=(l-f)*5%(Math.PI*2),v=a+-Math.abs(Math.sin(j))*c,C=.15*(1-b/y),N=s*(.6-b*.08);t.globalAlpha=C,t.fillStyle=i,t.beginPath(),t.arc(n-b*3,v,Math.max(2,N),0,Math.PI*2),t.fill()}t.restore(),t.save();const m=1+Math.abs(Math.sin(u))*.15,x=1/m;if(t.translate(n,p),t.scale(x,m),t.shadowColor=o?ve.resolveCssColor(Ht,t.canvas):i,t.shadowBlur=12,t.fillStyle=o?ve.resolveCssColor(Ro,t.canvas):i,t.beginPath(),t.arc(0,0,s,0,Math.PI*2),t.fill(),t.lineWidth=1.5,t.strokeStyle=ve.resolveCssColor("var(--nice-overlay-35, rgba(0, 0, 0, 0.35))",t.canvas),t.stroke(),t.restore(),Math.abs(Math.sin(u))<.1){t.save(),t.globalAlpha=.6,t.fillStyle=o?ve.resolveCssColor(Ht,t.canvas):i;for(let b=0;b<4;b++){const f=b/4*Math.PI*2+l,j=n+Math.cos(f)*(s+4),v=a+Math.sin(f)*2;t.beginPath(),t.arc(j,v,2,0,Math.PI*2),t.fill()}t.restore()}}function Zu(e,t){switch(e){case"wipe":return Hu(t),!0;case"pulse":return Ku(t),!0;case"bounce":return Yu(t),!0;case"ball":default:return!1}}const Xu=1e3,Qu=20,Ju=70,eh=5,Ls=26,_s="rgba(255,215,70,0.98)",Ds=new Map,th=(e,t,n,a,s)=>{const i=`g${s}`,o=`<?xml version="1.0" encoding="UTF-8"?>
28
28
  <svg xmlns='http://www.w3.org/2000/svg' width='${a}' height='${a}' viewBox='0 0 ${a} ${a}'>
29
29
  <defs>
30
30
  <radialGradient id='g${i}' cx='50%' cy='40%' r='60%'>
@@ -36,17 +36,17 @@ ${H}
36
36
  <g transform='translate(${a/2}, ${a/2})'>
37
37
  <circle cx='0' cy='0' r='${a*.45}' fill='url(#g${i})' />
38
38
  </g>
39
- </svg>`;return`data:image/svg+xml;utf8,${encodeURIComponent(o)}`},nh=(e,t,n,a,s)=>{const i=`${e}-${t}-${n}-${Math.round(a)}-${s}`;let o=zs.get(i);return o||(o=new Image,o.src=th(e,t,n,a,s),zs.set(i,o),o)},rh=e=>{const t=e.replace("#",""),n=parseInt(t.length===3?t[0]+t[0]:t.substring(0,2),16)/255,a=parseInt(t.length===3?t[1]+t[1]:t.substring(2,4),16)/255,s=parseInt(t.length===3?t[2]+t[2]:t.substring(4,6),16)/255,i=Math.max(n,a,s),o=Math.min(n,a,s);let l=0,c=0;const u=(i+o)/2;if(i!==o){const h=i-o;switch(c=u>.5?h/(2-i-o):h/(i+o),i){case n:l=(a-s)/h+(a<s?6:0);break;case a:l=(s-n)/h+2;break;case s:l=(n-a)/h+4;break}l/=6}return{h:Math.round(l*360),s:Math.round(c*100),l:Math.round(u*100)}},ah=(e,t,n,a=1)=>`hsla(${Math.round(e)}, ${Math.round(t)}%, ${Math.round(n)}%, ${a})`;function Qn(e){try{const t=ke.resolveCssColor(e),[n,a,s]=Bc(t),i=o=>o.toString(16).padStart(2,"0");return`#${i(n)}${i(a)}${i(s)}`.toLowerCase()}catch{return"var(--nice-warning, #ffcc00)"}}function sh(e,t,n,a,s,i){const o=Math.min(i,a/2,s/2);e.beginPath(),e.moveTo(t+o,n),e.lineTo(t+a-o,n),e.quadraticCurveTo(t+a,n,t+a,n+o),e.lineTo(t+a,n+s-o),e.quadraticCurveTo(t+a,n+s,t+a-o,n+s),e.lineTo(t+o,n+s),e.quadraticCurveTo(t,n+s,t,n+s-o),e.lineTo(t,n+o),e.quadraticCurveTo(t,n,t+o,n),e.closePath()}const cn=new Map,Pn=new Set,fr=new Set;function qa(e){const t=cn.get(e);return t?Promise.resolve(t):fr.has(e)?Promise.reject(new Error(`Texture failed: ${e}`)):Pn.has(e)?new Promise((n,a)=>{const s=()=>{cn.has(e)?n(cn.get(e)):fr.has(e)?a(new Error(`Texture failed: ${e}`)):requestAnimationFrame(s)};s()}):(Pn.add(e),new Promise((n,a)=>{const s=new Image;s.crossOrigin="anonymous",s.onload=()=>{cn.set(e,s),Pn.delete(e),n(s)},s.onerror=()=>{Pn.delete(e),fr.add(e),a(new Error(`Failed to load texture: ${e}`))},s.src=e}))}function ih(e){return cn.get(e)??null}function En(e,t,n=1){const a=cn.get(t);if(!a)return!Pn.has(t)&&!fr.has(t)&&qa(t).catch(()=>{}),null;const s=e.createPattern(a,"repeat");if(!s)return null;if(n!==1){const i=new DOMMatrix;i.scaleSelf(n,n),s.setTransform(i)}return s}function oh(e){for(const t of e)t&&qa(t).catch(()=>{})}const $n=new Map,sn=new Set;function No(e,t,n){return`${e}|${t}|${n??""}`}function lh(e,t,n){const a=No(e.name,t,n),s=$n.get(a);if(s)return Promise.resolve(s);if(sn.has(a))return new Promise((m,x)=>{const b=()=>{$n.has(a)?m($n.get(a)):sn.has(a)?requestAnimationFrame(b):x(new Error(`Pattern render failed: ${a}`))};b()});sn.add(a);const i="p",o=e.mk(i,t,n??void 0),l=o.match(/width="(\d+)"/),c=o.match(/height="(\d+)"/),u=l?parseInt(l[1],10):16,h=c?parseInt(c[1],10):16,p=`<svg xmlns="http://www.w3.org/2000/svg" width="${u}" height="${h}"><defs>${o}</defs><rect width="${u}" height="${h}" fill="url(#${i})"/></svg>`,g=new Blob([p],{type:"image/svg+xml;charset=utf-8"}),y=URL.createObjectURL(g);return new Promise((m,x)=>{const b=new Image;b.onload=()=>{$n.set(a,b),sn.delete(a),URL.revokeObjectURL(y),m(b)},b.onerror=()=>{sn.delete(a),URL.revokeObjectURL(y),x(new Error(`Failed to render pattern tile: ${e.name}`))},b.src=y})}function An(e,t,n,a){const s=No(t.name,n,a),i=$n.get(s);return i?e.createPattern(i,"repeat"):(sn.has(s)||lh(t,n,a).catch(()=>{}),null)}let Mt=null,nt=null,pt=null,Et=null,bt=null,Ue=null,Ds="",Fs=0,Os="";const ma=(e,t,n,a,s,i,o,l,c,u,h,p,g,y,m,x,b,f,k,v,w,R,M,j)=>{e.clearRect(0,0,t,n);const T=j??null,P=(T==null?void 0:T.filledBar)??Gt,A=(T==null?void 0:T.emptyBar)??Dr,I=(T==null?void 0:T.goldFilledBar)??Or,L=(T==null?void 0:T.goldEmptyBar)??Fr,N=(T==null?void 0:T.font)??Br,_=Rn(P.capStyleName),ee=Rn(A.capStyleName),Y=Rn(I.capStyleName),O=Rn(L.capStyleName),U=P.patternName?Nn(P.patternName):null,V=A.patternName?Nn(A.patternName):null,K=I.patternName?Nn(I.patternName):null,G=L.patternName?Nn(L.patternName):null,W=U?An(e,U,P.patternColor??P.color??"var(--nice-bg, #fff)",P.patternColor):null,C=V?An(e,V,A.patternColor??A.color??"var(--nice-border, #d1d5db)",A.patternColor):null,$=K?An(e,K,I.patternColor??"var(--nice-warning, #FFD700)",I.patternColor):null,S=G?An(e,G,L.patternColor??"var(--nice-warning, #FFD700)",L.patternColor):null;Os!==i&&(Os=i,ha("RENDER",`Renderer using settings for "${i}" — filled: cap=${P.capStyleName}, glass=${P.glass} | empty: cap=${A.capStyleName}, glass=${A.glass} | goldFilled: cap=${I.capStyleName}, pattern=${I.patternName??"none"} | goldEmpty: cap=${L.capStyleName}, pattern=${L.patternName??"none"} | hasSettings=${!!T}`,{filledBar:P,emptyBar:A,goldFilledBar:I,goldEmptyBar:L,filledOverlay:!!W,emptyOverlay:!!C,goldFilledOverlay:!!$,goldEmptyOverlay:!!S}));const B=P.textureUrl?En(e,P.textureUrl,P.textureScale):null,H=A.textureUrl?En(e,A.textureUrl,A.textureScale):null,z=I.textureUrl?En(e,I.textureUrl,I.textureScale):null,Z=L.textureUrl?En(e,L.textureUrl,L.textureScale):null,E=typeof document<"u"?ke.resolveCssColor(l||"var(--nice-color-accent, #ffcc00)"):l||"var(--nice-color-accent, #ffcc00)",q=Qn(E||"var(--nice-warning, #ffcc00)"),X=Se=>ke.resolveCssColor(Se),re=N.fontFamily||"Arial",oe=N.fontSize||18,se=X(N.fontColor||"var(--btn-text, #fff)"),D=N.outlineColor?X(N.outlineColor):null,J=typeof N.outlineWidth=="number"?N.outlineWidth:0,ae=N.shadow||null;typeof document<"u"&&((!Mt||Mt.width!==t||Mt.height!==n)&&(Mt=document.createElement("canvas"),Mt.width=t,Mt.height=n,nt=Mt.getContext("2d")),nt&&nt.clearRect(0,0,t,n),(!pt||pt.width!==t||pt.height!==n)&&(pt=document.createElement("canvas"),pt.width=t,pt.height=n,Et=pt.getContext("2d")),Et&&Et.clearRect(0,0,t,n),(!bt||bt.width!==t||bt.height!==n)&&(bt=document.createElement("canvas"),bt.width=t,bt.height=n,Ue=bt.getContext("2d")),Ue&&Ue.clearRect(0,0,t,n));const ce=k?-k:0,le=v||t;e.fillStyle=E,e.font=`bold ${oe}px ${re}`;const pe=e.measureText(i).width+20;if(e.fillRect(ce+10,5,pe,25),e.save(),e.fillStyle=se,ae){const Se=ae.match(/(-?\d+)px\s+(-?\d+)px\s+(\d+)px\s+(#[0-9a-fA-F]{3,8}|rgba?\([^)]+\)|[a-zA-Z]+)/);Se&&(e.shadowOffsetX=parseInt(Se[1],10),e.shadowOffsetY=parseInt(Se[2],10),e.shadowBlur=parseInt(Se[3],10),e.shadowColor=Se[4])}if(e.fillText(i,ce+20,22),D&&J>0&&(e.lineWidth=J,e.strokeStyle=D,e.strokeText(i,ce+20,22)),e.restore(),b){const Se=X(f||"var(--nice-text-secondary, #6b7280)");e.font=`bold 12px ${re}`;const Ce=e.measureText(b).width,We=8,ze=ce+10+pe+6,$e=20,Pe=7,de=Ce+We*2,ge=4;e.beginPath(),e.moveTo(ze+ge,Pe),e.lineTo(ze+de-ge,Pe),e.quadraticCurveTo(ze+de,Pe,ze+de,Pe+ge),e.lineTo(ze+de,Pe+$e-ge),e.quadraticCurveTo(ze+de,Pe+$e,ze+de-ge,Pe+$e),e.lineTo(ze+ge,Pe+$e),e.quadraticCurveTo(ze,Pe+$e,ze,Pe+$e-ge),e.lineTo(ze,Pe+ge),e.quadraticCurveTo(ze,Pe,ze+ge,Pe),e.closePath(),e.fillStyle=Se,e.fill(),e.fillStyle=se,e.fillText(b,ze+We,Pe+14),e.font=`bold ${oe}px ${re}`}const fe=120;if(e.fillStyle=E,e.fillRect(ce+le-fe-10,5,fe,25),e.fillStyle=se,e.fillText(`${o} pts`,ce+le-fe+15,22),w&&w.currentCombo>=5){const Se=w.currentCombo>=50?"3x":w.currentCombo>=30?"2.5x":w.currentCombo>=20?"2x":w.currentCombo>=10?"1.5x":"",Ce=`${w.currentCombo} combo${Se?" "+Se:""}`;e.font=`bold 12px ${re}`;const ze=e.measureText(Ce).width+16,$e=ce+le-fe-10-ze-6;e.fillStyle=X(w.currentCombo>=20?"var(--nice-color-success, #FFD700)":"var(--nice-color-warning, #ff9800)"),e.globalAlpha=.9,sh(e,$e,7,ze,21,4),e.fill(),e.globalAlpha=1,e.fillStyle=X(w.currentCombo>=20?"var(--nice-text-primary, #000)":"var(--btn-text, #fff)"),e.fillText(Ce,$e+8,22),e.font=`bold 14px ${re}`}if(R&&R.length>0){const Se=R[R.length-1];if(Se.label){const Ce=`${R.length}-${Se.label}`;Ce!==Ds&&(Ds=Ce,Fs=Date.now());const We=Date.now()-Fs;if(We<2500){const ze=We<2e3?1:1-(We-2e3)/500,$e={Perfect:X("var(--nice-color-success, #00e676)"),Great:X("var(--nice-color-success, #66bb6a)"),Good:X("var(--nice-color-accent, #ffeb3b)"),OK:X("var(--nice-color-warning, #ff9800)"),Bad:X("var(--nice-color-error, #ef5350)"),Awful:X("var(--nice-color-error, #b71c1c)")};e.save(),e.globalAlpha=ze,e.font=`bold ${Math.round(oe*1.2)}px ${re}`;const Pe=Se.label,de=e.measureText(Pe).width,ge=ce+le/2-de/2;e.fillStyle=$e[Pe]||se,e.shadowColor=ke.resolveCssColor("var(--nice-overlay-50, rgba(0, 0, 0, 0.5))",e.canvas),e.shadowBlur=6,e.fillText(Pe,ge,58),D&&J>0&&(e.lineWidth=J,e.strokeStyle=D,e.strokeText(Pe,ge,58)),e.restore()}}}const me=s-2,he=s+5,we=40;let je=1/0,Ne=-1/0;if(a.forEach(Se=>{Se.forEach(Ce=>{Ce.pitch<je&&(je=Ce.pitch),Ce.pitch>Ne&&(Ne=Ce.pitch)})}),c&&Array.isArray(c)&&c.length>0){let Se=null;isFinite(je)&&isFinite(Ne)&&(Se=Math.round((je+Ne)/2));let Ce=1/0,We=-1/0;c.forEach(({t:ze,hz:$e})=>{if(!$e||$e<=0)return;let Pe=Se;for(const ge of a)for(const Ae of ge)ze>=Ae.startTime&&ze<=Ae.startTime+Ae.duration&&(Pe=Ae.pitch);const de=mo($e,Pe);de<Ce&&(Ce=de),de>We&&(We=de)}),Ce!==1/0&&We!==-1/0&&(Ce<je&&(je=Math.floor(Ce-2)),We>Ne&&(Ne=Math.ceil(We+2)))}(!isFinite(je)||!isFinite(Ne))&&(je=40,Ne=80),je===Ne&&(je=Math.max(0,je-6),Ne=Ne+6);const Ee=Se=>{const Ce=n-we-10;return we+Ce-(Se-je)/(Ne-je)*Ce},ue=zr(g||"normal"),Oe=(n-we-10)/Math.max(1,Ne-je),Me=Math.max(10,Math.round(Oe*(1+2*ue.semitoneTolerance)*.3)),Ie=Math.max(5,Math.round(Me*.45));((Se,Ce,We,ze,$e,Pe)=>{Se.lineWidth=1;for(let de=Math.ceil($e);de<=Math.floor(Pe);de++){const ge=Ee(de);Se.strokeStyle=X(de%2===0?"var(--guide-line-strong, rgba(255, 255, 255, 0.12))":"var(--guide-line-weak, rgba(255, 255, 255, 0.06))"),Se.beginPath(),Se.moveTo(0,Math.round(ge)+.5),Se.lineTo(Ce,Math.round(ge)+.5),Se.stroke()}})(e,t,n-we,we,je,Ne),Et&&Et.clearRect(0,0,t,n);const Be=(s-me)/(he-me)*t;let He=n*.5,Lt=!1,ct=!1;const ht=(Se,Ce,We,ze,$e,Pe,de=0)=>{const ge=(Te,_e,ve,Re,Le,Ge)=>{const De=Math.min(Ge,Re/2,Le/2);Te.beginPath(),Te.moveTo(_e+De,ve),Te.lineTo(_e+Re-De,ve),Te.quadraticCurveTo(_e+Re,ve,_e+Re,ve+De),Te.lineTo(_e+Re,ve+Le-De),Te.quadraticCurveTo(_e+Re,ve+Le,_e+Re-De,ve+Le),Te.lineTo(_e+De,ve+Le),Te.quadraticCurveTo(_e,ve+Le,_e,ve+Le-De),Te.lineTo(_e,ve+De),Te.quadraticCurveTo(_e,ve,_e+De,ve),Te.closePath()},Ae=Math.max(2,Me/2);ze.forEach(Te=>{if(Te.startTime+Te.duration<$e||Te.startTime>Pe)return;const _e=(Te.startTime-$e)/(Pe-$e)*Ce,ve=Te.duration/(Pe-$e)*Ce,Re=Ee(Te.pitch)-Me/2,Le=[];if(Array.isArray(p)){const Ge=Te.startTime+Te.duration;p.forEach(De=>{if(De.pitch!==Te.pitch||De.noteStart!=null&&De.noteEnd!=null&&(Math.abs(De.noteStart-Te.startTime)>.01||Math.abs(De.noteEnd-Ge)>.01))return;const tt=Math.max(De.start,Te.startTime),Ke=Math.min(De.end,Ge);if(tt>=Ke)return;const Wt=(tt-$e)/(Pe-$e)*Ce,Qt=(Ke-$e)/(Pe-$e)*Ce;Le.push({x1:Wt,x2:Qt,frac:De.frac})})}if(Te.isGold){Se.save();const Ge=m&&m.shadowColor?m.shadowColor:_s,De=m&&typeof m.glowBlur=="number"?m.glowBlur:Ls;Se.shadowColor=Ge,Se.shadowBlur=Math.max(4,De-12),Se.fillStyle=X("var(--gold-overlay, rgba(255, 215, 0, 0.15))"),ge(Se,_e-1,Re-1,ve+2,Me+2,Ae),Se.fill(),Se.restore();const tt=Qn("var(--gold-base, #b4af9f)");Tn(Se,_e,Re,ve,Me,O,L.color??tt,L.highlight,L.glow,L.glass,G,L.patternColor,L.patternOnly,Z,S),Se.save(),ge(Se,_e,Re,ve,Me,Ae),Se.clip(),Se.globalAlpha=.18,Se.fillStyle=X("var(--nice-color-success, #FFD700)"),Se.fillRect(_e,Re,ve,Math.max(1,Me*.25)),Se.globalAlpha=1,Se.restore(),Le.length>0&&(Se.save(),ge(Se,_e,Re,ve,Me,Ae),Se.clip(),Le.forEach(Ke=>{const Wt=Math.max(1,Ke.x2-Ke.x1);Tn(Se,Ke.x1,Re,Wt,Me,Y,I.color??"var(--nice-warning, #FFD700)",I.highlight,I.glow,I.glass,K,I.patternColor,I.patternOnly,z,$)}),Se.restore()),Le.length===0&&(Se.lineWidth=1,Se.strokeStyle=X("var(--gold-outline, rgba(255, 215, 0, 0.35))"),ge(Se,_e+.5,Re+.5,ve-1,Math.max(1,Me-1),Ae),Se.stroke())}else{const Ge=Qn("var(--note-base, #d1d5db)");Tn(Se,_e,Re,ve,Me,ee,A.color??Ge,A.highlight,A.glow,A.glass,V,A.patternColor,A.patternOnly,H,C),Le.length>0&&(Se.save(),ge(Se,_e,Re,ve,Me,Ae),Se.clip(),Le.forEach(De=>{const tt=Math.max(1,De.x2-De.x1);Tn(Se,De.x1,Re,tt,Me,_,P.color??q,P.highlight,P.glow,P.glass,U,P.patternColor,P.patternOnly,B,W)}),Se.restore())}Et&&(Et.fillStyle=ke.resolveCssColor("var(--nice-bg, #fff)",Et.canvas),Et.fillRect(_e,Re,ve,Me))})};if(a.forEach(Se=>{ht(e,t,n-we,Se,me,he,we);for(const Ce of Se)if(s>=Ce.startTime&&s<=Ce.startTime+Ce.duration){He=Ee(Ce.pitch),Lt=!0,ct=!!Ce.isGold;break}}),!Lt){let Se=null,Ce=null;for(const We of a)for(const ze of We)ze.startTime>s&&(!Se||ze.startTime<Se.startTime)&&(Se=ze),ze.startTime<=s&&(!Ce||ze.startTime>Ce.startTime)&&(Ce=ze);Se?(He=Ee(Se.pitch),ct=!!Se.isGold):Ce?(He=Ee(Ce.pitch),ct=!!Ce.isGold):He=n*.5}const it=E||X("var(--nice-color-accent, #ffcc00)"),wt=1+Math.sin((s||0)*8)*.06,Je=Ie*wt,Pt=[];for(const Se of a)for(const Ce of Se){if(Ce.startTime+Ce.duration<me||Ce.startTime>he)continue;const We=(Ce.startTime-me)/(he-me)*t,ze=Ce.duration/(he-me)*t,$e=Ee(Ce.pitch)-Me/2,Pe=Ce.startTime+Ce.duration<=s;Pt.push({x:We,y:$e,w:ze,h:Me,isGold:Ce.isGold,isSung:Pe})}if(!Zu(M||"ball",{ctx:e,ballX:Be,ballY:He,ballRadius:Je,playerColor:it,ballIsGold:ct,currentTime:s,height:n,visibleNotes:Pt})){Mt&&e.drawImage(Mt,0,0),bt&&e.drawImage(bt,0,0),e.save(),e.globalCompositeOperation="source-over",e.globalAlpha=.28;const Se=Math.max(18,Je*5),Ce=e.createRadialGradient(Be,He,0,Be,He,Se);if(Ce.addColorStop(0,it),Ce.addColorStop(1,"transparent"),e.fillStyle=Ce,e.beginPath(),e.arc(Be,He,Se,0,Math.PI*2),e.fill(),e.restore(),y&&nt&&pt&&(nt.save(),nt.globalCompositeOperation="source-over",nt.globalAlpha=.95,nt.fillStyle=it,nt.beginPath(),nt.arc(Be,He,Je+4,0,Math.PI*2),nt.fill(),nt.restore(),nt.save(),nt.globalCompositeOperation="destination-in",nt.drawImage(pt,0,0),nt.restore(),e.drawImage(Mt,0,0)),y&&Ue&&pt)try{const $e=Qn(it),{h:Pe,s:de,l:ge}=rh($e),Te=ah(Pe,Math.max(10,Math.round(de*(typeof h=="number"?h:.25))),ge,.85);Ue.save(),Ue.globalCompositeOperation="multiply",Ue.globalAlpha=.65,Ue.fillStyle=Te,Ue.beginPath(),Ue.arc(Be,He,Math.max(8,Je+6),0,Math.PI*2),Ue.fill(),Ue.restore(),Ue.save(),Ue.globalCompositeOperation="destination-out",Ue.drawImage(pt,0,0),Ue.restore(),e.drawImage(bt,0,0)}catch{Ue.save(),Ue.globalCompositeOperation="source-over",Ue.globalAlpha=.6,Ue.fillStyle=it,Ue.beginPath(),Ue.arc(Be,He,Math.max(8,Je+6),0,Math.PI*2),Ue.fill(),Ue.restore(),Ue.save(),Ue.globalCompositeOperation="destination-out",Ue.drawImage(pt,0,0),Ue.restore(),e.drawImage(bt,0,0)}const We=m&&m.shadowColor?m.shadowColor:_s,ze=m&&typeof m.glowBlur=="number"?m.glowBlur:Ls;e.save(),ct?(e.shadowColor=We,e.shadowBlur=ze,e.fillStyle=X("var(--gold-light, #FFF0A8)")):(e.shadowColor=it,e.shadowBlur=10,e.fillStyle=it),e.globalCompositeOperation="source-over",e.globalAlpha=1,e.beginPath(),e.arc(Be,He,Je,0,Math.PI*2),e.fill(),e.lineWidth=1.5,e.strokeStyle=X("var(--nice-shadow-md, rgba(0,0,0,0.35))"),e.stroke(),e.restore()}try{if(Array.isArray(x)&&x.length>0){const Se=Date.now(),Ce=m&&typeof m.lifeMs=="number"?m.lifeMs:Xu,We=($e,Pe,de,ge=5)=>{const Ae=de,Te=de*.45;e.beginPath();let _e=Math.PI/2*3,ve=$e,Re=Pe;const Le=Math.PI/ge;e.moveTo($e,Pe-Ae);for(let Ge=0;Ge<ge;Ge++)ve=$e+Math.cos(_e)*Ae,Re=Pe+Math.sin(_e)*Ae,e.lineTo(ve,Re),_e+=Le,ve=$e+Math.cos(_e)*Te,Re=Pe+Math.sin(_e)*Te,e.lineTo(ve,Re),_e+=Le;e.lineTo($e,Pe-Ae),e.closePath()},ze=$e=>{let Pe=$e>>>0;return()=>(Pe=Pe*1664525+1013904223>>>0,(Pe&2147483647)/2147483647)};x.forEach($e=>{const Pe=Se-$e.createdAt;if(Pe<0||Pe>Ce)return;const de=Pe/Ce,ge=($e.noteStart-(s-2))/7*t,Ae=Ee($e.notePitch),Te=ze($e.seed||Math.floor($e.createdAt%1e5)),_e=m&&typeof m.count=="number"?m.count:Qu,ve=m&&typeof m.baseSpeed=="number"?m.baseSpeed:Ju,Re=m&&typeof m.baseSize=="number"?m.baseSize:eh;for(let Le=0;Le<_e;Le++){const Ge=Te(),De=Te(),tt=Le/_e*Math.PI*2+Ge*Math.PI*.6+de*1.5,Ke=6+ve*(1-de)*(.5+De*.8),Wt=ge+Math.cos(tt)*Ke,Qt=Ae+Math.sin(tt)*Ke*(.8+Ge*.6),Ct=Math.max(1,Re*(1-de)*(.5+De)),fs=40+Math.round(20*Te()),ms=70+Math.round(20*Te()),Ur=Math.max(0,1-de)*(.9-Te()*.3),Ec=Math.max(6,Ct*2.6),qr=nh(fs,ms,60,Math.round(Ec),($e.seed||0)+Le);qr&&qr.complete?(e.save(),e.translate(Wt,Qt+4),e.rotate(tt+de*4+(Te()-.5)*1.2),e.globalAlpha=Ur,e.drawImage(qr,-Ct/2,-Ct/2,Ct,Ct),e.restore()):(e.save(),e.translate(Wt,Qt+4),e.rotate(tt+de*4),e.fillStyle=`hsla(${fs}, ${ms}%, 60%, ${Ur})`,e.fillRect(-Ct/2,-Ct/2,Ct,Ct),e.restore()),Te()>.85&&(e.save(),e.globalAlpha=Math.max(.35,1-de),e.fillStyle=`hsla(${30+Math.round(10*Te())}, ${60+Math.round(30*Te())}%, ${70+Math.round(10*Te())}%, ${Ur})`,e.strokeStyle=`rgba(0,0,0,${.12*(1-de)})`,e.lineWidth=.8,We(Wt,Qt+4,Ct*(1.4+Te())),e.fill(),e.stroke(),e.restore())}})}}catch{}return{ballX:Be,ballY:He,ballIsGold:ct}},To=({song:e,currentTime:t,playerRef:n,config:a={},userPitch:s,segmentScores:i,goldBursts:o,combo:l,verseRatings:c})=>{const{t:u}=xe(),{isPlaying:h=!1,playerName:p=u("karaokeTimeline.defaultPlayer","Player"),score:g=1e4,playerBgColor:y="var(--karaoke-player-bg, #2196f3)",playerCount:m=2,gapDesaturation:x,goldSettings:b,difficultyLevel:f,algorithmLabel:k,algorithmColor:v,latencyMs:w=null,top:R,animationMode:M,karaokeSettings:j=null}=a,T=d.useRef(null),P=d.useRef(null),[A,I]=d.useState({width:600,height:150,top:250,visibleWidth:600}),[L,N]=d.useState(0),_=d.useRef(0),ee=d.useRef(null),Y=d.useRef(null),O=d.useRef(null),U=d.useRef(t),V=d.useRef(performance.now()),K=d.useRef(e),G=d.useRef(A),W=d.useRef(s),C=d.useRef(h),$=d.useRef(0),S=d.useRef(!1),B=d.useRef(null),H=d.useRef(null),z=d.useCallback(()=>{const Z=(e==null?void 0:e.id)??null;if(Z!==H.current||!B.current){H.current=Z;const E=e.notes.map(D=>D.noteLine);B.current=Hn(E,e.bpm??void 0);const q=B.current.reduce((D,J)=>D+J.length,0),X=B.current.reduce((D,J)=>D+J.filter(ae=>ae.isGold).length,0),re=B.current.flat().map(D=>D.pitch),oe=re.length?Math.min(...re):0,se=re.length?Math.max(...re):0;ha("BARS",`Parsed notes for "${e.title}" — ${B.current.length} verses, ${q} notes (including ${X} golden), pitch range: ${oe}–${se}, BPM: ${e.bpm??"?"}, GAP: ${e.gap??0}ms`,{rawLinesCount:E.length,verseCount:B.current.length,totalNotes:q,goldCount:X,minPitch:oe,maxPitch:se})}return B.current},[e]);return d.useEffect(()=>{const Z=(q,X,re)=>q+(X-q)*re,E=q=>{Y.current===null&&(Y.current=q);const X=Math.min(.1,(q-(Y.current||q))/1e3);Y.current=q;const re=$.current,oe=_.current,se=1-Math.exp(-12*X),D=Math.abs(oe-re)<.25?oe:Z(re,oe,se);Math.abs(D-re)>1e-4&&(N(D),$.current=D,T.current&&(T.current.style.transform=`translateX(${D}px)`)),ee.current=requestAnimationFrame(E)};return ee.current=requestAnimationFrame(E),()=>{ee.current&&cancelAnimationFrame(ee.current),ee.current=null,Y.current=null}},[]),d.useEffect(()=>{const Z=()=>{if(!n.current)return;const E=n.current.getBoundingClientRect(),q=2/Math.max(1,m),X=Math.round(E.width*q),re=Math.round(E.width),oe=X*(150/600);I({width:X,height:oe,top:30,visibleWidth:re})};return Z(),window.addEventListener("resize",Z),()=>window.removeEventListener("resize",Z)},[n,m]),d.useEffect(()=>{var re;if(h||!T.current)return;const Z=T.current.getContext("2d");if(!Z)return;const E=z(),q=t-(e.gap??0)/1e3,X=ma(Z,A.width,A.height,E,q,p,g,y,s,e.id,x??void 0,i,f??void 0,h,b??void 0,o,k,v,$.current,A.visibleWidth,l,c,M,j);if(X&&T.current){const oe=A.visibleWidth||(((re=P.current)==null?void 0:re.getBoundingClientRect().width)??A.width),se=A.width;let D=Math.round(oe/2-X.ballX);const J=oe-se;D=Math.max(J,Math.min(0,D)),_.current=D}},[t,e,z,A,s,h,p,g,y,x,i,f,b,o,k,v,l,c,M,j]),d.useEffect(()=>{U.current=t,V.current=performance.now()},[t]),d.useEffect(()=>{K.current=e},[e]),d.useEffect(()=>{G.current=A},[A]),d.useEffect(()=>{W.current=s},[s]),d.useEffect(()=>{C.current=h},[h]),d.useEffect(()=>{const Z=()=>{var ce;const E=T.current,q=K.current,X=G.current;if(!E||!q||!X)return;const re=E.getContext("2d");if(!re)return;const oe=z(),se=Math.min(.5,(performance.now()-V.current)/1e3),J=(C.current?U.current+se:U.current)-(q.gap??0)/1e3,ae=ma(re,X.width,X.height,oe,J,p,g,y,W.current,q.id,x??void 0,i,f??void 0,C.current,b??void 0,o,k,v,$.current,X.visibleWidth,l,c,M,j);if(ae){const le=X.visibleWidth||(((ce=P.current)==null?void 0:ce.getBoundingClientRect().width)??X.width),ne=X.width;let pe=Math.round(le/2-ae.ballX);const fe=le-ne;pe=Math.max(fe,Math.min(0,pe)),_.current=pe}};if(h){S.current||(S.current=!0,ha("BARS",`Drawing bars in RAF loop — canvas: ${G.current.width}×${G.current.height}px, player: ${p}`,{canvasSize:G.current}));const E=()=>{Z(),O.current=requestAnimationFrame(E)};return O.current=requestAnimationFrame(E),()=>{O.current&&cancelAnimationFrame(O.current),O.current=null}}S.current=!1},[h,p,g,y,x,i,f,b,o,k,v,l,c,M,j,z]),r.jsxs("div",{ref:P,style:{position:"absolute",left:"50%",top:`${R??A.top}px`,transform:"translateX(-50%)",zIndex:10,pointerEvents:"none",background:"transparent",width:A.visibleWidth,height:A.height,overflow:"hidden"},children:[r.jsx("style",{children:"@keyframes av-latency-pulse {0% { transform: scale(1); box-shadow: 0 4px 10px var(--nice-overlay-20, rgba(0, 0, 0, 0.2));} 50% { transform: scale(1.08); box-shadow: 0 8px 18px var(--nice-overlay-30, rgba(0,0,0,0.32));} 100% { transform: scale(1); box-shadow: 0 4px 10px var(--nice-overlay-20, rgba(0, 0, 0, 0.2));} } .av-latency-pulse { animation: av-latency-pulse 1s ease-in-out infinite; }"}),r.jsx("div",{style:{position:"absolute",right:8,top:6,zIndex:40,pointerEvents:"none",display:"flex",alignItems:"center",gap:8,fontSize:12,color:"var(--nice-text-inverse, #fff)"},children:typeof w<"u"&&w!==null?(()=>{const Z=w,E=Z<=120?"var(--latency-good, #10b981)":Z<=250?"var(--latency-warn, #f59e0b)":"var(--latency-bad, #ef4444)",q=`${Z}ms`;return r.jsxs("div",{className:Z>250?"av-latency-pulse":"",style:{background:E,padding:"6px 10px",borderRadius:12,boxShadow:"0 4px 10px var(--nice-overlay-35, rgba(0, 0, 0, 0.35))",fontWeight:700,minWidth:56,textAlign:"center",display:"flex",alignItems:"center",gap:6},children:[r.jsx(F.NtdStopwatch,{size:12}),r.jsx("span",{children:q})]})})():r.jsx("div",{style:{background:"var(--latency-none-bg, rgba(75,85,99,0.9))",padding:"6px 8px",borderRadius:12,boxShadow:"0 4px 10px var(--nice-overlay-35, rgba(0, 0, 0, 0.35))",minWidth:44,textAlign:"center"},children:"—"})}),r.jsx("canvas",{ref:T,width:A.width,height:A.height,role:"img","aria-label":u("karaokeTimeline.pitchTimelineFor","Pitch timeline for {player}. Score: {score}").replace("{player}",p).replace("{score}",String(g??0)),style:{position:"absolute",left:0,top:0,transform:`translateX(${L}px)`,willChange:"transform"}})]})},Po="/textures/seamless/256x256";function $t(e,t,n){return{name:e,icon:n,entries:Array.from({length:t},(a,s)=>{const i=String(s+1).padStart(2,"0");return{label:`${e} ${i}`,url:`${Po}/${e}/Photoreal_${e}_${i}-512x512.png`}})}}function _t(e,t,n){return{name:e,icon:n,entries:Array.from({length:t},(a,s)=>{const i=String(s+1).padStart(2,"0");return{label:`${e} ${i}`,url:`${Po}/${e}/${e}_${i}-256x256.png`}})}}const Ha=[$t("Fire",8,"fire"),$t("Metal",8,"metal"),$t("Ice",8,"ice"),$t("Stone",8,"stone"),$t("Wood",8,"wood"),$t("Tile",8,"tile"),$t("Concrete",8,"concrete"),$t("Trees",8,"trees"),$t("Grass",8,"grass"),_t("Wall",24,"wall"),_t("Rust",24,"rust"),_t("Woven",24,"woven"),_t("Ground",24,"ground"),_t("Pebbles",24,"pebbles"),_t("Plant",24,"plant"),_t("Roof",24,"roof"),_t("Misc",24,"misc")],Eo=Ha.flatMap(e=>e.entries);function ch(e){return Eo.find(t=>t.url===e)}const dh={fire:F.NtdFire,metal:F.NtdSettings,ice:F.NtdSnowflake,stone:F.NtdMountain,wood:F.NtdTree,tile:F.NtdGrid,concrete:F.NtdLayers,trees:F.NtdTree,grass:F.NtdLeaf,wall:F.NtdHome,rust:F.NtdCircle,woven:F.NtdGrid,ground:F.NtdMountain,pebbles:F.NtdDroplet,plant:F.NtdLeaf,roof:F.NtdHome,misc:F.NtdPalette},uh=({icon:e})=>{const t=dh[e];return t?r.jsx(t,{size:14}):r.jsx(r.Fragment,{children:e})},At=({children:e,inline:t,strong:n})=>r.jsx("div",{style:{fontSize:13,fontWeight:n?600:void 0,color:"var(--nice-text-secondary, #ccc)",marginBottom:t?0:4},children:e}),hh=({fill:e=Gt,onChange:t=()=>{},previewColor:n="var(--nice-primary, #2196f3)",accentColor:a="var(--nice-primary, #0d6efd)",width:s,height:i})=>{const{t:o}=xe(),[l,c]=d.useState(null),u=(f,k)=>{t({...e,[f]:k})},h=d.useMemo(()=>{const f=e.color||n||"var(--nice-primary, #2196f3)";return(k,v,w)=>{const R=Wn.find(j=>j.name===k)||Wn[0],M=v?Pr.find(j=>j.name===v)??null:null;return Mo({width:80,height:22,capStyle:R,color:f,highlight:e.highlight,glow:e.glow,glass:e.glass,pattern:M,patternColor:e.patternColor,patternOnly:e.patternOnly,textureUrl:w??null,textureScale:e.textureScale})}},[e,n]),p=`2px solid ${a}`,g=a==="var(--nice-warning-dark, #d4a017)"?"var(--nice-warning-bg, #fff8e1)":"var(--nice-info-bg, #e7f1ff)",y=d.useRef(null),m=d.useRef(null),x=d.useCallback((f,k)=>{f.current&&f.current.scrollBy({left:k*180,behavior:"smooth"})},[]),b={position:"absolute",top:0,width:28,height:"100%",border:"none",cursor:"pointer",zIndex:2,display:"flex",alignItems:"center",justifyContent:"center",fontSize:18,fontWeight:700,color:"var(--nice-color-white, #ccc)",background:"linear-gradient(90deg, var(--nice-overlay-90, rgba(30, 30, 30, 0.9)) 60%, transparent)"};return r.jsxs("div",{style:{padding:"4px 0",width:"100%",minWidth:0},children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8},children:[r.jsx(At,{inline:!0,children:o("playerForm.barColor","Color")}),r.jsx(ie.NiceCheckbox,{label:o("playerForm.auto","Auto"),checked:!e.color,onChange:f=>u("color",f?null:n||"var(--nice-primary, #2196f3)")}),e.color&&r.jsx("input",{type:"color",value:e.color,onChange:f=>u("color",f.target.value),style:{width:32,height:28,border:"none",padding:0,cursor:"pointer"}})]}),r.jsx(At,{children:o("playerForm.capShape","Cap shape")}),r.jsxs("div",{style:{position:"relative",marginBottom:10},children:[r.jsx("button",{type:"button",style:{...b,left:0,borderRadius:"6px 0 0 6px"},onClick:()=>x(y,-1),"aria-label":o("playerForm.scrollLeft","Scroll left"),children:r.jsx(F.NtdChevronLeft,{size:16})}),r.jsx("button",{type:"button",style:{...b,left:"auto",right:0,borderRadius:"0 6px 6px 0",background:"linear-gradient(270deg, var(--nice-overlay-90, rgba(30, 30, 30, 0.9)) 60%, transparent)"},onClick:()=>x(y,1),"aria-label":o("playerForm.scrollRight","Scroll right"),children:r.jsx(F.NtdChevronRight,{size:16})}),r.jsx("div",{ref:y,style:{display:"flex",gap:6,overflowX:"auto",scrollBehavior:"smooth",padding:"4px 32px",scrollbarWidth:"none"},children:Wn.map(f=>{const k=e.capStyleName===f.name;return r.jsx("div",{title:f.name,onClick:()=>u("capStyleName",f.name),style:{cursor:"pointer",flexShrink:0,border:k?p:"1px solid var(--nice-border-color, #555)",borderRadius:6,padding:3,background:k?g:"var(--nice-bg-secondary, #222)"},dangerouslySetInnerHTML:{__html:h(f.name,null)}},f.name)})})]}),r.jsx(At,{children:o("playerForm.pattern","Pattern")}),r.jsxs("div",{style:{position:"relative",marginBottom:10},children:[r.jsx("button",{type:"button",style:{...b,left:0,borderRadius:"6px 0 0 6px"},onClick:()=>x(m,-1),"aria-label":o("playerForm.scrollLeft","Scroll left"),children:r.jsx(F.NtdChevronLeft,{size:16})}),r.jsx("button",{type:"button",style:{...b,left:"auto",right:0,borderRadius:"0 6px 6px 0",background:"linear-gradient(270deg, var(--nice-overlay-90, rgba(30, 30, 30, 0.9)) 60%, transparent)"},onClick:()=>x(m,1),"aria-label":o("playerForm.scrollRight","Scroll right"),children:r.jsx(F.NtdChevronRight,{size:16})}),r.jsxs("div",{ref:m,style:{display:"flex",gap:6,overflowX:"auto",scrollBehavior:"smooth",padding:"4px 32px",scrollbarWidth:"none"},children:[r.jsx("div",{title:o("playerForm.none","None"),onClick:()=>u("patternName",null),style:{cursor:"pointer",flexShrink:0,border:e.patternName?"1px solid var(--nice-border-color, #555)":p,borderRadius:6,padding:"3px 8px",background:e.patternName?"var(--nice-text, #222)":g,fontSize:12,lineHeight:"22px",color:"var(--nice-text-inverse, #ccc)"},children:"—"}),Pr.map(f=>{const k=e.patternName===f.name;return r.jsx("div",{title:f.name,onClick:()=>u("patternName",f.name),style:{cursor:"pointer",flexShrink:0,border:k?p:"1px solid var(--nice-border-color, #555)",borderRadius:6,padding:3,background:k?g:"var(--nice-bg-secondary, #222)"},dangerouslySetInnerHTML:{__html:h(e.capStyleName,f.name)}},f.name)})]})]}),r.jsx("div",{style:{marginBottom:8},children:r.jsx(ie.NiceToggle,{label:o("playerForm.patternOnly","Pattern only (flat, no 3D)"),checked:e.patternOnly,onChange:f=>u("patternOnly",f)})}),r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:10},children:[r.jsx(At,{inline:!0,children:o("playerForm.patternColor","Pattern color")}),r.jsx(ie.NiceCheckbox,{label:o("playerForm.auto","Auto"),checked:!e.patternColor,onChange:f=>u("patternColor",f?null:n||"var(--nice-bg, #fff)")}),e.patternColor&&r.jsx("input",{type:"color",value:e.patternColor,onChange:f=>u("patternColor",f.target.value),style:{width:32,height:28,border:"none",padding:0,cursor:"pointer"}})]}),!e.patternOnly&&r.jsxs(r.Fragment,{children:[r.jsxs(At,{children:[o("playerForm.highlight","Highlight"),": ",e.highlight,"%"]}),r.jsx("div",{style:{marginBottom:8},children:r.jsx(ie.NiceSlider,{min:0,max:100,value:e.highlight,onChange:f=>u("highlight",f)})}),r.jsxs(At,{children:[o("playerForm.glow","Glow"),": ",e.glow,"%"]}),r.jsx("div",{style:{marginBottom:8},children:r.jsx(ie.NiceSlider,{min:0,max:100,value:e.glow,onChange:f=>u("glow",f)})})]}),r.jsxs(At,{children:[o("playerForm.glass","Transparency (glass)"),": ",e.glass,"%"]}),r.jsx("div",{style:{marginBottom:8},children:r.jsx(ie.NiceSlider,{min:0,max:100,value:e.glass,onChange:f=>u("glass",f)})}),r.jsx("div",{style:{marginTop:4},children:r.jsx(At,{strong:!0,children:o("playerForm.texture","Texture")})}),r.jsxs("div",{style:{marginBottom:6},children:[r.jsxs("div",{style:{display:"flex",gap:4,flexWrap:"wrap",marginBottom:6},children:[r.jsx(ie.NiceButton,{size:"sm",variant:e.textureUrl?"outline":"primary",onClick:()=>{u("textureUrl",null),c(null)},children:o("playerForm.texNone","None")}),Ha.map(f=>r.jsx(ie.NiceButton,{size:"sm",variant:(l==null?void 0:l.name)===f.name?"primary":"outline",onClick:()=>c(k=>(k==null?void 0:k.name)===f.name?null:f),title:f.name,ariaLabel:f.name,children:r.jsx(uh,{icon:f.icon})},f.name))]}),l&&r.jsx("div",{style:{display:"flex",gap:4,flexWrap:"wrap",maxHeight:130,overflowY:"auto",padding:4,border:"1px solid var(--nice-border, #dee2e6)",borderRadius:6,background:"var(--nice-bg-secondary, #f8f9fa)"},children:l.entries.map(f=>{const k=e.textureUrl===f.url;return r.jsx("div",{title:f.label,onClick:()=>u("textureUrl",k?null:f.url),style:{width:48,height:48,borderRadius:6,cursor:"pointer",border:k?`3px solid ${a}`:"1px solid var(--nice-text-muted, #bbb)",backgroundImage:`url(${f.url})`,backgroundSize:"cover",boxShadow:k?`0 0 6px ${a}`:void 0}},f.url)})}),e.textureUrl&&r.jsxs("div",{style:{marginTop:4,display:"flex",alignItems:"center",gap:8},children:[r.jsx("div",{style:{width:80,height:22,borderRadius:6,backgroundImage:`url(${e.textureUrl})`,backgroundSize:`${Math.round(256*e.textureScale)}px`,border:"1px solid var(--nice-border-color, #aaa)"}}),r.jsx("span",{style:{fontSize:11,color:"var(--nice-text-secondary, #666)"},children:e.textureUrl.split("/").pop()})]})]}),e.textureUrl&&r.jsxs(r.Fragment,{children:[r.jsxs(At,{children:[o("playerForm.textureScale","Texture scale"),": ",e.textureScale.toFixed(1),"×"]}),r.jsx("div",{style:{marginBottom:8},children:r.jsx(ie.NiceSlider,{min:10,max:200,step:10,value:Math.round(e.textureScale*100),onChange:f=>u("textureScale",f/100)})})]})]})},rt=st.scoped("AudioPitchAnalyzer");function ph({onSegments:e,defaultCompareAll:t=!1,externalFile:n=null,postPitch:a,postLibrosaPitchTrack:s}){const{t:i}=xe(),[o,l]=d.useState("pitchy"),[c,u]=d.useState(null),[h,p]=d.useState(t),[g,y]=d.useState({}),[m,x]=d.useState({}),[b,f]=d.useState([]),[k,v]=d.useState([]),[w,R]=d.useState(!1),[M,j]=d.useState(null),[T]=d.useState(null),[P]=d.useState(null),[A,I]=d.useState(null),L=d.useRef(null);function N(G){try{if(G instanceof Error){let C=`${G.message}
40
- ${G.stack??""}`;const $=G;if($!=null&&$.attemptedUrls)try{C+=`
41
- Attempted URLs: ${Array.isArray($.attemptedUrls)?$.attemptedUrls.join(", "):String($.attemptedUrls)}`}catch{C+=`
42
- Attempted URLs: ${String($.attemptedUrls)}`}return C}const W=G;return W!=null&&W.attemptedUrls?`Error: ${String(W.message??W)}
43
- Attempted URLs: ${Array.isArray(W.attemptedUrls)?W.attemptedUrls.join(", "):String(W.attemptedUrls)}`:String(G)}catch{return i("audioPitch.unknownError","Unknown error")}}function _(G){if(!G||G<=0)return null;const W=12*Math.log2(G/440)+69;return Math.round(W-12)}async function ee(G){var C;const W=(C=G.target.files)==null?void 0:C[0];W&&await Y(W,h)}async function Y(G,W){j(null),v([]),R(!0);try{const C=await G.arrayBuffer(),$=window.AudioContext??window.webkitAudioContext,B=await new $().decodeAudioData(C),H=B.getChannelData(0);u(H);const z=B.sampleRate,Z=Math.floor(z*.1),E=Z,q=()=>{const J=[],ae=la.PitchDetector.forFloat32Array(Z);for(let ce=0;ce<H.length-Z;ce+=E){const le=H.slice(ce,ce+Z),[ne,pe]=ae.findPitch(le,z),fe=_(ne);fe&&ne>50&&ne<2e3&&pe>.7&&J.push({start:ce/z,duration:Z/z,pitch:fe,freq:ne})}return J},X=()=>{const J=[];for(let ae=0;ae<H.length-Z;ae+=E){const ce=H.slice(ae,ae+Z),le=U(ce,z),ne=_(le);ne&&le>50&&le<2e3&&J.push({start:ae/z,duration:Z/z,pitch:ne,freq:le})}return J};if(W){R(!0),j(null);const J={};try{const ae={};try{J.pitchy=q(),ae.pitchy=null}catch(ce){J.pitchy=[],ae.pitchy=N(ce),rt.warn("pitchy failed",ce)}try{J["ultrastar-wp"]=X(),ae["ultrastar-wp"]=null}catch(ce){J["ultrastar-wp"]=[],ae["ultrastar-wp"]=N(ce),rt.warn("ultrastar-wp failed",ce)}J.aubio=[],ae.aubio="disabled";try{if(!a)throw new Error("CREPE backend not configured");const le=(await a(G)).track??[];J.crepe=le.map((ne,pe)=>{var fe;return{start:ne.t,duration:(fe=le[pe+1])!=null&&fe.t?le[pe+1].t-ne.t:.1,pitch:_(ne.hz)??0,freq:ne.hz}}),ae.crepe=null}catch(ce){J.crepe=[],ae.crepe=N(ce),rt.warn("crepe failed",ce)}try{if(!s)throw new Error("Librosa backend not configured");const le=(await s(new File([G],G.name,{type:G.type}))).track??[];J.librosa=le.map((ne,pe)=>{var fe;return{start:ne.t,duration:(fe=le[pe+1])!=null&&fe.t?le[pe+1].t-ne.t:.1,pitch:_(ne.hz)??0,freq:ne.hz}}),ae.librosa=null}catch(ce){J.librosa=[],ae.librosa=N(ce),rt.warn("librosa failed",ce)}x(ae),y(J),v(J[o]??[])}catch(ae){rt.error("compareAll overall failed",ae);const ce=ae instanceof Error?ae.message:String(ae);j(i("audioPitch.errorComparing","Error comparing algorithms: ")+ce)}finally{R(!1)}return}const re=[],oe=[];let se=0;if(o==="pitchy"){const J=la.PitchDetector.forFloat32Array(Z);for(let ae=0;ae<H.length-Z;ae+=E){const ce=H.slice(ae,ae+Z);let le=0;for(let me=0;me<ce.length;me++)le+=ce[me]*ce[me];le=Math.sqrt(le/ce.length),oe.push(le);const[ne,pe]=J.findPitch(ce,z),fe=_(ne);fe&&ne>50&&ne<2e3&&pe>.7&&(re.push({start:ae/z,duration:Z/z,pitch:fe,freq:ne}),se++)}}else if(o==="crepe")try{if(!a)throw new Error("CREPE backend not configured");const J=await a(G);if(!J.track||J.track.length===0)j(i("audioPitch.crepeNoNotes","CREPE detected no notes")),rt.warn("Crepe: No notes detected in audio file.");else{const ae=J.track.map((ce,le)=>{const ne=_(ce.hz);return ne&&ce.hz>50&&ce.hz<2e3?{start:ce.t,duration:le<J.track.length-1?J.track[le+1].t-ce.t:.1,pitch:ne,freq:ce.hz}:null}).filter(ce=>ce!==null);if(v(ae),e)try{e(ae)}catch(ce){rt.error("Error in onSegments:",ce)}f([]),u(null);return}}catch(J){j(i("audioPitch.crepeBackendError","CREPE backend error")),I(N(J)),rt.error("Crepe: Error calling backend:",J)}else if(o==="librosa")try{await O(G),f([]),u(null);return}catch(J){j(i("audioPitch.librosaBackendError","Librosa backend error")),I(N(J)),rt.error("Librosa: Error calling backend:",J)}else if(o==="ultrastar-wp")for(let J=0;J<H.length-Z;J+=E){const ae=H.slice(J,J+Z);let ce=0;for(let pe=0;pe<ae.length;pe++)ce+=ae[pe]*ae[pe];ce=Math.sqrt(ce/ae.length),oe.push(ce);const le=U(ae,z),ne=_(le);ne&&le>50&&le<2e3&&(re.push({start:J/z,duration:Z/z,pitch:ne,freq:le}),se++)}f(oe);const D=V(re);if(v(D),e)try{e(D)}catch(J){rt.error("Error in onSegments:",J)}D.length===0&&o!=="crepe"&&(j(i("audioPitch.noNotesDetected","No notes detected")),rt.warn("No notes detected in audio file."))}catch(C){j(i("audioPitch.errorAnalyzing","Error analyzing the file: ")+(C instanceof Error?C.message:String(C))),I(N(C)),rt.error("Error analyzing audio file:",C)}finally{R(!1)}}d.useEffect(()=>{n&&Y(n,!0)},[n]);async function O(G){try{if(!s)throw new Error("Librosa backend not configured");const W=new File([G],"capture.wav",{type:"audio/wav"}),$=((await s(W)).track??[]).map(S=>({t:S.t,hz:S.hz}));if(e){const S=$.map((B,H)=>{var E;const z=((E=$[H+1])==null?void 0:E.t)??B.t+.1,Z=_(B.hz)??0;return{start:B.t,duration:Math.max(.05,z-B.t),pitch:Z,freq:B.hz}});e(S),v(S)}}catch(W){rt.warn("Librosa analysis failed, falling back to local detectors",W);const $=(typeof W=="object"&&W!==null?W:{}).attemptedUrls;$&&rt.error("Librosa attempted URLs:",$);const S=$?Array.isArray($)?$.join(", "):String($):null,B=W instanceof Error?W.message:String(W);j(i("audioPitch.librosaBackendError","Librosa backend error")+": "+B+(S?" (attempted: "+S+")":"")),I(N(W))}}function U(G,W){const S=Math.floor(W/50),B=Math.max(2,Math.floor(W/2e3));let H=0;for(let q=0;q<G.length;q++)H+=G[q]*G[q];if(H<=1e-8)return 0;let z=-1,Z=0;const E=1e-10;for(let q=B;q<=Math.min(S,G.length-2);q++){let X=0;const re=G.length-q;for(let se=0;se<re;se++)X+=G[se]*G[se+q];const oe=X/(re+E)/(H/G.length+E);oe>Z&&(Z=oe,z=q)}return z>0&&Z>.01?W/z:0}function V(G){if(G.length===0)return[];const W=[];let C=G[0];for(let $=1;$<G.length;$++){const S=G[$];S.pitch===C.pitch&&Math.abs(S.freq-C.freq)<1?C.duration+=S.duration:(W.push(C),C=S)}return W.push(C),W}function K(){try{const G=Object.keys(g).length>0?Object.keys(g):["pitchy","ultrastar-wp","aubio","crepe","librosa"],W=(()=>{let se=0;for(const D of G){const J=g[D]??[];for(const ae of J)se=Math.max(se,ae.start+(ae.duration||0))}return se||0})(),C=(se,D)=>!se||!D?1/0:1200*Math.log2(se/D),$=(se,D)=>{if(!se||!D)return!1;const J=Math.round(Math.log2(D/se)),ae=se*Math.pow(2,J),ce=Math.abs(C(ae,D));return Math.abs(J)>=1&&ce<50},S=se=>{const D={count:0,totalDur:0,meanFreq:0,stdFreq:0,meanDur:0,voicedFraction:null};if(!se||se.length===0)return D;D.count=se.length,D.totalDur=se.reduce((le,ne)=>le+(ne.duration||0),0);const J=se.map(le=>le.freq).filter(Boolean);if(J.length===0)return D;const ae=J.reduce((le,ne)=>le+ne,0)/J.length,ce=J.reduce((le,ne)=>le+(ne-ae)*(ne-ae),0)/J.length;return D.meanFreq=ae,D.stdFreq=Math.sqrt(ce||0),D.meanDur=D.totalDur/D.count,D.voicedFraction=W>0?D.totalDur/W:null,D},B=(se,D)=>{let J=0,ae=0;const ce=[];for(const ne of se){const pe=ne.start,fe=ne.start+(ne.duration||.05);let me=null,he=0;for(const we of D){const je=we.start,Ne=we.start+(we.duration||.05),Ee=Math.max(0,Math.min(fe,Ne)-Math.max(pe,je));Ee>he&&(he=Ee,me=we)}if(me&&he>0){const we=Math.abs(C(ne.freq,me.freq));ce.push(we),we<50&&J++,$(ne.freq,me.freq)&&ae++}}const le=ce.length?ce.reduce((ne,pe)=>ne+pe,0)/ce.length:null;return{matches:J,compared:se.length,meanCents:le,octaveErrors:ae}},H=[];H.push("# AudioPitchAnalyzer — Comparative Report"),H.push(`Generated: ${new Date().toISOString()}`),H.push(""),H.push("## Summary"),H.push(`- Selected algorithm in UI: **${o}**`),H.push(`- Total analyzed duration (approx): **${W.toFixed(3)} s**`),H.push(""),H.push("## Per-algorithm statistics"),H.push("| Algorithm | Segments | Total voiced (s) | Voiced fraction | Mean freq (Hz) | Std freq (Hz) | Mean dur (s) |"),H.push("|---|---:|---:|---:|---:|---:|---:|");const z={};for(const se of G){const D=g[se]??[],J=S(D);z[se]=J,H.push(`| ${se} | ${J.count||0} | ${(J.totalDur||0).toFixed(3)} | ${J.voicedFraction!==null?(J.voicedFraction*100).toFixed(1)+"%":"N/A"} | ${J.meanFreq?J.meanFreq.toFixed(1):"N/A"} | ${J.stdFreq?J.stdFreq.toFixed(1):"N/A"} | ${J.meanDur?J.meanDur.toFixed(3):"N/A"} |`)}H.push(""),H.push("## Pairwise agreement (reference -> test)");const Z=G.includes("crepe")?"crepe":G.includes("librosa")?"librosa":G.includes("pitchy")?"pitchy":G[0];H.push(`Reference algorithm: **${Z}**`),H.push(""),H.push("| Reference -> Test | Matches | Compared (ref) | Match % | Mean cents diff | Octave errors |"),H.push("|---|---:|---:|---:|---:|---:|");for(const se of G){if(se===Z)continue;const D=B(g[Z]??[],g[se]??[]),J=D.compared?(D.matches/D.compared*100).toFixed(1)+"%":"N/A";H.push(`| ${Z} -> ${se} | ${D.matches} | ${D.compared} | ${J} | ${D.meanCents!==null?D.meanCents.toFixed(1):"N/A"} | ${D.octaveErrors} |`)}H.push(""),H.push("## Observations and analysis"),H.push("- The table above gives an overview of voiced coverage and per-algorithm mean frequencies. High voiced fraction indicates the algorithm detected many tonal regions; low fraction indicates conservative voicing or failures in noisy/quiet sections."),H.push("- Pairwise match rate shows how often algorithms agree on the same regions (within ~50 cents). Octave error counts highlight typical autocorrelation octave mistakes."),H.push("- Mean cents difference (reference vs test) indicates systematic tuning offsets or frequency bias; values <50 cents are generally acceptable for musical content, but for scoring you may want <20 cents."),H.push("");for(const se of G){H.push(`### ${se}`);const D=z[se];H.push(`- Segments: ${D.count||0}`),H.push(`- Total voiced (s): ${(D.totalDur||0).toFixed(3)}`),H.push(`- Voiced fraction: ${D.voicedFraction!==null?(D.voicedFraction*100).toFixed(1)+"%":"N/A"}`),H.push(`- Mean frequency: ${D.meanFreq?D.meanFreq.toFixed(2)+" Hz":"N/A"}`),H.push(`- Std frequency: ${D.stdFreq?D.stdFreq.toFixed(2)+" Hz":"N/A"}`),H.push("")}H.push("## Conclusions & recommendation");const E=[];for(const se of G){if(se===Z){E.push({alg:se,score:100});continue}const D=B(g[Z]??[],g[se]??[]),J=D.compared?D.matches/D.compared:0,ae=D.compared?D.octaveErrors/D.compared:0,ce=J-ae*.5;E.push({alg:se,score:ce})}E.sort((se,D)=>D.score-se.score),H.push(`- Based on this recording, recommended authoritative detector: **${E[0].alg}** (best agreement with reference).`),H.push("- For live, low-latency feedback use Pitchy (YIN) with smoothing/hysteresis; use Crepe/Librosa for authoritative scoring or post-processing."),H.push("- If octave errors are frequent, consider octave-correction heuristics (prefer lower octave when ambiguity) or combine detectors via voting."),H.push(""),H.push("## Raw data (per-algorithm segments)");for(const se of G){const D=g[se]??[];H.push(`### ${se} — ${D.length} segments`);for(const ae of D)H.push(`- ${ae.start.toFixed(3)} .. ${(ae.start+(ae.duration||0)).toFixed(3)} : ${ae.freq.toFixed(2)} Hz (pitch ${ae.pitch})`);const J=m[se];J&&H.push(`- Error: ${J}`),H.push("")}const q=H.join(`
44
- `),X=new Blob([q],{type:"text/markdown;charset=utf-8"}),re=URL.createObjectURL(X),oe=document.createElement("a");oe.href=re,oe.download="audiopitch_scientific_report_"+(n?n.name:"capture")+".md",document.body.appendChild(oe),oe.click(),oe.remove(),URL.revokeObjectURL(re)}catch(G){rt.error("generateScientificReport error",G),rt.warn(i("audioPitch.reportError","Could not generate the report: ")+String(G))}}return r.jsxs("div",{style:{marginTop:32,padding:16,border:"1px solid var(--nice-border, #ccc)",borderRadius:8},children:[r.jsx("h3",{children:i("audioPitch.title","Pitch analysis")}),r.jsxs("div",{style:{marginBottom:12},children:[r.jsx("label",{htmlFor:"pitch-algorithm-select",style:{marginRight:8},children:i("audioPitch.algorithm","Algorithm")}),r.jsxs("select",{id:"pitch-algorithm-select",value:o,onChange:G=>l(G.target.value),style:{marginRight:16},children:[r.jsx("option",{value:"ultrastar-wp",children:i("audioPitch.algorithmUltrastarWp","Ultrastar WP (autocorrelation)")}),r.jsx("option",{value:"crepe",children:"crepe (AI)"}),r.jsx("option",{value:"pitchy",children:"pitchy (YIN)"}),r.jsx("option",{value:"librosa",children:"Librosa (PYIN)"})]}),r.jsxs("label",{style:{marginRight:8},children:[r.jsx("input",{type:"checkbox",checked:h,onChange:G=>p(G.target.checked)})," ",i("audioPitch.compareAll","Compare all algorithms")]}),r.jsx("input",{type:"file",accept:"audio/*",ref:L,onChange:ee,disabled:w})]}),w&&r.jsx("div",{children:i("audioPitch.analyzing","Analyzing...")}),r.jsxs("div",{style:{marginTop:8},children:[r.jsx("b",{children:i("audioPitch.method","Method:")})," ",o]}),M&&r.jsxs("div",{style:{color:"red",marginTop:8},children:[r.jsxs("b",{children:[o,": "]}),r.jsx("div",{children:M}),A&&r.jsx("pre",{style:{background:"var(--nice-text, #111)",color:"var(--nice-danger-light, #f88)",padding:8,borderRadius:4,whiteSpace:"pre-wrap",marginTop:8},children:A})]}),T&&r.jsxs("div",{style:{marginTop:12},children:[r.jsx("b",{children:i("audioPitch.aubioDiagnostics","Aubio diagnostics")}),r.jsx("pre",{style:{background:"var(--nice-text, #111)",color:"var(--nice-danger-light, #f88)",padding:8,borderRadius:4,whiteSpace:"pre-wrap"},children:T}),P&&r.jsxs("div",{style:{marginTop:8},children:[r.jsx("b",{children:i("audioPitch.probe","Probe:")})," ",P]})]}),(Object.keys(g).length>0||Object.keys(m).length>0)&&r.jsxs("div",{style:{marginTop:12},children:[r.jsx("button",{onClick:()=>K(),children:i("audioPitch.downloadReport","Download report")}),Object.entries(m).length>0&&r.jsxs("div",{style:{marginTop:8},children:[r.jsx("b",{children:i("audioPitch.perAlgorithmErrors","Per-algorithm errors:")}),Object.entries(m).filter(([G,W])=>W).map(([G,W])=>r.jsxs("div",{style:{marginTop:6},children:[r.jsxs("b",{children:[G,":"]}),r.jsx("pre",{style:{background:"var(--nice-text, #111)",color:"var(--nice-danger-light, #f88)",padding:8,borderRadius:4,whiteSpace:"pre-wrap"},children:W})]},G))]})]}),k.length>0&&r.jsxs("div",{style:{marginTop:16},children:[r.jsx("b",{children:i("audioPitch.resultUltrastar","Result (UltraStar format):")}),r.jsxs("pre",{style:{background:"var(--nice-text, #222)",color:"var(--nice-bg, #fff)",padding:8,borderRadius:4},children:[k.map(G=>`: ${Math.round(G.start*10)} ${Math.round(G.duration*10)} ${G.pitch} [${G.freq.toFixed(1)} Hz]`).join(`
39
+ </svg>`;return`data:image/svg+xml;utf8,${encodeURIComponent(o)}`},nh=(e,t,n,a,s)=>{const i=`${e}-${t}-${n}-${Math.round(a)}-${s}`;let o=Ds.get(i);return o||(o=new Image,o.src=th(e,t,n,a,s),Ds.set(i,o),o)},rh=e=>{const t=e.replace("#",""),n=parseInt(t.length===3?t[0]+t[0]:t.substring(0,2),16)/255,a=parseInt(t.length===3?t[1]+t[1]:t.substring(2,4),16)/255,s=parseInt(t.length===3?t[2]+t[2]:t.substring(4,6),16)/255,i=Math.max(n,a,s),o=Math.min(n,a,s);let l=0,c=0;const u=(i+o)/2;if(i!==o){const h=i-o;switch(c=u>.5?h/(2-i-o):h/(i+o),i){case n:l=(a-s)/h+(a<s?6:0);break;case a:l=(s-n)/h+2;break;case s:l=(n-a)/h+4;break}l/=6}return{h:Math.round(l*360),s:Math.round(c*100),l:Math.round(u*100)}},ah=(e,t,n,a=1)=>`hsla(${Math.round(e)}, ${Math.round(t)}%, ${Math.round(n)}%, ${a})`;function Qn(e){try{const t=ve.resolveCssColor(e),[n,a,s]=Bc(t),i=o=>o.toString(16).padStart(2,"0");return`#${i(n)}${i(a)}${i(s)}`.toLowerCase()}catch{return"var(--nice-warning, #ffcc00)"}}function sh(e,t,n,a,s,i){const o=Math.min(i,a/2,s/2);e.beginPath(),e.moveTo(t+o,n),e.lineTo(t+a-o,n),e.quadraticCurveTo(t+a,n,t+a,n+o),e.lineTo(t+a,n+s-o),e.quadraticCurveTo(t+a,n+s,t+a-o,n+s),e.lineTo(t+o,n+s),e.quadraticCurveTo(t,n+s,t,n+s-o),e.lineTo(t,n+o),e.quadraticCurveTo(t,n,t+o,n),e.closePath()}const cn=new Map,Pn=new Set,fr=new Set;function qa(e){const t=cn.get(e);return t?Promise.resolve(t):fr.has(e)?Promise.reject(new Error(`Texture failed: ${e}`)):Pn.has(e)?new Promise((n,a)=>{const s=()=>{cn.has(e)?n(cn.get(e)):fr.has(e)?a(new Error(`Texture failed: ${e}`)):requestAnimationFrame(s)};s()}):(Pn.add(e),new Promise((n,a)=>{const s=new Image;s.crossOrigin="anonymous",s.onload=()=>{cn.set(e,s),Pn.delete(e),n(s)},s.onerror=()=>{Pn.delete(e),fr.add(e),a(new Error(`Failed to load texture: ${e}`))},s.src=e}))}function ih(e){return cn.get(e)??null}function En(e,t,n=1){const a=cn.get(t);if(!a)return!Pn.has(t)&&!fr.has(t)&&qa(t).catch(()=>{}),null;const s=e.createPattern(a,"repeat");if(!s)return null;if(n!==1){const i=new DOMMatrix;i.scaleSelf(n,n),s.setTransform(i)}return s}function oh(e){for(const t of e)t&&qa(t).catch(()=>{})}const $n=new Map,sn=new Set;function No(e,t,n){return`${e}|${t}|${n??""}`}function lh(e,t,n){const a=No(e.name,t,n),s=$n.get(a);if(s)return Promise.resolve(s);if(sn.has(a))return new Promise((m,x)=>{const b=()=>{$n.has(a)?m($n.get(a)):sn.has(a)?requestAnimationFrame(b):x(new Error(`Pattern render failed: ${a}`))};b()});sn.add(a);const i="p",o=e.mk(i,t,n??void 0),l=o.match(/width="(\d+)"/),c=o.match(/height="(\d+)"/),u=l?parseInt(l[1],10):16,h=c?parseInt(c[1],10):16,p=`<svg xmlns="http://www.w3.org/2000/svg" width="${u}" height="${h}"><defs>${o}</defs><rect width="${u}" height="${h}" fill="url(#${i})"/></svg>`,g=new Blob([p],{type:"image/svg+xml;charset=utf-8"}),y=URL.createObjectURL(g);return new Promise((m,x)=>{const b=new Image;b.onload=()=>{$n.set(a,b),sn.delete(a),URL.revokeObjectURL(y),m(b)},b.onerror=()=>{sn.delete(a),URL.revokeObjectURL(y),x(new Error(`Failed to render pattern tile: ${e.name}`))},b.src=y})}function An(e,t,n,a){const s=No(t.name,n,a),i=$n.get(s);return i?e.createPattern(i,"repeat"):(sn.has(s)||lh(t,n,a).catch(()=>{}),null)}let Mt=null,nt=null,pt=null,Et=null,bt=null,Ve=null,zs="",Fs=0,Os="";const ma=(e,t,n,a,s,i,o,l,c,u,h,p,g,y,m,x,b,f,j,v,C,N,M,k)=>{e.clearRect(0,0,t,n);const T=k??null,E=(T==null?void 0:T.filledBar)??Gt,A=(T==null?void 0:T.emptyBar)??zr,I=(T==null?void 0:T.goldFilledBar)??Or,L=(T==null?void 0:T.goldEmptyBar)??Fr,P=(T==null?void 0:T.font)??Br,_=Rn(E.capStyleName),ee=Rn(A.capStyleName),K=Rn(I.capStyleName),z=Rn(L.capStyleName),V=E.patternName?Nn(E.patternName):null,W=A.patternName?Nn(A.patternName):null,H=I.patternName?Nn(I.patternName):null,G=L.patternName?Nn(L.patternName):null,Z=V?An(e,V,E.patternColor??E.color??"var(--nice-bg, #fff)",E.patternColor):null,w=W?An(e,W,A.patternColor??A.color??"var(--nice-border, #d1d5db)",A.patternColor):null,R=H?An(e,H,I.patternColor??"var(--nice-warning, #FFD700)",I.patternColor):null,S=G?An(e,G,L.patternColor??"var(--nice-warning, #FFD700)",L.patternColor):null;Os!==i&&(Os=i,ha("RENDER",`Renderer using settings for "${i}" — filled: cap=${E.capStyleName}, glass=${E.glass} | empty: cap=${A.capStyleName}, glass=${A.glass} | goldFilled: cap=${I.capStyleName}, pattern=${I.patternName??"none"} | goldEmpty: cap=${L.capStyleName}, pattern=${L.patternName??"none"} | hasSettings=${!!T}`,{filledBar:E,emptyBar:A,goldFilledBar:I,goldEmptyBar:L,filledOverlay:!!Z,emptyOverlay:!!w,goldFilledOverlay:!!R,goldEmptyOverlay:!!S}));const F=E.textureUrl?En(e,E.textureUrl,E.textureScale):null,Y=A.textureUrl?En(e,A.textureUrl,A.textureScale):null,O=I.textureUrl?En(e,I.textureUrl,I.textureScale):null,U=L.textureUrl?En(e,L.textureUrl,L.textureScale):null,$=typeof document<"u"?ve.resolveCssColor(l||"var(--nice-color-accent, #ffcc00)"):l||"var(--nice-color-accent, #ffcc00)",q=Qn($||"var(--nice-warning, #ffcc00)"),X=ke=>ve.resolveCssColor(ke),re=P.fontFamily||"Arial",oe=P.fontSize||18,se=X(P.fontColor||"var(--btn-text, #fff)"),D=P.outlineColor?X(P.outlineColor):null,J=typeof P.outlineWidth=="number"?P.outlineWidth:0,ae=P.shadow||null;typeof document<"u"&&((!Mt||Mt.width!==t||Mt.height!==n)&&(Mt=document.createElement("canvas"),Mt.width=t,Mt.height=n,nt=Mt.getContext("2d")),nt&&nt.clearRect(0,0,t,n),(!pt||pt.width!==t||pt.height!==n)&&(pt=document.createElement("canvas"),pt.width=t,pt.height=n,Et=pt.getContext("2d")),Et&&Et.clearRect(0,0,t,n),(!bt||bt.width!==t||bt.height!==n)&&(bt=document.createElement("canvas"),bt.width=t,bt.height=n,Ve=bt.getContext("2d")),Ve&&Ve.clearRect(0,0,t,n));const ce=j?-j:0,le=v||t;e.fillStyle=$,e.font=`bold ${oe}px ${re}`;const pe=e.measureText(i).width+20;if(e.fillRect(ce+10,5,pe,25),e.save(),e.fillStyle=se,ae){const ke=ae.match(/(-?\d+)px\s+(-?\d+)px\s+(\d+)px\s+(#[0-9a-fA-F]{3,8}|rgba?\([^)]+\)|[a-zA-Z]+)/);ke&&(e.shadowOffsetX=parseInt(ke[1],10),e.shadowOffsetY=parseInt(ke[2],10),e.shadowBlur=parseInt(ke[3],10),e.shadowColor=ke[4])}if(e.fillText(i,ce+20,22),D&&J>0&&(e.lineWidth=J,e.strokeStyle=D,e.strokeText(i,ce+20,22)),e.restore(),b){const ke=X(f||"var(--nice-text-secondary, #6b7280)");e.font=`bold 12px ${re}`;const Ce=e.measureText(b).width,We=8,De=ce+10+pe+6,Ae=20,Ee=7,de=Ce+We*2,me=4;e.beginPath(),e.moveTo(De+me,Ee),e.lineTo(De+de-me,Ee),e.quadraticCurveTo(De+de,Ee,De+de,Ee+me),e.lineTo(De+de,Ee+Ae-me),e.quadraticCurveTo(De+de,Ee+Ae,De+de-me,Ee+Ae),e.lineTo(De+me,Ee+Ae),e.quadraticCurveTo(De,Ee+Ae,De,Ee+Ae-me),e.lineTo(De,Ee+me),e.quadraticCurveTo(De,Ee,De+me,Ee),e.closePath(),e.fillStyle=ke,e.fill(),e.fillStyle=se,e.fillText(b,De+We,Ee+14),e.font=`bold ${oe}px ${re}`}const fe=120;if(e.fillStyle=$,e.fillRect(ce+le-fe-10,5,fe,25),e.fillStyle=se,e.fillText(`${o} pts`,ce+le-fe+15,22),C&&C.currentCombo>=5){const ke=C.currentCombo>=50?"3x":C.currentCombo>=30?"2.5x":C.currentCombo>=20?"2x":C.currentCombo>=10?"1.5x":"",Ce=`${C.currentCombo} combo${ke?" "+ke:""}`;e.font=`bold 12px ${re}`;const De=e.measureText(Ce).width+16,Ae=ce+le-fe-10-De-6;e.fillStyle=X(C.currentCombo>=20?"var(--nice-color-success, #FFD700)":"var(--nice-color-warning, #ff9800)"),e.globalAlpha=.9,sh(e,Ae,7,De,21,4),e.fill(),e.globalAlpha=1,e.fillStyle=X(C.currentCombo>=20?"var(--nice-text-primary, #000)":"var(--btn-text, #fff)"),e.fillText(Ce,Ae+8,22),e.font=`bold 14px ${re}`}if(N&&N.length>0){const ke=N[N.length-1];if(ke.label){const Ce=`${N.length}-${ke.label}`;Ce!==zs&&(zs=Ce,Fs=Date.now());const We=Date.now()-Fs;if(We<2500){const De=We<2e3?1:1-(We-2e3)/500,Ae={Perfect:X("var(--nice-color-success, #00e676)"),Great:X("var(--nice-color-success, #66bb6a)"),Good:X("var(--nice-color-accent, #ffeb3b)"),OK:X("var(--nice-color-warning, #ff9800)"),Bad:X("var(--nice-color-error, #ef5350)"),Awful:X("var(--nice-color-error, #b71c1c)")};e.save(),e.globalAlpha=De,e.font=`bold ${Math.round(oe*1.2)}px ${re}`;const Ee=ke.label,de=e.measureText(Ee).width,me=ce+le/2-de/2;e.fillStyle=Ae[Ee]||se,e.shadowColor=ve.resolveCssColor("var(--nice-overlay-50, rgba(0, 0, 0, 0.5))",e.canvas),e.shadowBlur=6,e.fillText(Ee,me,58),D&&J>0&&(e.lineWidth=J,e.strokeStyle=D,e.strokeText(Ee,me,58)),e.restore()}}}const ge=s-2,he=s+5,we=40;let je=1/0,Pe=-1/0;if(a.forEach(ke=>{ke.forEach(Ce=>{Ce.pitch<je&&(je=Ce.pitch),Ce.pitch>Pe&&(Pe=Ce.pitch)})}),c&&Array.isArray(c)&&c.length>0){let ke=null;isFinite(je)&&isFinite(Pe)&&(ke=Math.round((je+Pe)/2));let Ce=1/0,We=-1/0;c.forEach(({t:De,hz:Ae})=>{if(!Ae||Ae<=0)return;let Ee=ke;for(const me of a)for(const Re of me)De>=Re.startTime&&De<=Re.startTime+Re.duration&&(Ee=Re.pitch);const de=mo(Ae,Ee);de<Ce&&(Ce=de),de>We&&(We=de)}),Ce!==1/0&&We!==-1/0&&(Ce<je&&(je=Math.floor(Ce-2)),We>Pe&&(Pe=Math.ceil(We+2)))}(!isFinite(je)||!isFinite(Pe))&&(je=40,Pe=80),je===Pe&&(je=Math.max(0,je-6),Pe=Pe+6);const $e=ke=>{const Ce=n-we-10;return we+Ce-(ke-je)/(Pe-je)*Ce},ue=Dr(g||"normal"),Oe=(n-we-10)/Math.max(1,Pe-je),Me=Math.max(10,Math.round(Oe*(1+2*ue.semitoneTolerance)*.3)),Ie=Math.max(5,Math.round(Me*.45));((ke,Ce,We,De,Ae,Ee)=>{ke.lineWidth=1;for(let de=Math.ceil(Ae);de<=Math.floor(Ee);de++){const me=$e(de);ke.strokeStyle=X(de%2===0?"var(--guide-line-strong, rgba(255, 255, 255, 0.12))":"var(--guide-line-weak, rgba(255, 255, 255, 0.06))"),ke.beginPath(),ke.moveTo(0,Math.round(me)+.5),ke.lineTo(Ce,Math.round(me)+.5),ke.stroke()}})(e,t,n-we,we,je,Pe),Et&&Et.clearRect(0,0,t,n);const Be=(s-ge)/(he-ge)*t;let He=n*.5,Lt=!1,ct=!1;const ht=(ke,Ce,We,De,Ae,Ee,de=0)=>{const me=(Ne,_e,be,Te,Le,Ge)=>{const ze=Math.min(Ge,Te/2,Le/2);Ne.beginPath(),Ne.moveTo(_e+ze,be),Ne.lineTo(_e+Te-ze,be),Ne.quadraticCurveTo(_e+Te,be,_e+Te,be+ze),Ne.lineTo(_e+Te,be+Le-ze),Ne.quadraticCurveTo(_e+Te,be+Le,_e+Te-ze,be+Le),Ne.lineTo(_e+ze,be+Le),Ne.quadraticCurveTo(_e,be+Le,_e,be+Le-ze),Ne.lineTo(_e,be+ze),Ne.quadraticCurveTo(_e,be,_e+ze,be),Ne.closePath()},Re=Math.max(2,Me/2);De.forEach(Ne=>{if(Ne.startTime+Ne.duration<Ae||Ne.startTime>Ee)return;const _e=(Ne.startTime-Ae)/(Ee-Ae)*Ce,be=Ne.duration/(Ee-Ae)*Ce,Te=$e(Ne.pitch)-Me/2,Le=[];if(Array.isArray(p)){const Ge=Ne.startTime+Ne.duration;p.forEach(ze=>{if(ze.pitch!==Ne.pitch||ze.noteStart!=null&&ze.noteEnd!=null&&(Math.abs(ze.noteStart-Ne.startTime)>.01||Math.abs(ze.noteEnd-Ge)>.01))return;const tt=Math.max(ze.start,Ne.startTime),Ke=Math.min(ze.end,Ge);if(tt>=Ke)return;const Wt=(tt-Ae)/(Ee-Ae)*Ce,Qt=(Ke-Ae)/(Ee-Ae)*Ce;Le.push({x1:Wt,x2:Qt,frac:ze.frac})})}if(Ne.isGold){ke.save();const Ge=m&&m.shadowColor?m.shadowColor:_s,ze=m&&typeof m.glowBlur=="number"?m.glowBlur:Ls;ke.shadowColor=Ge,ke.shadowBlur=Math.max(4,ze-12),ke.fillStyle=X("var(--gold-overlay, rgba(255, 215, 0, 0.15))"),me(ke,_e-1,Te-1,be+2,Me+2,Re),ke.fill(),ke.restore();const tt=Qn("var(--gold-base, #b4af9f)");Tn(ke,_e,Te,be,Me,z,L.color??tt,L.highlight,L.glow,L.glass,G,L.patternColor,L.patternOnly,U,S),ke.save(),me(ke,_e,Te,be,Me,Re),ke.clip(),ke.globalAlpha=.18,ke.fillStyle=X("var(--nice-color-success, #FFD700)"),ke.fillRect(_e,Te,be,Math.max(1,Me*.25)),ke.globalAlpha=1,ke.restore(),Le.length>0&&(ke.save(),me(ke,_e,Te,be,Me,Re),ke.clip(),Le.forEach(Ke=>{const Wt=Math.max(1,Ke.x2-Ke.x1);Tn(ke,Ke.x1,Te,Wt,Me,K,I.color??"var(--nice-warning, #FFD700)",I.highlight,I.glow,I.glass,H,I.patternColor,I.patternOnly,O,R)}),ke.restore()),Le.length===0&&(ke.lineWidth=1,ke.strokeStyle=X("var(--gold-outline, rgba(255, 215, 0, 0.35))"),me(ke,_e+.5,Te+.5,be-1,Math.max(1,Me-1),Re),ke.stroke())}else{const Ge=Qn("var(--note-base, #d1d5db)");Tn(ke,_e,Te,be,Me,ee,A.color??Ge,A.highlight,A.glow,A.glass,W,A.patternColor,A.patternOnly,Y,w),Le.length>0&&(ke.save(),me(ke,_e,Te,be,Me,Re),ke.clip(),Le.forEach(ze=>{const tt=Math.max(1,ze.x2-ze.x1);Tn(ke,ze.x1,Te,tt,Me,_,E.color??q,E.highlight,E.glow,E.glass,V,E.patternColor,E.patternOnly,F,Z)}),ke.restore())}Et&&(Et.fillStyle=ve.resolveCssColor("var(--nice-bg, #fff)",Et.canvas),Et.fillRect(_e,Te,be,Me))})};if(a.forEach(ke=>{ht(e,t,n-we,ke,ge,he,we);for(const Ce of ke)if(s>=Ce.startTime&&s<=Ce.startTime+Ce.duration){He=$e(Ce.pitch),Lt=!0,ct=!!Ce.isGold;break}}),!Lt){let ke=null,Ce=null;for(const We of a)for(const De of We)De.startTime>s&&(!ke||De.startTime<ke.startTime)&&(ke=De),De.startTime<=s&&(!Ce||De.startTime>Ce.startTime)&&(Ce=De);ke?(He=$e(ke.pitch),ct=!!ke.isGold):Ce?(He=$e(Ce.pitch),ct=!!Ce.isGold):He=n*.5}const it=$||X("var(--nice-color-accent, #ffcc00)"),wt=1+Math.sin((s||0)*8)*.06,Je=Ie*wt,Pt=[];for(const ke of a)for(const Ce of ke){if(Ce.startTime+Ce.duration<ge||Ce.startTime>he)continue;const We=(Ce.startTime-ge)/(he-ge)*t,De=Ce.duration/(he-ge)*t,Ae=$e(Ce.pitch)-Me/2,Ee=Ce.startTime+Ce.duration<=s;Pt.push({x:We,y:Ae,w:De,h:Me,isGold:Ce.isGold,isSung:Ee})}if(!Zu(M||"ball",{ctx:e,ballX:Be,ballY:He,ballRadius:Je,playerColor:it,ballIsGold:ct,currentTime:s,height:n,visibleNotes:Pt})){Mt&&e.drawImage(Mt,0,0),bt&&e.drawImage(bt,0,0),e.save(),e.globalCompositeOperation="source-over",e.globalAlpha=.28;const ke=Math.max(18,Je*5),Ce=e.createRadialGradient(Be,He,0,Be,He,ke);if(Ce.addColorStop(0,it),Ce.addColorStop(1,"transparent"),e.fillStyle=Ce,e.beginPath(),e.arc(Be,He,ke,0,Math.PI*2),e.fill(),e.restore(),y&&nt&&pt&&(nt.save(),nt.globalCompositeOperation="source-over",nt.globalAlpha=.95,nt.fillStyle=it,nt.beginPath(),nt.arc(Be,He,Je+4,0,Math.PI*2),nt.fill(),nt.restore(),nt.save(),nt.globalCompositeOperation="destination-in",nt.drawImage(pt,0,0),nt.restore(),e.drawImage(Mt,0,0)),y&&Ve&&pt)try{const Ae=Qn(it),{h:Ee,s:de,l:me}=rh(Ae),Ne=ah(Ee,Math.max(10,Math.round(de*(typeof h=="number"?h:.25))),me,.85);Ve.save(),Ve.globalCompositeOperation="multiply",Ve.globalAlpha=.65,Ve.fillStyle=Ne,Ve.beginPath(),Ve.arc(Be,He,Math.max(8,Je+6),0,Math.PI*2),Ve.fill(),Ve.restore(),Ve.save(),Ve.globalCompositeOperation="destination-out",Ve.drawImage(pt,0,0),Ve.restore(),e.drawImage(bt,0,0)}catch{Ve.save(),Ve.globalCompositeOperation="source-over",Ve.globalAlpha=.6,Ve.fillStyle=it,Ve.beginPath(),Ve.arc(Be,He,Math.max(8,Je+6),0,Math.PI*2),Ve.fill(),Ve.restore(),Ve.save(),Ve.globalCompositeOperation="destination-out",Ve.drawImage(pt,0,0),Ve.restore(),e.drawImage(bt,0,0)}const We=m&&m.shadowColor?m.shadowColor:_s,De=m&&typeof m.glowBlur=="number"?m.glowBlur:Ls;e.save(),ct?(e.shadowColor=We,e.shadowBlur=De,e.fillStyle=X("var(--gold-light, #FFF0A8)")):(e.shadowColor=it,e.shadowBlur=10,e.fillStyle=it),e.globalCompositeOperation="source-over",e.globalAlpha=1,e.beginPath(),e.arc(Be,He,Je,0,Math.PI*2),e.fill(),e.lineWidth=1.5,e.strokeStyle=X("var(--nice-shadow-md, rgba(0,0,0,0.35))"),e.stroke(),e.restore()}try{if(Array.isArray(x)&&x.length>0){const ke=Date.now(),Ce=m&&typeof m.lifeMs=="number"?m.lifeMs:Xu,We=(Ae,Ee,de,me=5)=>{const Re=de,Ne=de*.45;e.beginPath();let _e=Math.PI/2*3,be=Ae,Te=Ee;const Le=Math.PI/me;e.moveTo(Ae,Ee-Re);for(let Ge=0;Ge<me;Ge++)be=Ae+Math.cos(_e)*Re,Te=Ee+Math.sin(_e)*Re,e.lineTo(be,Te),_e+=Le,be=Ae+Math.cos(_e)*Ne,Te=Ee+Math.sin(_e)*Ne,e.lineTo(be,Te),_e+=Le;e.lineTo(Ae,Ee-Re),e.closePath()},De=Ae=>{let Ee=Ae>>>0;return()=>(Ee=Ee*1664525+1013904223>>>0,(Ee&2147483647)/2147483647)};x.forEach(Ae=>{const Ee=ke-Ae.createdAt;if(Ee<0||Ee>Ce)return;const de=Ee/Ce,me=(Ae.noteStart-(s-2))/7*t,Re=$e(Ae.notePitch),Ne=De(Ae.seed||Math.floor(Ae.createdAt%1e5)),_e=m&&typeof m.count=="number"?m.count:Qu,be=m&&typeof m.baseSpeed=="number"?m.baseSpeed:Ju,Te=m&&typeof m.baseSize=="number"?m.baseSize:eh;for(let Le=0;Le<_e;Le++){const Ge=Ne(),ze=Ne(),tt=Le/_e*Math.PI*2+Ge*Math.PI*.6+de*1.5,Ke=6+be*(1-de)*(.5+ze*.8),Wt=me+Math.cos(tt)*Ke,Qt=Re+Math.sin(tt)*Ke*(.8+Ge*.6),Ct=Math.max(1,Te*(1-de)*(.5+ze)),fs=40+Math.round(20*Ne()),ms=70+Math.round(20*Ne()),Vr=Math.max(0,1-de)*(.9-Ne()*.3),Ec=Math.max(6,Ct*2.6),qr=nh(fs,ms,60,Math.round(Ec),(Ae.seed||0)+Le);qr&&qr.complete?(e.save(),e.translate(Wt,Qt+4),e.rotate(tt+de*4+(Ne()-.5)*1.2),e.globalAlpha=Vr,e.drawImage(qr,-Ct/2,-Ct/2,Ct,Ct),e.restore()):(e.save(),e.translate(Wt,Qt+4),e.rotate(tt+de*4),e.fillStyle=`hsla(${fs}, ${ms}%, 60%, ${Vr})`,e.fillRect(-Ct/2,-Ct/2,Ct,Ct),e.restore()),Ne()>.85&&(e.save(),e.globalAlpha=Math.max(.35,1-de),e.fillStyle=`hsla(${30+Math.round(10*Ne())}, ${60+Math.round(30*Ne())}%, ${70+Math.round(10*Ne())}%, ${Vr})`,e.strokeStyle=`rgba(0,0,0,${.12*(1-de)})`,e.lineWidth=.8,We(Wt,Qt+4,Ct*(1.4+Ne())),e.fill(),e.stroke(),e.restore())}})}}catch{}return{ballX:Be,ballY:He,ballIsGold:ct}},To=({song:e,currentTime:t,playerRef:n,config:a={},userPitch:s,segmentScores:i,goldBursts:o,combo:l,verseRatings:c})=>{const{t:u}=xe(),{isPlaying:h=!1,playerName:p=u("karaokeTimeline.defaultPlayer","Player"),score:g=1e4,playerBgColor:y="var(--karaoke-player-bg, #2196f3)",playerCount:m=2,gapDesaturation:x,goldSettings:b,difficultyLevel:f,algorithmLabel:j,algorithmColor:v,latencyMs:C=null,top:N,animationMode:M,karaokeSettings:k=null}=a,T=d.useRef(null),E=d.useRef(null),[A,I]=d.useState({width:600,height:150,top:250,visibleWidth:600}),[L,P]=d.useState(0),_=d.useRef(0),ee=d.useRef(null),K=d.useRef(null),z=d.useRef(null),V=d.useRef(t),W=d.useRef(performance.now()),H=d.useRef(e),G=d.useRef(A),Z=d.useRef(s),w=d.useRef(h),R=d.useRef(0),S=d.useRef(!1),F=d.useRef(null),Y=d.useRef(null),O=d.useCallback(()=>{const U=(e==null?void 0:e.id)??null;if(U!==Y.current||!F.current){Y.current=U;const $=e.notes.map(D=>D.noteLine);F.current=Hn($,e.bpm??void 0);const q=F.current.reduce((D,J)=>D+J.length,0),X=F.current.reduce((D,J)=>D+J.filter(ae=>ae.isGold).length,0),re=F.current.flat().map(D=>D.pitch),oe=re.length?Math.min(...re):0,se=re.length?Math.max(...re):0;ha("BARS",`Parsed notes for "${e.title}" — ${F.current.length} verses, ${q} notes (including ${X} golden), pitch range: ${oe}–${se}, BPM: ${e.bpm??"?"}, GAP: ${e.gap??0}ms`,{rawLinesCount:$.length,verseCount:F.current.length,totalNotes:q,goldCount:X,minPitch:oe,maxPitch:se})}return F.current},[e]);return d.useEffect(()=>{const U=(q,X,re)=>q+(X-q)*re,$=q=>{K.current===null&&(K.current=q);const X=Math.min(.1,(q-(K.current||q))/1e3);K.current=q;const re=R.current,oe=_.current,se=1-Math.exp(-12*X),D=Math.abs(oe-re)<.25?oe:U(re,oe,se);Math.abs(D-re)>1e-4&&(P(D),R.current=D,T.current&&(T.current.style.transform=`translateX(${D}px)`)),ee.current=requestAnimationFrame($)};return ee.current=requestAnimationFrame($),()=>{ee.current&&cancelAnimationFrame(ee.current),ee.current=null,K.current=null}},[]),d.useEffect(()=>{const U=()=>{if(!n.current)return;const $=n.current.getBoundingClientRect(),q=2/Math.max(1,m),X=Math.round($.width*q),re=Math.round($.width),oe=X*(150/600);I({width:X,height:oe,top:30,visibleWidth:re})};return U(),window.addEventListener("resize",U),()=>window.removeEventListener("resize",U)},[n,m]),d.useEffect(()=>{var re;if(h||!T.current)return;const U=T.current.getContext("2d");if(!U)return;const $=O(),q=t-(e.gap??0)/1e3,X=ma(U,A.width,A.height,$,q,p,g,y,s,e.id,x??void 0,i,f??void 0,h,b??void 0,o,j,v,R.current,A.visibleWidth,l,c,M,k);if(X&&T.current){const oe=A.visibleWidth||(((re=E.current)==null?void 0:re.getBoundingClientRect().width)??A.width),se=A.width;let D=Math.round(oe/2-X.ballX);const J=oe-se;D=Math.max(J,Math.min(0,D)),_.current=D}},[t,e,O,A,s,h,p,g,y,x,i,f,b,o,j,v,l,c,M,k]),d.useEffect(()=>{V.current=t,W.current=performance.now()},[t]),d.useEffect(()=>{H.current=e},[e]),d.useEffect(()=>{G.current=A},[A]),d.useEffect(()=>{Z.current=s},[s]),d.useEffect(()=>{w.current=h},[h]),d.useEffect(()=>{const U=()=>{var ce;const $=T.current,q=H.current,X=G.current;if(!$||!q||!X)return;const re=$.getContext("2d");if(!re)return;const oe=O(),se=Math.min(.5,(performance.now()-W.current)/1e3),J=(w.current?V.current+se:V.current)-(q.gap??0)/1e3,ae=ma(re,X.width,X.height,oe,J,p,g,y,Z.current,q.id,x??void 0,i,f??void 0,w.current,b??void 0,o,j,v,R.current,X.visibleWidth,l,c,M,k);if(ae){const le=X.visibleWidth||(((ce=E.current)==null?void 0:ce.getBoundingClientRect().width)??X.width),ne=X.width;let pe=Math.round(le/2-ae.ballX);const fe=le-ne;pe=Math.max(fe,Math.min(0,pe)),_.current=pe}};if(h){S.current||(S.current=!0,ha("BARS",`Drawing bars in RAF loop — canvas: ${G.current.width}×${G.current.height}px, player: ${p}`,{canvasSize:G.current}));const $=()=>{U(),z.current=requestAnimationFrame($)};return z.current=requestAnimationFrame($),()=>{z.current&&cancelAnimationFrame(z.current),z.current=null}}S.current=!1},[h,p,g,y,x,i,f,b,o,j,v,l,c,M,k,O]),r.jsxs("div",{ref:E,style:{position:"absolute",left:"50%",top:`${N??A.top}px`,transform:"translateX(-50%)",zIndex:10,pointerEvents:"none",background:"transparent",width:A.visibleWidth,height:A.height,overflow:"hidden"},children:[r.jsx("style",{children:"@keyframes av-latency-pulse {0% { transform: scale(1); box-shadow: 0 4px 10px var(--nice-overlay-20, rgba(0, 0, 0, 0.2));} 50% { transform: scale(1.08); box-shadow: 0 8px 18px var(--nice-overlay-30, rgba(0,0,0,0.32));} 100% { transform: scale(1); box-shadow: 0 4px 10px var(--nice-overlay-20, rgba(0, 0, 0, 0.2));} } .av-latency-pulse { animation: av-latency-pulse 1s ease-in-out infinite; }"}),r.jsx("div",{style:{position:"absolute",right:8,top:6,zIndex:40,pointerEvents:"none",display:"flex",alignItems:"center",gap:8,fontSize:12,color:"var(--nice-text-inverse, #fff)"},children:typeof C<"u"&&C!==null?(()=>{const U=C,$=U<=120?"var(--latency-good, #10b981)":U<=250?"var(--latency-warn, #f59e0b)":"var(--latency-bad, #ef4444)",q=`${U}ms`;return r.jsxs("div",{className:U>250?"av-latency-pulse":"",style:{background:$,padding:"6px 10px",borderRadius:12,boxShadow:"0 4px 10px var(--nice-overlay-35, rgba(0, 0, 0, 0.35))",fontWeight:700,minWidth:56,textAlign:"center",display:"flex",alignItems:"center",gap:6},children:[r.jsx(B.NtdStopwatch,{size:12}),r.jsx("span",{children:q})]})})():r.jsx("div",{style:{background:"var(--latency-none-bg, rgba(75,85,99,0.9))",padding:"6px 8px",borderRadius:12,boxShadow:"0 4px 10px var(--nice-overlay-35, rgba(0, 0, 0, 0.35))",minWidth:44,textAlign:"center"},children:"—"})}),r.jsx("canvas",{ref:T,width:A.width,height:A.height,role:"img","aria-label":u("karaokeTimeline.pitchTimelineFor","Pitch timeline for {player}. Score: {score}").replace("{player}",p).replace("{score}",String(g??0)),style:{position:"absolute",left:0,top:0,transform:`translateX(${L}px)`,willChange:"transform"}})]})},Po="/textures/seamless/256x256";function $t(e,t,n){return{name:e,icon:n,entries:Array.from({length:t},(a,s)=>{const i=String(s+1).padStart(2,"0");return{label:`${e} ${i}`,url:`${Po}/${e}/Photoreal_${e}_${i}-512x512.png`}})}}function _t(e,t,n){return{name:e,icon:n,entries:Array.from({length:t},(a,s)=>{const i=String(s+1).padStart(2,"0");return{label:`${e} ${i}`,url:`${Po}/${e}/${e}_${i}-256x256.png`}})}}const Ha=[$t("Fire",8,"fire"),$t("Metal",8,"metal"),$t("Ice",8,"ice"),$t("Stone",8,"stone"),$t("Wood",8,"wood"),$t("Tile",8,"tile"),$t("Concrete",8,"concrete"),$t("Trees",8,"trees"),$t("Grass",8,"grass"),_t("Wall",24,"wall"),_t("Rust",24,"rust"),_t("Woven",24,"woven"),_t("Ground",24,"ground"),_t("Pebbles",24,"pebbles"),_t("Plant",24,"plant"),_t("Roof",24,"roof"),_t("Misc",24,"misc")],Eo=Ha.flatMap(e=>e.entries);function ch(e){return Eo.find(t=>t.url===e)}const dh={fire:B.NtdFire,metal:B.NtdSettings,ice:B.NtdSnowflake,stone:B.NtdMountain,wood:B.NtdTree,tile:B.NtdGrid,concrete:B.NtdLayers,trees:B.NtdTree,grass:B.NtdLeaf,wall:B.NtdHome,rust:B.NtdCircle,woven:B.NtdGrid,ground:B.NtdMountain,pebbles:B.NtdDroplet,plant:B.NtdLeaf,roof:B.NtdHome,misc:B.NtdPalette},uh=({icon:e})=>{const t=dh[e];return t?r.jsx(t,{size:14}):r.jsx(r.Fragment,{children:e})},At=({children:e,inline:t,strong:n})=>r.jsx("div",{style:{fontSize:13,fontWeight:n?600:void 0,color:"var(--nice-text-secondary, #ccc)",marginBottom:t?0:4},children:e}),hh=({fill:e=Gt,onChange:t=()=>{},previewColor:n="var(--nice-primary, #2196f3)",accentColor:a="var(--nice-primary, #0d6efd)",width:s,height:i})=>{const{t:o}=xe(),[l,c]=d.useState(null),u=(f,j)=>{t({...e,[f]:j})},h=d.useMemo(()=>{const f=e.color||n||"var(--nice-primary, #2196f3)";return(j,v,C)=>{const N=Wn.find(k=>k.name===j)||Wn[0],M=v?Pr.find(k=>k.name===v)??null:null;return Mo({width:80,height:22,capStyle:N,color:f,highlight:e.highlight,glow:e.glow,glass:e.glass,pattern:M,patternColor:e.patternColor,patternOnly:e.patternOnly,textureUrl:C??null,textureScale:e.textureScale})}},[e,n]),p=`2px solid ${a}`,g=a==="var(--nice-warning-dark, #d4a017)"?"var(--nice-warning-bg, #fff8e1)":"var(--nice-info-bg, #e7f1ff)",y=d.useRef(null),m=d.useRef(null),x=d.useCallback((f,j)=>{f.current&&f.current.scrollBy({left:j*180,behavior:"smooth"})},[]),b={position:"absolute",top:0,width:28,height:"100%",border:"none",cursor:"pointer",zIndex:2,display:"flex",alignItems:"center",justifyContent:"center",fontSize:18,fontWeight:700,color:"var(--nice-color-white, #ccc)",background:"linear-gradient(90deg, var(--nice-overlay-90, rgba(30, 30, 30, 0.9)) 60%, transparent)"};return r.jsxs("div",{style:{padding:"4px 0",width:"100%",minWidth:0},children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8},children:[r.jsx(At,{inline:!0,children:o("playerForm.barColor","Color")}),r.jsx(ie.NiceCheckbox,{label:o("playerForm.auto","Auto"),checked:!e.color,onChange:f=>u("color",f?null:n||"var(--nice-primary, #2196f3)")}),e.color&&r.jsx("input",{type:"color",value:e.color,onChange:f=>u("color",f.target.value),style:{width:32,height:28,border:"none",padding:0,cursor:"pointer"}})]}),r.jsx(At,{children:o("playerForm.capShape","Cap shape")}),r.jsxs("div",{style:{position:"relative",marginBottom:10},children:[r.jsx("button",{type:"button",style:{...b,left:0,borderRadius:"6px 0 0 6px"},onClick:()=>x(y,-1),"aria-label":o("playerForm.scrollLeft","Scroll left"),children:r.jsx(B.NtdChevronLeft,{size:16})}),r.jsx("button",{type:"button",style:{...b,left:"auto",right:0,borderRadius:"0 6px 6px 0",background:"linear-gradient(270deg, var(--nice-overlay-90, rgba(30, 30, 30, 0.9)) 60%, transparent)"},onClick:()=>x(y,1),"aria-label":o("playerForm.scrollRight","Scroll right"),children:r.jsx(B.NtdChevronRight,{size:16})}),r.jsx("div",{ref:y,style:{display:"flex",gap:6,overflowX:"auto",scrollBehavior:"smooth",padding:"4px 32px",scrollbarWidth:"none"},children:Wn.map(f=>{const j=e.capStyleName===f.name;return r.jsx("div",{role:"button",tabIndex:0,"aria-pressed":j,onKeyDown:ie.clickOnActivationKey,title:f.name,onClick:()=>u("capStyleName",f.name),style:{cursor:"pointer",flexShrink:0,border:j?p:"1px solid var(--nice-border-color, #555)",borderRadius:6,padding:3,background:j?g:"var(--nice-bg-secondary, #222)"},dangerouslySetInnerHTML:{__html:h(f.name,null)}},f.name)})})]}),r.jsx(At,{children:o("playerForm.pattern","Pattern")}),r.jsxs("div",{style:{position:"relative",marginBottom:10},children:[r.jsx("button",{type:"button",style:{...b,left:0,borderRadius:"6px 0 0 6px"},onClick:()=>x(m,-1),"aria-label":o("playerForm.scrollLeft","Scroll left"),children:r.jsx(B.NtdChevronLeft,{size:16})}),r.jsx("button",{type:"button",style:{...b,left:"auto",right:0,borderRadius:"0 6px 6px 0",background:"linear-gradient(270deg, var(--nice-overlay-90, rgba(30, 30, 30, 0.9)) 60%, transparent)"},onClick:()=>x(m,1),"aria-label":o("playerForm.scrollRight","Scroll right"),children:r.jsx(B.NtdChevronRight,{size:16})}),r.jsxs("div",{ref:m,style:{display:"flex",gap:6,overflowX:"auto",scrollBehavior:"smooth",padding:"4px 32px",scrollbarWidth:"none"},children:[r.jsx("div",{role:"button",tabIndex:0,"aria-pressed":!e.patternName,onKeyDown:ie.clickOnActivationKey,title:o("playerForm.none","None"),onClick:()=>u("patternName",null),style:{cursor:"pointer",flexShrink:0,border:e.patternName?"1px solid var(--nice-border-color, #555)":p,borderRadius:6,padding:"3px 8px",background:e.patternName?"var(--nice-text, #222)":g,fontSize:12,lineHeight:"22px",color:"var(--nice-text-inverse, #ccc)"},children:"—"}),Pr.map(f=>{const j=e.patternName===f.name;return r.jsx("div",{role:"button",tabIndex:0,"aria-pressed":j,onKeyDown:ie.clickOnActivationKey,title:f.name,onClick:()=>u("patternName",f.name),style:{cursor:"pointer",flexShrink:0,border:j?p:"1px solid var(--nice-border-color, #555)",borderRadius:6,padding:3,background:j?g:"var(--nice-bg-secondary, #222)"},dangerouslySetInnerHTML:{__html:h(e.capStyleName,f.name)}},f.name)})]})]}),r.jsx("div",{style:{marginBottom:8},children:r.jsx(ie.NiceToggle,{label:o("playerForm.patternOnly","Pattern only (flat, no 3D)"),checked:e.patternOnly,onChange:f=>u("patternOnly",f)})}),r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:10},children:[r.jsx(At,{inline:!0,children:o("playerForm.patternColor","Pattern color")}),r.jsx(ie.NiceCheckbox,{label:o("playerForm.auto","Auto"),checked:!e.patternColor,onChange:f=>u("patternColor",f?null:n||"var(--nice-bg, #fff)")}),e.patternColor&&r.jsx("input",{type:"color",value:e.patternColor,onChange:f=>u("patternColor",f.target.value),style:{width:32,height:28,border:"none",padding:0,cursor:"pointer"}})]}),!e.patternOnly&&r.jsxs(r.Fragment,{children:[r.jsxs(At,{children:[o("playerForm.highlight","Highlight"),": ",e.highlight,"%"]}),r.jsx("div",{style:{marginBottom:8},children:r.jsx(ie.NiceSlider,{min:0,max:100,value:e.highlight,onChange:f=>u("highlight",f)})}),r.jsxs(At,{children:[o("playerForm.glow","Glow"),": ",e.glow,"%"]}),r.jsx("div",{style:{marginBottom:8},children:r.jsx(ie.NiceSlider,{min:0,max:100,value:e.glow,onChange:f=>u("glow",f)})})]}),r.jsxs(At,{children:[o("playerForm.glass","Transparency (glass)"),": ",e.glass,"%"]}),r.jsx("div",{style:{marginBottom:8},children:r.jsx(ie.NiceSlider,{min:0,max:100,value:e.glass,onChange:f=>u("glass",f)})}),r.jsx("div",{style:{marginTop:4},children:r.jsx(At,{strong:!0,children:o("playerForm.texture","Texture")})}),r.jsxs("div",{style:{marginBottom:6},children:[r.jsxs("div",{style:{display:"flex",gap:4,flexWrap:"wrap",marginBottom:6},children:[r.jsx(ie.NiceButton,{size:"sm",variant:e.textureUrl?"outline":"primary",onClick:()=>{u("textureUrl",null),c(null)},children:o("playerForm.texNone","None")}),Ha.map(f=>r.jsx(ie.NiceButton,{size:"sm",variant:(l==null?void 0:l.name)===f.name?"primary":"outline",onClick:()=>c(j=>(j==null?void 0:j.name)===f.name?null:f),title:f.name,ariaLabel:f.name,children:r.jsx(uh,{icon:f.icon})},f.name))]}),l&&r.jsx("div",{style:{display:"flex",gap:4,flexWrap:"wrap",maxHeight:130,overflowY:"auto",padding:4,border:"1px solid var(--nice-border, #dee2e6)",borderRadius:6,background:"var(--nice-bg-secondary, #f8f9fa)"},children:l.entries.map(f=>{const j=e.textureUrl===f.url;return r.jsx("div",{role:"button",tabIndex:0,"aria-pressed":j,onKeyDown:ie.clickOnActivationKey,title:f.label,onClick:()=>u("textureUrl",j?null:f.url),style:{width:48,height:48,borderRadius:6,cursor:"pointer",border:j?`3px solid ${a}`:"1px solid var(--nice-text-muted, #bbb)",backgroundImage:`url(${f.url})`,backgroundSize:"cover",boxShadow:j?`0 0 6px ${a}`:void 0}},f.url)})}),e.textureUrl&&r.jsxs("div",{style:{marginTop:4,display:"flex",alignItems:"center",gap:8},children:[r.jsx("div",{style:{width:80,height:22,borderRadius:6,backgroundImage:`url(${e.textureUrl})`,backgroundSize:`${Math.round(256*e.textureScale)}px`,border:"1px solid var(--nice-border-color, #aaa)"}}),r.jsx("span",{style:{fontSize:11,color:"var(--nice-text-secondary, #666)"},children:e.textureUrl.split("/").pop()})]})]}),e.textureUrl&&r.jsxs(r.Fragment,{children:[r.jsxs(At,{children:[o("playerForm.textureScale","Texture scale"),": ",e.textureScale.toFixed(1),"×"]}),r.jsx("div",{style:{marginBottom:8},children:r.jsx(ie.NiceSlider,{min:10,max:200,step:10,value:Math.round(e.textureScale*100),onChange:f=>u("textureScale",f/100)})})]})]})},rt=st.scoped("AudioPitchAnalyzer");function ph({onSegments:e,defaultCompareAll:t=!1,externalFile:n=null,postPitch:a,postLibrosaPitchTrack:s}){const{t:i}=xe(),[o,l]=d.useState("pitchy"),[c,u]=d.useState(null),[h,p]=d.useState(t),[g,y]=d.useState({}),[m,x]=d.useState({}),[b,f]=d.useState([]),[j,v]=d.useState([]),[C,N]=d.useState(!1),[M,k]=d.useState(null),[T]=d.useState(null),[E]=d.useState(null),[A,I]=d.useState(null),L=d.useRef(null);function P(G){try{if(G instanceof Error){let w=`${G.message}
40
+ ${G.stack??""}`;const R=G;if(R!=null&&R.attemptedUrls)try{w+=`
41
+ Attempted URLs: ${Array.isArray(R.attemptedUrls)?R.attemptedUrls.join(", "):String(R.attemptedUrls)}`}catch{w+=`
42
+ Attempted URLs: ${String(R.attemptedUrls)}`}return w}const Z=G;return Z!=null&&Z.attemptedUrls?`Error: ${String(Z.message??Z)}
43
+ Attempted URLs: ${Array.isArray(Z.attemptedUrls)?Z.attemptedUrls.join(", "):String(Z.attemptedUrls)}`:String(G)}catch{return i("audioPitch.unknownError","Unknown error")}}function _(G){if(!G||G<=0)return null;const Z=12*Math.log2(G/440)+69;return Math.round(Z-12)}async function ee(G){var w;const Z=(w=G.target.files)==null?void 0:w[0];Z&&await K(Z,h)}async function K(G,Z){k(null),v([]),N(!0);try{const w=await G.arrayBuffer(),R=window.AudioContext??window.webkitAudioContext,F=await new R().decodeAudioData(w),Y=F.getChannelData(0);u(Y);const O=F.sampleRate,U=Math.floor(O*.1),$=U,q=()=>{const J=[],ae=la.PitchDetector.forFloat32Array(U);for(let ce=0;ce<Y.length-U;ce+=$){const le=Y.slice(ce,ce+U),[ne,pe]=ae.findPitch(le,O),fe=_(ne);fe&&ne>50&&ne<2e3&&pe>.7&&J.push({start:ce/O,duration:U/O,pitch:fe,freq:ne})}return J},X=()=>{const J=[];for(let ae=0;ae<Y.length-U;ae+=$){const ce=Y.slice(ae,ae+U),le=V(ce,O),ne=_(le);ne&&le>50&&le<2e3&&J.push({start:ae/O,duration:U/O,pitch:ne,freq:le})}return J};if(Z){N(!0),k(null);const J={};try{const ae={};try{J.pitchy=q(),ae.pitchy=null}catch(ce){J.pitchy=[],ae.pitchy=P(ce),rt.warn("pitchy failed",ce)}try{J["ultrastar-wp"]=X(),ae["ultrastar-wp"]=null}catch(ce){J["ultrastar-wp"]=[],ae["ultrastar-wp"]=P(ce),rt.warn("ultrastar-wp failed",ce)}J.aubio=[],ae.aubio="disabled";try{if(!a)throw new Error("CREPE backend not configured");const le=(await a(G)).track??[];J.crepe=le.map((ne,pe)=>{var fe;return{start:ne.t,duration:(fe=le[pe+1])!=null&&fe.t?le[pe+1].t-ne.t:.1,pitch:_(ne.hz)??0,freq:ne.hz}}),ae.crepe=null}catch(ce){J.crepe=[],ae.crepe=P(ce),rt.warn("crepe failed",ce)}try{if(!s)throw new Error("Librosa backend not configured");const le=(await s(new File([G],G.name,{type:G.type}))).track??[];J.librosa=le.map((ne,pe)=>{var fe;return{start:ne.t,duration:(fe=le[pe+1])!=null&&fe.t?le[pe+1].t-ne.t:.1,pitch:_(ne.hz)??0,freq:ne.hz}}),ae.librosa=null}catch(ce){J.librosa=[],ae.librosa=P(ce),rt.warn("librosa failed",ce)}x(ae),y(J),v(J[o]??[])}catch(ae){rt.error("compareAll overall failed",ae);const ce=ae instanceof Error?ae.message:String(ae);k(i("audioPitch.errorComparing","Error comparing algorithms: ")+ce)}finally{N(!1)}return}const re=[],oe=[];let se=0;if(o==="pitchy"){const J=la.PitchDetector.forFloat32Array(U);for(let ae=0;ae<Y.length-U;ae+=$){const ce=Y.slice(ae,ae+U);let le=0;for(let ge=0;ge<ce.length;ge++)le+=ce[ge]*ce[ge];le=Math.sqrt(le/ce.length),oe.push(le);const[ne,pe]=J.findPitch(ce,O),fe=_(ne);fe&&ne>50&&ne<2e3&&pe>.7&&(re.push({start:ae/O,duration:U/O,pitch:fe,freq:ne}),se++)}}else if(o==="crepe")try{if(!a)throw new Error("CREPE backend not configured");const J=await a(G);if(!J.track||J.track.length===0)k(i("audioPitch.crepeNoNotes","CREPE detected no notes")),rt.warn("Crepe: No notes detected in audio file.");else{const ae=J.track.map((ce,le)=>{const ne=_(ce.hz);return ne&&ce.hz>50&&ce.hz<2e3?{start:ce.t,duration:le<J.track.length-1?J.track[le+1].t-ce.t:.1,pitch:ne,freq:ce.hz}:null}).filter(ce=>ce!==null);if(v(ae),e)try{e(ae)}catch(ce){rt.error("Error in onSegments:",ce)}f([]),u(null);return}}catch(J){k(i("audioPitch.crepeBackendError","CREPE backend error")),I(P(J)),rt.error("Crepe: Error calling backend:",J)}else if(o==="librosa")try{await z(G),f([]),u(null);return}catch(J){k(i("audioPitch.librosaBackendError","Librosa backend error")),I(P(J)),rt.error("Librosa: Error calling backend:",J)}else if(o==="ultrastar-wp")for(let J=0;J<Y.length-U;J+=$){const ae=Y.slice(J,J+U);let ce=0;for(let pe=0;pe<ae.length;pe++)ce+=ae[pe]*ae[pe];ce=Math.sqrt(ce/ae.length),oe.push(ce);const le=V(ae,O),ne=_(le);ne&&le>50&&le<2e3&&(re.push({start:J/O,duration:U/O,pitch:ne,freq:le}),se++)}f(oe);const D=W(re);if(v(D),e)try{e(D)}catch(J){rt.error("Error in onSegments:",J)}D.length===0&&o!=="crepe"&&(k(i("audioPitch.noNotesDetected","No notes detected")),rt.warn("No notes detected in audio file."))}catch(w){k(i("audioPitch.errorAnalyzing","Error analyzing the file: ")+(w instanceof Error?w.message:String(w))),I(P(w)),rt.error("Error analyzing audio file:",w)}finally{N(!1)}}d.useEffect(()=>{n&&K(n,!0)},[n]);async function z(G){try{if(!s)throw new Error("Librosa backend not configured");const Z=new File([G],"capture.wav",{type:"audio/wav"}),R=((await s(Z)).track??[]).map(S=>({t:S.t,hz:S.hz}));if(e){const S=R.map((F,Y)=>{var $;const O=(($=R[Y+1])==null?void 0:$.t)??F.t+.1,U=_(F.hz)??0;return{start:F.t,duration:Math.max(.05,O-F.t),pitch:U,freq:F.hz}});e(S),v(S)}}catch(Z){rt.warn("Librosa analysis failed, falling back to local detectors",Z);const R=(typeof Z=="object"&&Z!==null?Z:{}).attemptedUrls;R&&rt.error("Librosa attempted URLs:",R);const S=R?Array.isArray(R)?R.join(", "):String(R):null,F=Z instanceof Error?Z.message:String(Z);k(i("audioPitch.librosaBackendError","Librosa backend error")+": "+F+(S?" (attempted: "+S+")":"")),I(P(Z))}}function V(G,Z){const S=Math.floor(Z/50),F=Math.max(2,Math.floor(Z/2e3));let Y=0;for(let q=0;q<G.length;q++)Y+=G[q]*G[q];if(Y<=1e-8)return 0;let O=-1,U=0;const $=1e-10;for(let q=F;q<=Math.min(S,G.length-2);q++){let X=0;const re=G.length-q;for(let se=0;se<re;se++)X+=G[se]*G[se+q];const oe=X/(re+$)/(Y/G.length+$);oe>U&&(U=oe,O=q)}return O>0&&U>.01?Z/O:0}function W(G){if(G.length===0)return[];const Z=[];let w=G[0];for(let R=1;R<G.length;R++){const S=G[R];S.pitch===w.pitch&&Math.abs(S.freq-w.freq)<1?w.duration+=S.duration:(Z.push(w),w=S)}return Z.push(w),Z}function H(){try{const G=Object.keys(g).length>0?Object.keys(g):["pitchy","ultrastar-wp","aubio","crepe","librosa"],Z=(()=>{let se=0;for(const D of G){const J=g[D]??[];for(const ae of J)se=Math.max(se,ae.start+(ae.duration||0))}return se||0})(),w=(se,D)=>!se||!D?1/0:1200*Math.log2(se/D),R=(se,D)=>{if(!se||!D)return!1;const J=Math.round(Math.log2(D/se)),ae=se*Math.pow(2,J),ce=Math.abs(w(ae,D));return Math.abs(J)>=1&&ce<50},S=se=>{const D={count:0,totalDur:0,meanFreq:0,stdFreq:0,meanDur:0,voicedFraction:null};if(!se||se.length===0)return D;D.count=se.length,D.totalDur=se.reduce((le,ne)=>le+(ne.duration||0),0);const J=se.map(le=>le.freq).filter(Boolean);if(J.length===0)return D;const ae=J.reduce((le,ne)=>le+ne,0)/J.length,ce=J.reduce((le,ne)=>le+(ne-ae)*(ne-ae),0)/J.length;return D.meanFreq=ae,D.stdFreq=Math.sqrt(ce||0),D.meanDur=D.totalDur/D.count,D.voicedFraction=Z>0?D.totalDur/Z:null,D},F=(se,D)=>{let J=0,ae=0;const ce=[];for(const ne of se){const pe=ne.start,fe=ne.start+(ne.duration||.05);let ge=null,he=0;for(const we of D){const je=we.start,Pe=we.start+(we.duration||.05),$e=Math.max(0,Math.min(fe,Pe)-Math.max(pe,je));$e>he&&(he=$e,ge=we)}if(ge&&he>0){const we=Math.abs(w(ne.freq,ge.freq));ce.push(we),we<50&&J++,R(ne.freq,ge.freq)&&ae++}}const le=ce.length?ce.reduce((ne,pe)=>ne+pe,0)/ce.length:null;return{matches:J,compared:se.length,meanCents:le,octaveErrors:ae}},Y=[];Y.push("# AudioPitchAnalyzer — Comparative Report"),Y.push(`Generated: ${new Date().toISOString()}`),Y.push(""),Y.push("## Summary"),Y.push(`- Selected algorithm in UI: **${o}**`),Y.push(`- Total analyzed duration (approx): **${Z.toFixed(3)} s**`),Y.push(""),Y.push("## Per-algorithm statistics"),Y.push("| Algorithm | Segments | Total voiced (s) | Voiced fraction | Mean freq (Hz) | Std freq (Hz) | Mean dur (s) |"),Y.push("|---|---:|---:|---:|---:|---:|---:|");const O={};for(const se of G){const D=g[se]??[],J=S(D);O[se]=J,Y.push(`| ${se} | ${J.count||0} | ${(J.totalDur||0).toFixed(3)} | ${J.voicedFraction!==null?(J.voicedFraction*100).toFixed(1)+"%":"N/A"} | ${J.meanFreq?J.meanFreq.toFixed(1):"N/A"} | ${J.stdFreq?J.stdFreq.toFixed(1):"N/A"} | ${J.meanDur?J.meanDur.toFixed(3):"N/A"} |`)}Y.push(""),Y.push("## Pairwise agreement (reference -> test)");const U=G.includes("crepe")?"crepe":G.includes("librosa")?"librosa":G.includes("pitchy")?"pitchy":G[0];Y.push(`Reference algorithm: **${U}**`),Y.push(""),Y.push("| Reference -> Test | Matches | Compared (ref) | Match % | Mean cents diff | Octave errors |"),Y.push("|---|---:|---:|---:|---:|---:|");for(const se of G){if(se===U)continue;const D=F(g[U]??[],g[se]??[]),J=D.compared?(D.matches/D.compared*100).toFixed(1)+"%":"N/A";Y.push(`| ${U} -> ${se} | ${D.matches} | ${D.compared} | ${J} | ${D.meanCents!==null?D.meanCents.toFixed(1):"N/A"} | ${D.octaveErrors} |`)}Y.push(""),Y.push("## Observations and analysis"),Y.push("- The table above gives an overview of voiced coverage and per-algorithm mean frequencies. High voiced fraction indicates the algorithm detected many tonal regions; low fraction indicates conservative voicing or failures in noisy/quiet sections."),Y.push("- Pairwise match rate shows how often algorithms agree on the same regions (within ~50 cents). Octave error counts highlight typical autocorrelation octave mistakes."),Y.push("- Mean cents difference (reference vs test) indicates systematic tuning offsets or frequency bias; values <50 cents are generally acceptable for musical content, but for scoring you may want <20 cents."),Y.push("");for(const se of G){Y.push(`### ${se}`);const D=O[se];Y.push(`- Segments: ${D.count||0}`),Y.push(`- Total voiced (s): ${(D.totalDur||0).toFixed(3)}`),Y.push(`- Voiced fraction: ${D.voicedFraction!==null?(D.voicedFraction*100).toFixed(1)+"%":"N/A"}`),Y.push(`- Mean frequency: ${D.meanFreq?D.meanFreq.toFixed(2)+" Hz":"N/A"}`),Y.push(`- Std frequency: ${D.stdFreq?D.stdFreq.toFixed(2)+" Hz":"N/A"}`),Y.push("")}Y.push("## Conclusions & recommendation");const $=[];for(const se of G){if(se===U){$.push({alg:se,score:100});continue}const D=F(g[U]??[],g[se]??[]),J=D.compared?D.matches/D.compared:0,ae=D.compared?D.octaveErrors/D.compared:0,ce=J-ae*.5;$.push({alg:se,score:ce})}$.sort((se,D)=>D.score-se.score),Y.push(`- Based on this recording, recommended authoritative detector: **${$[0].alg}** (best agreement with reference).`),Y.push("- For live, low-latency feedback use Pitchy (YIN) with smoothing/hysteresis; use Crepe/Librosa for authoritative scoring or post-processing."),Y.push("- If octave errors are frequent, consider octave-correction heuristics (prefer lower octave when ambiguity) or combine detectors via voting."),Y.push(""),Y.push("## Raw data (per-algorithm segments)");for(const se of G){const D=g[se]??[];Y.push(`### ${se} — ${D.length} segments`);for(const ae of D)Y.push(`- ${ae.start.toFixed(3)} .. ${(ae.start+(ae.duration||0)).toFixed(3)} : ${ae.freq.toFixed(2)} Hz (pitch ${ae.pitch})`);const J=m[se];J&&Y.push(`- Error: ${J}`),Y.push("")}const q=Y.join(`
44
+ `),X=new Blob([q],{type:"text/markdown;charset=utf-8"}),re=URL.createObjectURL(X),oe=document.createElement("a");oe.href=re,oe.download="audiopitch_scientific_report_"+(n?n.name:"capture")+".md",document.body.appendChild(oe),oe.click(),oe.remove(),URL.revokeObjectURL(re)}catch(G){rt.error("generateScientificReport error",G),rt.warn(i("audioPitch.reportError","Could not generate the report: ")+String(G))}}return r.jsxs("div",{style:{marginTop:32,padding:16,border:"1px solid var(--nice-border, #ccc)",borderRadius:8},children:[r.jsx("h3",{children:i("audioPitch.title","Pitch analysis")}),r.jsxs("div",{style:{marginBottom:12},children:[r.jsx("label",{htmlFor:"pitch-algorithm-select",style:{marginRight:8},children:i("audioPitch.algorithm","Algorithm")}),r.jsxs("select",{id:"pitch-algorithm-select",value:o,onChange:G=>l(G.target.value),style:{marginRight:16},children:[r.jsx("option",{value:"ultrastar-wp",children:i("audioPitch.algorithmUltrastarWp","Ultrastar WP (autocorrelation)")}),r.jsx("option",{value:"crepe",children:"crepe (AI)"}),r.jsx("option",{value:"pitchy",children:"pitchy (YIN)"}),r.jsx("option",{value:"librosa",children:"Librosa (PYIN)"})]}),r.jsxs("label",{style:{marginRight:8},children:[r.jsx("input",{type:"checkbox",checked:h,onChange:G=>p(G.target.checked)})," ",i("audioPitch.compareAll","Compare all algorithms")]}),r.jsx("input",{type:"file",accept:"audio/*",ref:L,onChange:ee,disabled:C})]}),C&&r.jsx("div",{children:i("audioPitch.analyzing","Analyzing...")}),r.jsxs("div",{style:{marginTop:8},children:[r.jsx("b",{children:i("audioPitch.method","Method:")})," ",o]}),M&&r.jsxs("div",{style:{color:"red",marginTop:8},children:[r.jsxs("b",{children:[o,": "]}),r.jsx("div",{children:M}),A&&r.jsx("pre",{style:{background:"var(--nice-text, #111)",color:"var(--nice-danger-light, #f88)",padding:8,borderRadius:4,whiteSpace:"pre-wrap",marginTop:8},children:A})]}),T&&r.jsxs("div",{style:{marginTop:12},children:[r.jsx("b",{children:i("audioPitch.aubioDiagnostics","Aubio diagnostics")}),r.jsx("pre",{style:{background:"var(--nice-text, #111)",color:"var(--nice-danger-light, #f88)",padding:8,borderRadius:4,whiteSpace:"pre-wrap"},children:T}),E&&r.jsxs("div",{style:{marginTop:8},children:[r.jsx("b",{children:i("audioPitch.probe","Probe:")})," ",E]})]}),(Object.keys(g).length>0||Object.keys(m).length>0)&&r.jsxs("div",{style:{marginTop:12},children:[r.jsx("button",{onClick:()=>H(),children:i("audioPitch.downloadReport","Download report")}),Object.entries(m).length>0&&r.jsxs("div",{style:{marginTop:8},children:[r.jsx("b",{children:i("audioPitch.perAlgorithmErrors","Per-algorithm errors:")}),Object.entries(m).filter(([G,Z])=>Z).map(([G,Z])=>r.jsxs("div",{style:{marginTop:6},children:[r.jsxs("b",{children:[G,":"]}),r.jsx("pre",{style:{background:"var(--nice-text, #111)",color:"var(--nice-danger-light, #f88)",padding:8,borderRadius:4,whiteSpace:"pre-wrap"},children:Z})]},G))]})]}),j.length>0&&r.jsxs("div",{style:{marginTop:16},children:[r.jsx("b",{children:i("audioPitch.resultUltrastar","Result (UltraStar format):")}),r.jsxs("pre",{style:{background:"var(--nice-text, #222)",color:"var(--nice-bg, #fff)",padding:8,borderRadius:4},children:[j.map(G=>`: ${Math.round(G.start*10)} ${Math.round(G.duration*10)} ${G.pitch} [${G.freq.toFixed(1)} Hz]`).join(`
45
45
  `),`
46
- -`]})]}),c&&c.length>0&&r.jsxs("div",{style:{marginTop:24},children:[r.jsx("b",{children:i("audioPitch.waveformRms","Waveform and RMS:")}),r.jsx("canvas",{width:600,height:100,style:{background:"var(--nice-bg-secondary, #222)",borderRadius:4,width:"100%",maxWidth:600,display:"block"},role:"img","aria-label":i("audioPitch.waveformAndRmsVisualizationCanvas","Waveform and RMS visualization canvas"),ref:G=>{if(!G)return;const W=G.getContext("2d");if(W){W.clearRect(0,0,600,100),W.strokeStyle=ke.resolveCssColor("var(--nice-info, #0ff)",W.canvas),W.beginPath();for(let C=0;C<c.length;C+=Math.ceil(c.length/600)){const $=C/c.length*600,S=50-c[C]*48;C===0?W.moveTo($,S):W.lineTo($,S)}if(W.stroke(),b.length>0){W.strokeStyle=ke.resolveCssColor("var(--nice-warning, #ff0)",W.canvas),W.beginPath();for(let C=0;C<b.length;C++){const $=C/b.length*600,S=100-b[C]*90;C===0?W.moveTo($,S):W.lineTo($,S)}W.stroke()}}}}),r.jsxs("div",{style:{color:"var(--nice-text-muted, #aaa)",fontSize:12,marginTop:4},children:[r.jsx("span",{style:{color:"var(--nice-info, #0ff)"},children:i("audioPitch.waveform","Waveform")})," "," |  ",r.jsx("span",{style:{color:"var(--nice-warning, #ff0)"},children:"RMS"})]})]}),!w&&k.length===0&&!M&&r.jsx("div",{style:{marginTop:16,color:"var(--nice-text-muted, #aaa)"},children:r.jsx("i",{children:i("audioPitch.noNotesDetected","No notes detected")})}),h&&Object.keys(g).length>0&&r.jsxs("div",{style:{marginTop:16},children:[r.jsx("h4",{children:i("audioPitch.algorithmComparison","Algorithm comparison")}),Object.entries(g).map(([G,W])=>r.jsxs("div",{style:{marginBottom:12},children:[r.jsx("b",{children:G}),": ",i("audioPitch.detectedSegments","detected segments:")," ",W.length,r.jsx("pre",{style:{background:"var(--nice-text, #111)",color:"var(--nice-text-inverse, #ddd)",padding:8,borderRadius:4,marginTop:8},children:W.map(C=>`: ${Math.round(C.start*10)} ${Math.round(C.duration*10)} ${C.pitch} [${C.freq.toFixed(1)} Hz]`).join(`
47
- `)})]},G))]})]})}const zt=1e4,Bs=5e3;function Xr(e,t=.35){const n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!n)return e;const a=Math.min(255,Math.round(parseInt(n[1],16)+(255-parseInt(n[1],16))*t)),s=Math.min(255,Math.round(parseInt(n[2],16)+(255-parseInt(n[2],16))*t)),i=Math.min(255,Math.round(parseInt(n[3],16)+(255-parseInt(n[3],16))*t));return`rgb(${a},${s},${i})`}const fh=["var(--nice-warning, #facc15)","var(--nice-text-secondary, #cbd5e1)","var(--nice-warning, #d97706)"],mh=({entry:e,rank:t,animDelay:n})=>{const[a,s]=d.useState(0),[i,o]=d.useState(0),[l,c]=d.useState(0),[u,h]=d.useState(0),p=Math.min(e.classicScore,zt),g=Math.min(e.bonusScore,zt),y=p/zt*Bs,m=g>0?g/zt*Bs:0;return d.useEffect(()=>{let x,b=null;const f=Math.max(y,400),k=Math.max(m,m>0?300:0),v=w=>{b===null&&(b=w);const R=w-b-n;if(R<0){x=requestAnimationFrame(v);return}if(R<=f){const M=Math.min(1,R/f),j=1-Math.pow(1-M,3);s(Math.min(j*(p/zt)*100,100)),c(Math.round(j*e.classicScore)),x=requestAnimationFrame(v);return}if(s(Math.min(p/zt*100,100)),c(e.classicScore),k>0){const M=R-f;if(M<=k){const j=Math.min(1,M/k),T=1-Math.pow(1-j,3);o(Math.min(T*(g/zt)*100,100)),h(Math.round(T*e.bonusScore)),x=requestAnimationFrame(v);return}o(Math.min(g/zt*100,100)),h(e.bonusScore)}};return x=requestAnimationFrame(v),()=>cancelAnimationFrame(x)},[e.classicScore,e.bonusScore,p,g,y,m,n]),r.jsxs("div",{className:"nice-karaoke-summary__bar",children:[r.jsx("span",{className:"nice-karaoke-summary__bar-rank",children:t<=3?r.jsx(F.NtdMedal,{size:18,primaryColor:fh[t-1]}):`#${t}`}),r.jsx("span",{className:"nice-karaoke-summary__bar-name",style:{color:e.color},children:e.name}),r.jsxs("div",{className:"nice-karaoke-summary__bar-track",children:[e.bonusScore>0&&r.jsx("div",{className:"nice-karaoke-summary__bar-fill-bonus",style:{width:`${Math.min(a+i,100)}%`,background:Xr(e.color,.45)}}),r.jsx("div",{className:"nice-karaoke-summary__bar-fill-classic",style:{width:`${a}%`,background:`linear-gradient(90deg, ${e.color}, ${Xr(e.color,.15)})`,boxShadow:`0 0 8px ${e.color}55`}}),r.jsxs("div",{className:"nice-karaoke-summary__bar-text",children:[l.toLocaleString(),u>0&&r.jsxs("span",{className:"nice-karaoke-summary__bar-text-bonus",style:{color:Xr(e.color,.5)},children:["+",u.toLocaleString()]})]})]}),r.jsx("span",{className:"nice-karaoke-summary__bar-total",children:(l+u).toLocaleString()})]})},Gs=({title:e,entries:t,highlightNames:n,playerColorMap:a})=>r.jsxs("div",{className:"nice-karaoke-summary__rank",children:[r.jsx("h4",{className:"nice-karaoke-summary__rank-title",children:e}),r.jsx("table",{className:"nice-karaoke-summary__rank-table",children:r.jsx("tbody",{children:t.map((s,i)=>{const o=n.has(s.name),l=a.get(s.name);return r.jsxs("tr",{className:`nice-karaoke-summary__rank-row ${o?"nice-karaoke-summary__rank-row--hl":""}`,children:[r.jsx("td",{className:`nice-karaoke-summary__rank-pos ${i<3?"nice-karaoke-summary__rank-pos--top":""}`,children:s.rank}),r.jsxs("td",{className:"nice-karaoke-summary__rank-name",style:l?{color:l}:void 0,children:[o&&r.jsxs(r.Fragment,{children:[r.jsx(F.NtdCircle,{size:8})," "]}),s.name]}),r.jsx("td",{className:"nice-karaoke-summary__rank-score",children:s.score.toLocaleString()})]},`${s.name}-${i}`)})})})]}),$o=({uploadedSong:e,playerScores:t,topSingings:n,onRestart:a,onContinue:s,t:i,renderReport:o,className:l,style:c,id:u,accessMode:h,"data-testid":p})=>{const[g,y]=d.useState(!1),m=d.useMemo(()=>[...t].sort((w,R)=>R.totalScore-w.totalScore),[t]),x=d.useMemo(()=>{const w=new Map;for(const R of t)w.set(R.name,R.color);return w},[t]),b=d.useMemo(()=>new Set(t.map(w=>w.name)),[t]),f=d.useMemo(()=>m.map((w,R)=>({rank:R+1,name:w.name,score:w.totalScore,color:w.color})),[m]),k=d.useMemo(()=>{const w=n.map(M=>({name:M.playerName,score:M.score})),R=new Set;for(const M of m)R.has(M.id)||(R.add(M.id),w.push({name:M.name,score:M.totalScore}));return w.sort((M,j)=>j.score-M.score),w.slice(0,10).map((M,j)=>({rank:j+1,name:M.name,score:M.score}))},[n,m]),v=e?e.artist?`${e.artist} — ${e.title}`:e.title:i("karaokeSummary.unknownSong","Unknown song");return h==="hidden"?null:r.jsxs("div",{className:`nice-karaoke-summary ${l??""}`,style:c,id:u,"data-testid":p,children:[r.jsxs("div",{className:"nice-karaoke-summary__card",children:[r.jsx("h1",{className:"nice-karaoke-summary__title",children:v}),r.jsx("div",{className:"nice-karaoke-summary__bars",children:m.length===0?r.jsx("div",{className:"nice-karaoke-summary__empty",children:i("karaokeSummary.noScores","No scores")}):m.map((w,R)=>r.jsx(mh,{entry:w,rank:R+1,animDelay:R*300},w.id))}),(m.length>1||n.length>0)&&r.jsxs("div",{className:"nice-karaoke-summary__ranks",children:[m.length>1&&r.jsx(Gs,{title:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[r.jsx(F.NtdHome,{size:14})," ",i("karaokeSummary.localRanking","Session ranking")]}),entries:f,highlightNames:b,playerColorMap:x}),n.length>0&&r.jsx(Gs,{title:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[r.jsx(F.NtdTrophy,{size:14})," ",i("karaokeSummary.globalRanking","Top 10")]}),entries:k,highlightNames:b,playerColorMap:x})]}),r.jsxs("div",{className:"nice-karaoke-summary__actions",children:[o&&r.jsxs("button",{type:"button",className:"nice-karaoke-summary__btn nice-karaoke-summary__btn--report",onClick:()=>y(!0),children:[r.jsx(F.NtdBarChart,{size:15})," ",i("karaokeSummary.report","Report")]}),r.jsx("button",{type:"button",className:"nice-karaoke-summary__btn nice-karaoke-summary__btn--restart",onClick:a,children:i("karaokeSummary.restart","Restart")}),r.jsx("button",{type:"button",className:"nice-karaoke-summary__btn nice-karaoke-summary__btn--continue",onClick:s,children:i("karaokeSummary.continue","Continue")})]})]}),g&&(o==null?void 0:o(()=>y(!1)))]})},gh=st.scoped("GenericPlayer"),yh=e=>/youtu(\.be|be\.com)/i.test(e),Ao=e=>!!e&&/\.m3u8(\?.*)?$/i.test(e),vh=e=>!!e&&/\.(mp3|aac|m4a|flac|wav|ogg)(\?.*)?$/i.test(e),bh=e=>{var i;if(!((i=e==null?void 0:e.sources)!=null&&i.length))return null;const t=o=>e.sources.find(l=>l.kind===o),n=e.sources.find(o=>o.kind==="youtube"&&(o.videoId||o.url&&yh(o.url)))??null;if(n)return n;const a=t("hls")||e.sources.find(o=>o.url&&Ao(o.url))||null;if(a)return a;const s=t("audio")||e.sources.find(o=>o.url&&vh(o.url))||null;return s||(e.sources[0]??null)},Ar=e=>{(!isFinite(e)||e<0)&&(e=0);const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`},xh=[.25,.5,.75,1,1.25,1.5,1.75,2],Io=({tracks:e=[],initialIndex:t=0,autoPlay:n=!0,countdownSeconds:a=0,height:s=360,onIndexChange:i,onPlayingChange:o,onTimeUpdate:l,externalRef:c,uiMode:u="full",compactNextCount:h=3,progressBarPosition:p="inline",loop:g=!1,onEnded:y,enableKeyboardShortcuts:m=!0,shuffle:x=!1,repeatMode:b="none",playbackSpeed:f=1,abLoop:k=null,onRepeatModeChange:v,onShuffleChange:w,onSpeedChange:R,sleepTimer:M=0,onSleepTimerExpired:j})=>{const{t:T}=xe(),{t:P}=xe(),[A,I]=d.useState(Math.min(Math.max(0,t),Math.max(0,e.length-1))),L=e[A],N=d.useMemo(()=>bh(L),[L]),_=(L==null?void 0:L.startOffset)??0,[ee,Y]=d.useState(!1),[O,U]=d.useState(0),[V,K]=d.useState(0),[G,W]=d.useState(.9),[C,$]=d.useState(null),[S,B]=d.useState(null),H=d.useRef(null),[z,Z]=d.useState(x),[E,q]=d.useState(b),[X,re]=d.useState(f),[oe,se]=d.useState(k),[D,J]=d.useState([]),[ae,ce]=d.useState(M>0?M*60:null),le=d.useRef(null),[ne,pe]=d.useState(()=>Ei()),fe=d.useRef(null),me=d.useRef(null),he=d.useRef(null),we=d.useRef(null);d.useEffect(()=>{if(z&&e.length>0){const de=Array.from({length:e.length},(ge,Ae)=>Ae);for(let ge=de.length-1;ge>0;ge--){const Ae=Math.floor(Math.random()*(ge+1));[de[ge],de[Ae]]=[de[Ae],de[ge]]}J(de)}},[z,e.length]);const je=d.useRef(j);je.current=j,d.useEffect(()=>(le.current&&(window.clearInterval(le.current),le.current=null),M>0&&ee&&(ce(M*60),le.current=window.setInterval(()=>{ce(de=>{var ge;return!de||de<=1?(le.current&&window.clearInterval(le.current),le.current=null,(ge=je.current)==null||ge.call(je),null):de-1})},1e3)),()=>{le.current&&window.clearInterval(le.current)}),[M,ee]);const Ne=d.useCallback(de=>{const ge=Math.min(Math.max(0,de),Math.max(0,e.length-1));I(ge),i==null||i(ge)},[e.length,i]),Ee=d.useCallback(()=>{if(z&&D.length>0){const ge=D.indexOf(A)+1;return ge<D.length?D[ge]:E==="all"?D[0]:-1}return A<e.length-1?A+1:E==="all"?0:-1},[A,e.length,z,D,E]),Ye=d.useCallback(()=>{if(z&&D.length>0){const de=D.indexOf(A);return de>0?D[de-1]:E==="all"?D[D.length-1]:-1}return A>0?A-1:E==="all"?e.length-1:-1},[A,e.length,z,D,E]),ue=d.useCallback(()=>{const de=Ee();de>=0&&Ne(de)},[Ee,Ne]),be=d.useCallback(async()=>{var de,ge;await Yt(),pe(!0),(N==null?void 0:N.kind)==="youtube"?(de=fe.current)==null||de.playVideo():(ge=me.current)==null||ge.play(),Y(!0),o==null||o(!0)},[N,o]),Oe=d.useCallback(()=>{var de,ge;(N==null?void 0:N.kind)==="youtube"?(de=fe.current)==null||de.pauseVideo():(ge=me.current)==null||ge.pause(),Y(!1),o==null||o(!1)},[N,o]),Me=d.useCallback(()=>ee?Oe():be(),[ee,be,Oe]),Ie=d.useCallback(de=>{var Te;const ge=de+_;(N==null?void 0:N.kind)==="youtube"?(Te=fe.current)==null||Te.seekTo(ge,!0):me.current&&(me.current.currentTime=ge);const Ae=Math.max(0,de);K(Ae),l==null||l(Ae)},[N==null?void 0:N.kind,l,_]),Qe=d.useCallback(()=>{if(V>3){Ie(0);return}const de=Ye();de>=0&&Ne(de)},[Ye,Ne,V,Ie]),Be=d.useCallback(de=>{var ge,Ae;W(de),$(null),(N==null?void 0:N.kind)==="youtube"?(Ae=(ge=fe.current)==null?void 0:ge.setVolume)==null||Ae.call(ge,Math.round(de*100)):me.current&&(me.current.volume=de)},[N]),He=d.useCallback(()=>{C!==null?Be(C):($(G),Be(0))},[G,C,Be]),Lt=d.useCallback(de=>{var ge,Ae;re(de),me.current&&(me.current.playbackRate=de),(N==null?void 0:N.kind)==="youtube"&&((Ae=(ge=fe.current)==null?void 0:ge.setPlaybackRate)==null||Ae.call(ge,de)),R==null||R(de)},[N,R]),ct=d.useCallback(()=>{const de=["none","all","one"],ge=de[(de.indexOf(E)+1)%de.length];q(ge),v==null||v(ge)},[E,v]),ht=d.useCallback(()=>{const de=!z;Z(de),w==null||w(de)},[z,w]),it=d.useCallback(de=>{se(de)},[]);d.useImperativeHandle(c,()=>({play:be,pause:Oe,toggle:Me,seekTo:Ie,setVolume:Be,setSpeed:Lt,setRepeatMode:de=>{q(de),v==null||v(de)},toggleShuffle:ht,setABLoop:it,getUnderlyingPlayer:()=>(N==null?void 0:N.kind)==="youtube"?fe.current:(N==null?void 0:N.kind)==="hls"||(N==null?void 0:N.kind)==="audio"?me.current:null}),[be,Oe,Me,Ie,Be,Lt,v,ht,it,N==null?void 0:N.kind]),d.useEffect(()=>{const de=window.setInterval(()=>{let ge=0,Ae=0;(N==null?void 0:N.kind)==="youtube"&&fe.current?(ge=fe.current.getCurrentTime()||0,Ae=fe.current.getDuration()||0):me.current&&(ge=me.current.currentTime||0,Ae=me.current.duration||0);const Te=Math.max(0,ge-_);K(Te),U(Ae),l==null||l(Te),oe&&Te>=oe.b&&Ie(oe.a)},250);return()=>window.clearInterval(de)},[N==null?void 0:N.kind,l,oe,_,Ie]),d.useEffect(()=>()=>{H.current&&(window.clearInterval(H.current),H.current=null)},[]);const wt=N==null?void 0:N.url,Je=N==null?void 0:N.kind,Pt=N==null?void 0:N.withCredentials,Xt=JSON.stringify((N==null?void 0:N.headers)??null),Se=d.useRef(G);Se.current=G;const Ce=d.useRef(a);Ce.current=a;const We=d.useRef(o);We.current=o,d.useEffect(()=>{if(he.current){try{he.current.destroy()}catch{}he.current=null}if(me.current&&(me.current.volume=Se.current,me.current.crossOrigin=Pt?"use-credentials":"anonymous"),Je==="hls"&&Ao(wt)){const de=me.current;if(!de)return;const ge=()=>{de.src=wt,de.load();try{_&&!isNaN(_)&&(de.currentTime=_)}catch{}n&&de.play().catch(()=>{})};de.canPlayType("application/vnd.apple.mpegurl")?ge():(async()=>{var Ae;try{const _e=(await import("hls.js")).default;if((Ae=_e==null?void 0:_e.isSupported)!=null&&Ae.call(_e)){const ve=JSON.parse(Xt),Re=new _e({xhrSetup:Le=>{if(Pt&&(Le.withCredentials=!0),ve)for(const[Ge,De]of Object.entries(ve))try{Le.setRequestHeader(Ge,De)}catch{}}});he.current=Re,Re.loadSource(wt),Re.attachMedia(de),Re.on(_e.Events.MANIFEST_PARSED,()=>{n&&de.play().catch(()=>{})})}else ge()}catch(Te){gh.debug("HLS.js setup failed, falling back to native playback",Te),ge()}})()}else if(Je==="audio"&&wt&&me.current){const de=me.current;de.src=wt,de.load();try{_&&!isNaN(_)&&(de.currentTime=_)}catch{}n&&de.play().catch(()=>{})}H.current&&(window.clearInterval(H.current),H.current=null),B(null),K(0),U(0),n&&Je==="youtube"&&Ce.current>0?(B(Ce.current),H.current=window.setInterval(()=>{B(de=>{var ge,Ae;if(!de)return null;if(de<=1){H.current&&(window.clearInterval(H.current),H.current=null);try{(ge=fe.current)==null||ge.playVideo()}catch{}return Y(!0),(Ae=We.current)==null||Ae.call(We,!0),null}return de-1})},1e3)):Y(!!n)},[wt,Je,Pt,Xt,_,n]);const ze=d.useCallback(()=>{if(E==="one"){Ie(0),be();return}const de=Ee();de>=0?Ne(de):(Y(!1),o==null||o(!1),Ie(0),y==null||y())},[E,Ee,Ne,o,Ie,y,be]);d.useEffect(()=>{if(!m)return;const de=ge=>{const Ae=ge.target;if(!(Ae.tagName==="INPUT"||Ae.tagName==="TEXTAREA"||Ae.isContentEditable))switch(ge.key){case" ":ge.preventDefault(),Me();break;case"ArrowRight":ge.preventDefault(),Ie(Math.min(V+5,O));break;case"ArrowLeft":ge.preventDefault(),Ie(Math.max(0,V-5));break;case"ArrowUp":ge.preventDefault(),Be(Math.min(1,G+.05));break;case"ArrowDown":ge.preventDefault(),Be(Math.max(0,G-.05));break;case"m":case"M":He();break;case"n":case"N":ue();break;case"p":case"P":Qe();break;case"r":case"R":ct();break;case"s":case"S":ht();break}};return document.addEventListener("keydown",de),()=>document.removeEventListener("keydown",de)},[m,Me,Ie,V,O,Be,G,He,ue,Qe,ct,ht]);const $e=(N==null?void 0:N.kind)==="youtube"||u==="full"||u==="nobuttons",Pe=h>0?e.slice(A+1,A+1+h):[];return r.jsxs("div",{ref:we,className:"gp-player",style:{display:"grid",gap:12},tabIndex:-1,children:[n&&!ne&&r.jsx("div",{className:"gp-audio-activation",onClick:()=>{pe(!0),be()},style:{position:"fixed",inset:0,zIndex:200,display:"flex",alignItems:"center",justifyContent:"center",background:"var(--nice-overlay-60, rgba(0, 0, 0, 0.6))",cursor:"pointer"},children:r.jsx("span",{style:{color:"#fff",fontSize:24},children:T("player.clickToActivateAudio","Click to activate audio")})}),$e&&r.jsxs("div",{className:"gp-stage",style:{width:"100%",height:s,background:(N==null?void 0:N.kind)==="youtube"?"transparent":"var(--player-bg, #0f172a)",borderRadius:8,overflow:"hidden",position:"relative",display:"grid",placeItems:"center"},children:[(N==null?void 0:N.kind)==="youtube"&&r.jsx(Pa,{videoId:N.videoId??Mh(N.url),onReady:de=>{fe.current=de.target,Be(G);const ge=(L==null?void 0:L.startOffset)??0;try{ge&&de.target.seekTo(ge,!0)}catch{}if(u==="nobuttons"){try{de.target.playVideo()}catch{}Y(!0)}},onEnd:ze,opts:{width:"100%",height:"100%",playerVars:{autoplay:n||u==="nobuttons"?1:0,controls:0,modestbranding:1,rel:0,showinfo:0,fs:0,disablekb:1,iv_load_policy:3,loop:g?1:0}},style:{width:"100%",height:"100%"}}),S!==null&&r.jsx("div",{style:{position:"absolute",inset:0,zIndex:120,display:"flex",alignItems:"center",justifyContent:"center",background:"var(--nice-overlay-70, rgba(0, 0, 0, 0.7))"},children:r.jsx("span",{style:{color:"#fff",fontSize:72,fontWeight:"bold"},children:S})}),u==="nobuttons"&&r.jsx("div",{style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"auto",zIndex:100,cursor:"default"}}),((N==null?void 0:N.kind)==="audio"||(N==null?void 0:N.kind)==="hls")&&r.jsxs(r.Fragment,{children:[u==="full"&&r.jsx("div",{style:{textAlign:"center",color:"var(--nice-overlay-light-90, rgba(255, 255, 255, 0.9))"},children:L!=null&&L.coverUrl?r.jsx("img",{alt:"cover",src:L.coverUrl,style:{height:s-24,objectFit:"contain"}}):r.jsxs("div",{style:{opacity:.8},children:[r.jsxs("div",{style:{fontSize:18,fontWeight:600},children:[L==null?void 0:L.artist," — ",L==null?void 0:L.title]}),r.jsx("div",{style:{marginTop:8,fontSize:12,color:"var(--nice-text-secondary, #64748b)"},children:(N==null?void 0:N.label)??`${(N==null?void 0:N.codec)??""} ${(N==null?void 0:N.quality)??""}`.trim()})]})}),r.jsx("audio",{ref:me,onEnded:ze,onLoadedMetadata:()=>{const de=me.current;de&&U(de.duration||0)},crossOrigin:N!=null&&N.withCredentials?"use-credentials":"anonymous",style:{display:"none"}})]})]}),(u==="minimal"||u==="compact")&&r.jsx("div",{style:{display:"flex",alignItems:"baseline",gap:8,justifyContent:"space-between"},children:r.jsxs("div",{children:[r.jsx("div",{style:{fontWeight:600},children:(L==null?void 0:L.title)??""}),r.jsx("div",{style:{color:"var(--nice-text-secondary, #64748b)",fontSize:13},children:(L==null?void 0:L.artist)??""})]})}),u==="full"&&r.jsxs(r.Fragment,{children:[r.jsx(Lo,{currentTime:V,duration:O}),r.jsx(Sh,{isPlaying:ee,index:A,count:e.length,currentTime:V,duration:O,volume:G,onPrev:Qe,onNext:ue,onToggle:Me,onSeek:Ie,onVolume:Be}),r.jsx(jh,{shuffleOn:z,repeatMode:E,speed:X,abLoop:oe,currentTime:V,sleepRemaining:ae,onToggleShuffle:ht,onCycleRepeat:ct,onSpeedChange:Lt,onSetABLoop:it,onMuteToggle:He,isMuted:C!==null})]}),u==="progressOnly"&&r.jsx("div",{style:p==="fixedBottom"?{position:"fixed",left:0,right:0,bottom:0,padding:"8px 12px",background:"var(--nice-overlay-90, rgba(15, 23, 42, 0.9))",backdropFilter:"blur(2px)",zIndex:1e3}:{},children:r.jsx(kh,{currentTime:V,duration:O,onSeek:Ie})}),(u==="minimal"||u==="compact")&&r.jsx(wh,{isPlaying:ee,canPrev:A>0,canNext:A<e.length-1,onPrev:Qe,onNext:ue,onToggle:Me}),u==="compact"&&Pe.length>0&&r.jsx(Ch,{items:Pe,onSelect:de=>Ne(A+1+de)}),u==="nobuttons"&&r.jsx(r.Fragment,{}),u==="full"&&e.length>0&&r.jsx("div",{className:"gp-list",style:{display:"grid",gap:4},children:e.map((de,ge)=>r.jsxs("button",{onClick:()=>Ne(ge),style:{textAlign:"left",border:"1px solid var(--nice-border-color)",borderRadius:8,padding:"8px 10px",background:ge===A?"color-mix(in srgb, var(--nice-color-primary) 14%, transparent)":"var(--nice-bg-secondary)",color:"var(--nice-text-primary)",cursor:"pointer"},title:de.sources.map(Ae=>Ae.kind).join(", "),children:[r.jsx("div",{style:{fontWeight:600},children:de.title}),r.jsx("div",{style:{color:"var(--nice-text-secondary)",fontSize:12},children:de.artist})]},de.id))})]})},yt={border:"1px solid var(--nice-border-color)",borderRadius:8,padding:"6px 10px",background:"var(--nice-bg-secondary)",color:"var(--nice-text-primary)",cursor:"pointer"},Lo=({currentTime:e,duration:t})=>r.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:8,justifyContent:"space-between"},children:[r.jsx("div",{}),r.jsxs("div",{style:{fontSize:12,color:"var(--nice-text-secondary, #64748b)"},children:[Ar(e)," / ",Ar(t)]})]}),Sh=({isPlaying:e,index:t,count:n,currentTime:a,duration:s,volume:i,onPrev:o,onNext:l,onToggle:c,onSeek:u,onVolume:h})=>{const{t:p}=xe();return r.jsxs("div",{className:"gp-controls",style:{display:"grid",gridTemplateColumns:"auto 1fr auto",gap:12,alignItems:"center"},children:[r.jsxs("div",{style:{display:"flex",gap:8},children:[r.jsx("button",{onClick:o,disabled:t<=0,title:p("player.previousTrack","Previous track"),"aria-label":p("player.previousTrack","Previous track"),style:yt,children:r.jsx(F.NtdSkipBack,{size:16})}),r.jsx("button",{onClick:c,title:e?p("player.pause","Pause"):p("player.play","Play"),"aria-label":e?p("player.pause","Pause"):p("player.play","Play"),style:yt,children:e?r.jsx(F.NtdPause,{size:16}):r.jsx(F.NtdPlay,{size:16})}),r.jsx("button",{onClick:l,disabled:t>=n-1,title:p("player.nextTrack","Next track"),"aria-label":p("player.nextTrack","Next track"),style:yt,children:r.jsx(F.NtdSkipForward,{size:16})})]}),r.jsx("input",{type:"range",min:0,max:Math.max(1,s),step:.1,value:a,onChange:g=>u(parseFloat(g.target.value)),"aria-label":p("player.seekPosition","Seek position")}),r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[r.jsx(F.NtdVolume,{size:16}),r.jsx("input",{type:"range",min:0,max:1,step:.01,value:i,onChange:g=>h(parseFloat(g.target.value)),"aria-label":p("player.volume","Volume")})]})]})},kh=({currentTime:e,duration:t,onSeek:n})=>{const{t:a}=xe();return r.jsxs(r.Fragment,{children:[r.jsx(Lo,{currentTime:e,duration:t}),r.jsx("input",{type:"range",min:0,max:Math.max(1,t),step:.1,value:e,onChange:s=>n(parseFloat(s.target.value)),"aria-label":a("player.seekPosition","Seek position")})]})},wh=({isPlaying:e,canPrev:t,canNext:n,onPrev:a,onNext:s,onToggle:i})=>{const{t:o}=xe();return r.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[r.jsx("button",{onClick:a,disabled:!t,title:o("player.previousTrack","Previous track"),"aria-label":o("player.previousTrack","Previous track"),style:yt,children:r.jsx(F.NtdSkipBack,{size:16})}),r.jsx("button",{onClick:i,title:e?o("player.pause","Pause"):o("player.play","Play"),"aria-label":e?o("player.pause","Pause"):o("player.play","Play"),style:yt,children:e?r.jsx(F.NtdPause,{size:16}):r.jsx(F.NtdPlay,{size:16})}),r.jsx("button",{onClick:s,disabled:!n,title:o("player.nextTrack","Next track"),"aria-label":o("player.nextTrack","Next track"),style:yt,children:r.jsx(F.NtdSkipForward,{size:16})})]})},Ch=({items:e,onSelect:t})=>{const{t:n}=xe();return r.jsxs("div",{style:{border:"1px solid var(--nice-border-color)",borderRadius:8,padding:10,background:"var(--nice-bg-secondary)",color:"var(--nice-text-primary)"},children:[r.jsx("div",{style:{fontWeight:600,marginBottom:6},children:n("player.upNext","Up next")}),r.jsx("ol",{style:{margin:0,paddingLeft:18},children:e.map((a,s)=>r.jsx("li",{style:{marginBottom:4},children:r.jsxs("button",{type:"button",onClick:()=>t(s),style:{border:"none",padding:0,background:"transparent",cursor:"pointer",color:"var(--nice-text-primary, #0f172a)"},title:a.sources.map(i=>i.kind).join(", "),children:[r.jsx("span",{style:{fontWeight:600},children:a.artist})," — ",a.title]})},a.id))})]})},jh=({shuffleOn:e,repeatMode:t,speed:n,abLoop:a,currentTime:s,sleepRemaining:i,onToggleShuffle:o,onCycleRepeat:l,onSpeedChange:c,onSetABLoop:u,onMuteToggle:h,isMuted:p})=>{const{t:g}=xe(),y={none:g("player.off","Off"),all:g("player.all","All"),one:g("player.one","One")},m=t==="one"?r.jsxs("span",{style:{position:"relative",display:"inline-flex"},children:[r.jsx(F.NtdRepeat,{size:16}),r.jsx("span",{style:{position:"absolute",right:-3,bottom:-3,fontSize:8,fontWeight:700},children:"1"})]}):t==="all"?r.jsx(F.NtdRepeat,{size:16}):r.jsx(F.NtdArrowRight,{size:16});return r.jsxs("div",{className:"gp-pro-controls",style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap",fontSize:13},children:[r.jsx("button",{onClick:o,title:g("player.shuffle","Shuffle"),"aria-label":g("player.shuffle","Shuffle"),style:{...yt,opacity:e?1:.4,fontWeight:e?700:400},children:r.jsx(F.NtdShuffle,{size:16})}),r.jsx("button",{onClick:l,title:`${g("player.repeat","Repeat")}: ${y[t]}`,"aria-label":`${g("player.repeat","Repeat")}: ${y[t]}`,style:{...yt,opacity:t==="none"?.4:1},children:m}),r.jsx("select",{value:n,onChange:x=>c(parseFloat(x.target.value)),title:g("player.speed","Speed"),"aria-label":g("player.speed","Speed"),style:{...yt,minWidth:56,fontSize:12},children:xh.map(x=>r.jsxs("option",{value:x,children:[x,"x"]},x))}),r.jsx("button",{onClick:h,title:g("player.mute","Mute"),"aria-label":g("player.mute","Mute"),style:{...yt,opacity:p?1:.6},children:p?r.jsx(F.NtdVolumeMute,{size:16}):r.jsx(F.NtdVolume,{size:16})}),a?r.jsxs("span",{style:{display:"flex",gap:4,alignItems:"center"},children:[r.jsxs("span",{style:{fontSize:11,color:"var(--nice-text-secondary, #64748b)"},children:["A: ",Ar(a.a)," — B: ",Ar(a.b)]}),r.jsx("button",{onClick:()=>u(null),title:g("player.clearLoop","Clear loop"),style:{...yt,fontSize:11,padding:"2px 6px"},children:r.jsx(F.NtdClose,{size:12})})]}):r.jsx("button",{onClick:()=>u({a:s,b:s+10}),title:g("player.abLoop","A-B Loop"),"aria-label":g("player.setAbLoop","Set A-B Loop"),style:{...yt,opacity:.4},children:"A-B"}),i!==null&&i>0&&r.jsxs("span",{style:{marginLeft:"auto",fontSize:11,color:"var(--nice-text-secondary, #64748b)",display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(F.NtdMoon,{size:12})," ",Math.floor(i/60),":",(i%60).toString().padStart(2,"0")]})]})};function Mh(e){if(!e)return;const t=e.match(/youtu\.be\/([A-Za-z0-9_-]{6,})/);if(t)return t[1];const n=e.match(/[?&]v=([A-Za-z0-9_-]{6,})/);if(n)return n[1]}function _o(e){const t={};if(!e)return t;const n=e.split(",");for(const a of n){const s=a.trim();s.startsWith("v=")?t.youtubeId=s.substring(2):s.startsWith("co=")?t.coverImage=s.substring(3):s.startsWith("bg=")&&(t.backgroundImage=s.substring(3))}return t}function Rh(e,t="/api/karaoke/cover"){var a,s;const n=((a=e.coverImage)==null?void 0:a.startsWith("http://"))||((s=e.coverImage)==null?void 0:s.startsWith("https://"));return e.coverImage&&n?e.coverImage:e.youtubeId?`https://img.youtube.com/vi/${e.youtubeId}/hqdefault.jpg`:e.coverImage?`${t}?filePath=${encodeURIComponent(e.coverImage)}`:"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='180'%3E%3Crect width='320' height='180' fill='%23333'/%3E%3Ctext x='160' y='95' text-anchor='middle' fill='%23999' font-size='16'%3ENo Cover%3C/text%3E%3C/svg%3E"}function Nh(e,t="/backgrounds"){return e.backgroundImage?`${t}/${e.backgroundImage}`:""}function zo(e,t,n=.01){let a=0;for(let o=0;o<e.length;o++)a+=e[o]*e[o];if(a=Math.sqrt(a/e.length),a<n)return 0;let s=-1,i=0;for(let o=20;o<e.length/2;o++){let l=0;for(let c=0;c<e.length/2;c++)l+=e[c]*e[c+o];l/=e.length/2,l>i&&(i=l,s=o)}return s>0?t/s:0}function Ka(e,t){const n=[];return e.forEach((a,s)=>{a.forEach((i,o)=>{n.push({startTime:i.startTime+t,duration:i.duration,pitch:i.pitch,isGold:i.isGold,line:s,idx:o})})}),n}function Do(e,t,n){const a=[];return e.forEach(s=>{var c;const[i,o]=s.noteKey.split("-").map(Number),l=(c=t[i])==null?void 0:c[o];l&&s.segments.forEach(u=>{a.push({start:u.visualStart-n,end:u.visualEnd-n,pitch:l.pitch,frac:u.frac,isGold:l.isGold,noteStart:l.startTime,noteEnd:l.startTime+l.duration})})}),a}function Fo(e,t=120){let n=e;if(e.length>t){const a=e.length/t,s=[];for(let i=0;i<t;i++)s.push(e[Math.floor(i*a)]);n=s}return n.map(a=>({t:Math.round(a.t*1e3)/1e3,hz:Math.round(a.hz)}))}function Oo(e,t,n){const s=Date.parse(e)-n;return Math.max(0,Math.round(t-s))}const Bo={crepe:"var(--nice-accent, #a78bfa)",librosa:"var(--nice-success-light, #34d399)",pitchy:"var(--nice-primary-light, #60a5fa)",autocorr:"var(--nice-text-secondary, #555555)"};function Th(e){return e==="autocorr"?"Ultrastar":e.charAt(0).toUpperCase()+e.slice(1)}function Ph(e){return Bo[e]??"var(--nice-text-secondary, #555555)"}function Eh(e){const t=Bo[e]??"var(--nice-text-secondary, #555555)";return`var(--algo-${e}, ${t})`}function Go(e,t){const n=!(t!=null&&t.includes("no-music")),a=t==null?void 0:t.includes("instrumental"),s=[];if(n){if(e.videoPath){let i=e.videoPath;if(i.startsWith("v=")){const o=_o(i);o.youtubeId&&(i=`https://www.youtube.com/watch?v=${o.youtubeId}`)}/youtu(\.be|be\.com)/i.test(i)?s.push({kind:"youtube",url:i}):/^(https?:\/\/|blob:|data:\/\/|\/)/i.test(e.videoPath)&&s.push({kind:"audio",url:e.videoPath})}if(s.length===0){const i=a?e.instrumentalPath:e.audioPath;i&&/^(https?:\/\/|blob:|data:\/\/|\/)/i.test(i)&&s.push({kind:"audio",url:i})}s.length===0&&e.youtubeId&&s.push({kind:"youtube",url:`https://www.youtube.com/watch?v=${e.youtubeId}`})}return{id:String(e.id??e.title??"song"),title:e.title??"—",artist:e.artist??"—",coverUrl:e.coverPath??void 0,sources:s}}function $h(e){const t=e.videoPath??e.video??void 0;return{id:e.id,title:e.title??"",artist:e.artist??"",year:e.year,genre:e.genre,language:e.language,filePath:e.filePath,coverPath:e.coverPath,audioPath:e.audioPath??e.audio??void 0,videoPath:t,format:0,notes:e.notes??[],gap:e.gap,bpm:e.bpm,videoGap:e.videoGap,start:e.start,end:e.end,youtubeId:e.youtubeId,instrumentalPath:e.instrumentalPath,isVerified:e.isVerified,coverImage:e.coverImage,backgroundImage:e.backgroundImage}}var Ya=(e=>(e[e.Ultrastar=0]="Ultrastar",e))(Ya||{});function Wo(e,t="song.txt"){const n=e.split(/\r?\n/),a={},s=[];for(const o of n){const l=o.replace(/\uFEFF/g,"");if(l.trim()){if(l.startsWith("#")){const c=l.indexOf(":");c>0&&(a[l.slice(1,c).trim().toUpperCase()]=l.slice(c+1).trim())}else if(/^[:*\-FG]/.test(l))s.push({noteLine:l});else if(l.trim()==="E")break}}const i=o=>{if(!o)return;const l=parseFloat(o.replace(",","."));return Number.isFinite(l)?l:void 0};return{title:a.TITLE||t.replace(/\.txt$/i,""),artist:a.ARTIST||"",format:Ya.Ultrastar,bpm:i(a.BPM),gap:i(a.GAP),genre:a.GENRE||void 0,language:a.LANGUAGE||void 0,year:a.YEAR||void 0,audioPath:a.MP3||void 0,videoPath:a.VIDEO||a.MP3||void 0,notes:s}}const Ah=e=>window.btoa(unescape(encodeURIComponent(e))),Vo=({onSongUpload:e,parseSong:t,onError:n,accept:a=".txt",maxFileSize:s=5*1024*1024,t:i})=>{const{t:o}=xe(),l=i??o,c=h=>{const p=new FileReader;p.onload=async g=>{var m;if(!((m=g.target)!=null&&m.result))return;const y=g.target.result;try{const x=t?await t({fileName:h.name,data:Ah(y)}):Wo(y,h.name);e(x)}catch(x){n==null||n(x)}},p.readAsText(h,"UTF-8")},u=h=>/\.txt$/i.test(h.name)?h.size===0?l("karaokeUploader.empty","The file is empty."):null:l("karaokeUploader.notTxt","Please choose an UltraStar .txt file.");return r.jsx("div",{className:"nice-karaoke-uploader",children:r.jsx(ie.NiceUpload,{accept:a,maxFileSize:s,validateFile:u,multiple:!1,text:l("karaokeUploader.dropPrompt","Click or drag & drop an UltraStar file (.txt)"),onFilesSelected:h=>{const p=h[0];p&&c(p)}})})},Ih=[],Lh=[],_h=[],zh=[];function Dh(e,t,n,a,s){const o=a*.45;e.beginPath();for(let l=0;l<10;l++){const c=l%2===0?a:o,u=Math.PI/5*l-Math.PI/2,h=t+Math.cos(u)*c,p=n+Math.sin(u)*c;l===0?e.moveTo(h,p):e.lineTo(h,p)}e.closePath(),e.fillStyle=s,e.fill()}const Vt=60,Ws=4,Qr="#888",Vs=["A","B","X","Y","LB","RB","LT","RT"],Uo=({lanes:e=Ih,events:t=Lh,currentTime:n,activeLanes:a=_h,difficulty:s,feedbackQueue:i=zh,isPlaying:o,height:l=300})=>{const{t:c}=xe(),u=e.length,h=d.useRef(null),p=d.useRef([]);return d.useEffect(()=>{p.current=i},[i]),d.useEffect(()=>{var R,M;const g=h.current;if(!g)return;const y=g.getContext("2d");if(!y)return;const m=window.devicePixelRatio||1,x=g.clientWidth,b=g.clientHeight;if(g.width=x*m,g.height=b*m,y.scale(m,m),y.clearRect(0,0,x,b),u===0)return;const f=x/u;for(let j=0;j<u;j++){const T=j*f;y.fillStyle=j%2===0?"rgba(255,255,255,0.03)":"rgba(255,255,255,0.01)",y.fillRect(T,0,f,b),j>0&&(y.strokeStyle="rgba(255,255,255,0.1)",y.lineWidth=1,y.beginPath(),y.moveTo(T,0),y.lineTo(T,b),y.stroke())}const k=b-Vt-10;y.strokeStyle="rgba(255,255,255,0.4)",y.lineWidth=2,y.setLineDash([8,4]),y.beginPath(),y.moveTo(0,k),y.lineTo(x,k),y.stroke(),y.setLineDash([]);const v=e.map(j=>ke.resolveCssColor((j==null?void 0:j.color)??Qr,g)),w=(b-Vt-20)/Ws;for(const j of t){const T=j.note.startTime,P=T+j.note.duration,A=T-n;if(A>Ws||P<n-.5)continue;const I=j.lane,L=I*f+4,N=f-8,_=k-A*w,ee=j.note.duration*w,Y=n>=T-.15&&n<=P+.15,O=n>P+.15,U=v[I]??Qr;O?y.fillStyle="rgba(100,100,100,0.3)":Y?(y.fillStyle=U,y.shadowColor=U,y.shadowBlur=12):(y.fillStyle=U,y.globalAlpha=.6);const V=Math.max(ee,8),K=6;y.beginPath(),y.moveTo(L+K,_),y.lineTo(L+N-K,_),y.quadraticCurveTo(L+N,_,L+N,_+K),y.lineTo(L+N,_+V-K),y.quadraticCurveTo(L+N,_+V,L+N-K,_+V),y.lineTo(L+K,_+V),y.quadraticCurveTo(L,_+V,L,_+V-K),y.lineTo(L,_+K),y.quadraticCurveTo(L,_,L+K,_),y.fill(),y.globalAlpha=1,y.shadowBlur=0,j.note.isGold&&Dh(y,L+N/2,_+V/2,Math.min(7,N/4),"#fbbf24")}for(let j=0;j<u;j++){const T=j*f,P=b-Vt,A=a[j],I=v[j]??Qr;y.fillStyle=A?I:"rgba(30,30,30,0.9)",y.fillRect(T+2,P+2,f-4,Vt-4),y.strokeStyle=A?"#fff":I,y.lineWidth=A?3:1,y.strokeRect(T+2,P+2,f-4,Vt-4),y.fillStyle=A?"#000":"#fff",y.font=`bold ${Math.min(24,f*.3)}px monospace`,y.textAlign="center",y.textBaseline="middle",y.fillText(((R=e[j])==null?void 0:R.label)??"",T+f/2,P+Vt/2);const L=((M=e[j])==null?void 0:M.gamepadButton)??-1;L>=0&&L<Vs.length&&(y.fillStyle=A?"rgba(0,0,0,0.6)":"rgba(255,255,255,0.4)",y.font="10px sans-serif",y.fillText(Vs[L],T+f/2,P+Vt-8))}for(const j of p.current){const T=n-j.time;if(T<0||T>.8)continue;const P=Math.max(0,1-T/.8),A=j.lane*f;y.save(),y.globalAlpha=P,y.font="bold 20px sans-serif",y.textAlign="center",y.textBaseline="bottom",y.fillStyle=j.type==="perfect"?"#10b981":j.type==="good"?"#f59e0b":"#ef4444";const I=j.type==="perfect"?c("padKaraokeOverlay.perfect","PERFECT"):j.type==="good"?c("padKaraokeOverlay.good","GOOD"):c("padKaraokeOverlay.miss","MISS");y.fillText(I,A+f/2,k-10-T*40),y.restore()}},[n,e,t,a,u,o,c]),!o||u===0?null:r.jsxs("div",{className:"nice-pad-karaoke-overlay",style:{position:"absolute",top:0,left:0,right:0,height:l,zIndex:35,pointerEvents:"none"},children:[r.jsx("canvas",{ref:h,role:"img","aria-label":c("padKaraokeOverlay.padKaraokeNoteHighwayHit","Pad karaoke note highway — hit notes in time with the music"),style:{width:"100%",height:"100%",display:"block"}}),r.jsxs("div",{style:{position:"absolute",top:8,right:12,background:"var(--nice-overlay-60, rgba(0,0,0,0.6))",color:"#fff",padding:"4px 12px",borderRadius:8,fontSize:12,fontWeight:700,textTransform:"uppercase",letterSpacing:1,display:"flex",alignItems:"center",gap:6},children:[r.jsx(F.NtdGamepad,{size:14})," ",c("padKaraokeOverlay.pad","PAD — {difficulty}").replace("{difficulty}",String(s))]})]})},In=["var(--player-color-1, #ef4444)","var(--player-color-2, #f59e0b)","var(--player-color-3, #10b981)","var(--player-color-4, #3b82f6)","var(--player-color-5, #8b5cf6)","var(--player-color-6, #ec4899)"],qo={easy:{keys:["f","j"],buttons:[0,1],labels:["F","J"]},normal:{keys:["d","f","j","k"],buttons:[3,2,0,1],labels:["D","F","J","K"]},hard:{keys:["s","d","f","j","k","l"],buttons:[4,3,2,0,1,5],labels:["S","D","F","J","K","L"]}};function ga(e){return 440*Math.pow(2,(e-69)/12)}function Ho(e,t){const n=qo[t],a=n.keys.length,s=[];for(const u of e)for(const h of u)s.includes(h.pitch)||s.push(h.pitch);if(s.sort((u,h)=>u-h),s.length===0)return n.keys.map((u,h)=>({index:h,key:u,gamepadButton:n.buttons[h],label:n.labels[h],minPitch:-999,maxPitch:999,color:In[h%In.length]}));const i=s[0],l=s[s.length-1]-i+1,c=[];for(let u=0;u<a;u++){const h=i+Math.floor(l*u/a),p=i+Math.floor(l*(u+1)/a)-1;c.push({index:u,key:n.keys[u],gamepadButton:n.buttons[u],label:n.labels[u],minPitch:u===0?-999:h,maxPitch:u===a-1?999:p,color:In[u%In.length]})}return c}function Ko(e,t){for(const s of t)if(e>=s.minPitch&&e<=s.maxPitch)return s.index;let n=0,a=1/0;for(const s of t){const i=(s.minPitch+s.maxPitch)/2,o=Math.abs(e-i);o<a&&(a=o,n=s.index)}return n}function Yo(e,t,n){const a=[];for(let s=0;s<e.length;s++)for(let i=0;i<e[s].length;i++){const o={...e[s][i]};o.startTime+=n,a.push({note:o,lane:Ko(o.pitch,t),lineIndex:s,noteIndex:i})}return a.sort((s,i)=>s.note.startTime-i.note.startTime),a}class Zo{constructor(t){this.lanes=[],this.events=[],this.raf=null,this.keysDown=new Set,this.gamepadButtonsDown=new Set,this.running=!1,this.getCurrentTime=()=>0,this.lastFeedbackTime=0,this.lastActiveNote=null,this.preWindow=.15,this.postWindow=.15,this.loop=()=>{var c,u,h,p,g,y,m,x;if(!this.running)return;const s=this.getCurrentTime();this.pollGamepad();const i=this.getActiveLanes();(u=(c=this.config).onLaneActive)==null||u.call(c,i);const o=this.findActiveNote(s);if(o!==this.lastActiveNote&&(this.lastActiveNote=o,(p=(h=this.config).onCurrentNote)==null||p.call(h,o)),i.some(Boolean)&&o){const b=o.lane,f=i.indexOf(!0);if(i[b]){const k=ga(o.note.pitch);this.config.onPitch(k),s-this.lastFeedbackTime>.3&&(this.lastFeedbackTime=s,(y=(g=this.config).onHitFeedback)==null||y.call(g,{type:"perfect",lane:b,time:s}))}else if(f>=0){const v=Math.abs(f-b)*3,w=ga(o.note.pitch+v);this.config.onPitch(w),s-this.lastFeedbackTime>.3&&(this.lastFeedbackTime=s,(x=(m=this.config).onHitFeedback)==null||x.call(m,{type:"miss",lane:f,time:s}))}}this.raf=requestAnimationFrame(this.loop)},this.config=t;const n=Hn(t.noteLines,t.bpm),a=(t.gap??0)/1e3;switch(this.lanes=Ho(n,t.difficulty),this.events=Yo(n,this.lanes,a),t.difficulty){case"easy":this.preWindow=.25,this.postWindow=.25;break;case"normal":this.preWindow=.15,this.postWindow=.15;break;case"hard":this.preWindow=.08,this.postWindow=.08;break}}getLanes(){return this.lanes}getEvents(){return this.events}start(t){this.running||(this.running=!0,this.getCurrentTime=t,this.handleKeyDown=this.handleKeyDown.bind(this),this.handleKeyUp=this.handleKeyUp.bind(this),window.addEventListener("keydown",this.handleKeyDown),window.addEventListener("keyup",this.handleKeyUp),this.loop())}stop(){this.running=!1,this.raf&&(cancelAnimationFrame(this.raf),this.raf=null),window.removeEventListener("keydown",this.handleKeyDown),window.removeEventListener("keyup",this.handleKeyUp),this.keysDown.clear(),this.gamepadButtonsDown.clear()}handleKeyDown(t){var a;const n=(a=t.target)==null?void 0:a.tagName;n&&["INPUT","TEXTAREA","SELECT"].includes(n)||this.keysDown.add(t.key.toLowerCase())}handleKeyUp(t){this.keysDown.delete(t.key.toLowerCase())}pollGamepad(){var a;const t=navigator.getGamepads?Array.from(navigator.getGamepads()).filter(Boolean):[];if(!t.length)return;const n=t[0];if(n){this.gamepadButtonsDown.clear();for(let s=0;s<n.buttons.length;s++)(a=n.buttons[s])!=null&&a.pressed&&this.gamepadButtonsDown.add(s)}}getActiveLanes(){const t=new Array(this.lanes.length).fill(!1);for(const n of this.lanes)(this.keysDown.has(n.key)||this.gamepadButtonsDown.has(n.gamepadButton))&&(t[n.index]=!0);return t}findActiveNote(t){for(const n of this.events){const a=n.note.startTime-this.preWindow,s=n.note.startTime+n.note.duration+this.postWindow;if(t>=a&&t<=s)return n}return null}}const ft=st.scoped("BaseStreamClient");function Us(e,t,n){if(t===n)return e.slice();const a=Math.round(e.length*n/t),s=new Float32Array(a),i=e.length/a;for(let o=0;o<a;o++){const l=o*i,c=Math.floor(l),u=Math.min(e.length-1,c+1),h=l-c;s[o]=e[c]*(1-h)+e[u]*h}return s}function Fh(e){const t=new Int16Array(e.length);for(let n=0;n<e.length;n++){const a=Math.max(-1,Math.min(1,e[n]));t[n]=a<0?Math.round(a*32768):Math.round(a*32767)}return t}const Sn=16e3,Oh="/scripts/pitch-worklet.js";class Xo{constructor(t){this.sendQueue=[],this.maxQueue=20,this.reconnectAttempts=0,this.maxReconnectAttempts=3,this.buffer=new Float32Array(0),this.externalStream=!1,this.usingWorklet=!1,this.closed=!1,this.started=!1,this.chunksSent=0,this.chunksDropped=0,this.responsesReceived=0,this.lastStatusLog=0,this.opts=t}onMaxReconnect(){var t,n;try{(n=(t=this.opts).onMaxReconnect)==null||n.call(t)}catch{}this.stopAudioNodes()}get useWorklet(){return!0}get workletPath(){return Oh}ts(){return new Date().toISOString().slice(11,23)}connectWs(){this.ws&&this.ws.readyState!==WebSocket.CLOSING&&this.ws.readyState!==WebSocket.CLOSED||(ft.info(`[${this.ts()}] connecting to ${this.opts.wsUrl}`),this.ws=new WebSocket(this.opts.wsUrl),this.ws.binaryType="arraybuffer",this.ws.onopen=()=>{var t,n,a,s,i,o;try{(n=(t=this.opts).onOpen)==null||n.call(t)}catch{}if(this.reconnectAttempts=0,this.chunksSent=0,this.chunksDropped=0,this.responsesReceived=0,ft.info(`[${this.ts()}] ws OPEN | worklet=${this.usingWorklet}`),this.ws&&this.ws.readyState===WebSocket.OPEN&&this.sendQueue.length){const l=this.sendQueue.length;try{for(const c of this.sendQueue)try{this.ws.send(c),this.chunksSent++,(s=(a=this.opts).onSend)==null||s.call(a,c.byteLength)}catch(u){(o=(i=this.opts).onError)==null||o.call(i,u);break}}finally{this.sendQueue=[]}ft.info(`[${this.ts()}] flushed ${l} queued chunks`)}},this.ws.onclose=t=>{var n,a;try{(a=(n=this.opts).onClose)==null||a.call(n,t)}catch{}if(ft.info(`[${this.ts()}] ws CLOSE code=${t.code} clean=${t.wasClean} | sent=${this.chunksSent} dropped=${this.chunksDropped} responses=${this.responsesReceived}`),this.sendQueue=[],this.ws=void 0,!this.closed&&this.started)if(this.reconnectAttempts++,this.reconnectAttempts<=this.maxReconnectAttempts){const s=Math.min(300*Math.pow(1.5,this.reconnectAttempts-1),5e3);ft.info(`[${this.ts()}] auto-reconnect #${this.reconnectAttempts} in ${s.toFixed(0)}ms`),this.reconnectTimer=setTimeout(()=>{this.closed||this.connectWs()},s)}else ft.warn(`[${this.ts()}] max reconnect attempts reached`),this.onMaxReconnect();else this.stopAudioNodes()},this.ws.onerror=t=>{var n,a;ft.warn(`[${this.ts()}] ws ERROR`,t);try{(a=(n=this.opts).onError)==null||a.call(n,t)}catch{}},this.ws.onmessage=t=>{var n,a;this.responsesReceived++;try{const s=typeof t.data=="string"?t.data:new TextDecoder().decode(t.data);this.handleWsMessage(s)}catch(s){(a=(n=this.opts).onError)==null||a.call(n,s)}})}handleAudioFrame(t){var g,y,m,x,b,f,k,v;const n=new Float32Array(this.buffer.length+t.length);n.set(this.buffer,0),n.set(t,this.buffer.length),this.buffer=n;const a=this.audioCtx.sampleRate,s=Math.round((this.opts.chunkMs??200)*Sn/1e3),i=Math.floor(this.buffer.length*Sn/a),o=Math.floor(i/s);if(o<=0)return;const l=o*s,c=Math.floor(l*a/Sn),u=this.buffer.slice(0,c);this.buffer=this.buffer.slice(c);const h=Us(u,a,Sn);let p=0;for(;p+s<=h.length;){const w=h.subarray(p,p+s),M=Fh(w).buffer,j=this.ws;if(j&&j.readyState===WebSocket.OPEN)try{j.send(M),this.chunksSent++,(y=(g=this.opts).onSend)==null||y.call(g,M.byteLength)}catch(P){(x=(m=this.opts).onError)==null||x.call(m,P)}else j&&j.readyState===WebSocket.CONNECTING?this.sendQueue.length<this.maxQueue&&(this.sendQueue.push(M),(f=(b=this.opts).onSend)==null||f.call(b,0)):(this.chunksDropped++,(v=(k=this.opts).onSend)==null||v.call(k,0));const T=Date.now();T-this.lastStatusLog>5e3&&(this.lastStatusLog=T,ft.info(`[${this.ts()}] STATUS: sent=${this.chunksSent} dropped=${this.chunksDropped} responses=${this.responsesReceived} ws=${(j==null?void 0:j.readyState)??"none"} worklet=${this.usingWorklet}`)),p+=s}if(p<h.length){const w=h.subarray(p),R=Us(w,Sn,a),M=new Float32Array(R.length+this.buffer.length);M.set(R,0),M.set(this.buffer,R.length),this.buffer=M}}async setupAudioNodes(t){if(this.useWorklet)try{await this.audioCtx.audioWorklet.addModule(this.workletPath);const a=new AudioWorkletNode(this.audioCtx,"pitch-processor");a.port.onmessage=s=>{this.handleAudioFrame(s.data)},t.connect(a),a.connect(this.audioCtx.destination),this.workletNode=a,this.usingWorklet=!0,ft.info(`[${this.ts()}] using AudioWorklet (pitch-processor)`);return}catch(a){ft.warn(`[${this.ts()}] AudioWorklet unavailable, falling back to ScriptProcessorNode`,a)}const n=4096;this.proc=this.audioCtx.createScriptProcessor(n,1,1),t.connect(this.proc),this.proc.connect(this.audioCtx.destination),this.proc.onaudioprocess=a=>{this.handleAudioFrame(a.inputBuffer.getChannelData(0))},this.usingWorklet=!1,ft.info(`[${this.ts()}] using ScriptProcessorNode fallback`)}stopAudioNodes(){try{this.workletNode&&(this.workletNode.port.close(),this.workletNode.disconnect(),this.workletNode=void 0)}catch{}try{this.proc&&(this.proc.onaudioprocess=null,this.proc.disconnect(),this.proc=void 0)}catch{}}async start(){if(this.closed)throw new Error("client closed");if(this.started)return;this.started=!0,(!this.ws||this.ws.readyState===WebSocket.CLOSED)&&this.connectWs(),this.mediaStream||(this.mediaStream=await navigator.mediaDevices.getUserMedia({audio:!0})),this.audioCtx=new AudioContext;const t=this.audioCtx.createMediaStreamSource(this.mediaStream);await this.setupAudioNodes(t)}async startWithMediaStream(t){if(this.closed)throw new Error("client closed");if(this.started)return;this.started=!0,this.externalStream=!0,(!this.ws||this.ws.readyState===WebSocket.CLOSED)&&this.connectWs(),this.mediaStream=t,this.audioCtx=new AudioContext;const n=this.audioCtx.createMediaStreamSource(this.mediaStream);await this.setupAudioNodes(n)}stop(){var t,n;if(ft.info(`[${this.ts()}] stop() called | closed=${this.closed} started=${this.started} sent=${this.chunksSent} responses=${this.responsesReceived}`),this.closed=!0,this.started=!1,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.stopAudioNodes(),this.audioCtx&&this.audioCtx.state!=="closed"&&this.audioCtx.close().catch(()=>{}),!this.externalStream)try{(t=this.mediaStream)==null||t.getTracks().forEach(a=>a.stop())}catch{}try{(n=this.ws)==null||n.close()}catch{}this.ws=void 0,this.sendQueue=[]}}const Bh=st.scoped("CrepeStreaming");class Gh extends Xo{constructor(t){super({...t,chunkMs:t.chunkMs??200}),this.crepeOpts=t}get tag(){return"CrepeStreamClient"}handleWsMessage(t){var a,s;const n=JSON.parse(t);(s=(a=this.crepeOpts).onMessage)==null||s.call(a,n)}onMaxReconnect(){var t,n;Bh.warn(`[${this.tag}] [${this.ts()}] triggering fallback`),this.stopAudioNodes();try{(n=(t=this.crepeOpts).onFallback)==null||n.call(t)}catch{}}}class Wh extends Xo{constructor(t){super({...t,chunkMs:t.chunkMs??100}),this.librosaOpts=t}get tag(){return"LibrosaStreamClient"}handleWsMessage(t){var a,s;const n=JSON.parse(t);(s=(a=this.librosaOpts).onMessage)==null||s.call(a,n)}get useWorklet(){return!1}}const It={debug:(...e)=>{},warn:(...e)=>{typeof console<"u"&&console.warn("[KaraokePitch]",...e)}};function Vh(e){const t=new Float32Array(e);for(let n=0;n<e;n++)t[n]=.5*(1-Math.cos(2*Math.PI*n/(e-1)));return t}function Uh(e,t){const n=new Float32Array(e.length);for(let a=0;a<e.length;a++)n[a]=e[a]*t[a];return n}function Qo({isPlaying:e,gameMode:t,players:n,playersMicKey:a,micAlgorithms:s={},defaultPitchAlgorithm:i="pitchy",micRmsThresholds:o={},micOffsets:l={},micGains:c={},micPitchThresholds:u={},micSmoothingWindows:h={},micHysteresisFrames:p={},micUseHanning:g={},micMonitorEnabled:y={},micMonitorVolumes:m={},currentTimeRef:x,isPadMode:b,clockOffsetMsRef:f,currentPartyIdRef:k,rtc:v}){const[w,R]=d.useState({}),M=d.useRef({}),j=d.useRef({}),[T,P]=d.useState({}),A=d.useRef({}),I=d.useRef([]),L=d.useRef(null),N=d.useRef(null),[,_]=d.useState({}),[,ee]=d.useState({}),[,Y]=d.useState({}),[O,U]=d.useState({}),[V,K]=d.useState(!0),[G,W]=d.useState(!1),C=d.useRef(n);C.current=n;const $=d.useRef(0),S=d.useRef(performance.now());return d.useEffect(()=>{I.current.forEach(E=>E()),I.current=[];const B={current:!1};function H(E,q,X=0){x.current!==$.current&&($.current=x.current,S.current=performance.now());const re=Math.min(.25,(performance.now()-S.current)/1e3),oe=x.current+re-X/1e3;R(D=>{const J=D[E]||[];return{...D,[E]:[...J,{t:oe,hz:q}]}}),M.current[E]=(M.current[E]||[]).concat({t:oe,hz:q});const se=M.current[E];se.length>500&&(M.current[E]=se.slice(-500))}function z(E,q,X,re=.02,oe=0,se=.6,D=0,J=0,ae=0,ce=!1){let le=null,ne=null,pe=null;return(async()=>{try{le=new AudioContext;let he=le.createMediaStreamSource(q);if(D>0){const be=le.createGain();be.gain.value=D,he.connect(be),he=be}const we=le.createAnalyser();we.fftSize=2048,he.connect(we);const je=new Float32Array(we.fftSize),Ne=ce?Vh(we.fftSize):null,Ee=[];let Ye=0;if(X==="pitchy")try{const{PitchDetector:be}=await import("pitchy");pe=be.forFloat32Array(we.fftSize)}catch(be){It.warn("pitchy import failed, falling back to autocorrelation",be)}const ue=()=>{try{we.getFloatTimeDomainData(je)}catch{}const be=Ne?Uh(je,Ne):je;let Oe=0;for(let Ie=0;Ie<be.length;Ie++)Oe+=be[Ie]*be[Ie];Oe=Math.sqrt(Oe/be.length);let Me=0;if(Oe>=re)if(pe)try{const[Ie,Qe]=pe.findPitch(be,le.sampleRate);Ie>50&&Ie<3e3&&Qe>se&&(Me=Ie)}catch{}else Me=zo(be,le.sampleRate,re),(Me<50||Me>3e3)&&(Me=0);if(Me>0&&J>1&&(Ee.push(Me),Ee.length>J&&Ee.shift(),Me=Ee.reduce((Ie,Qe)=>Ie+Qe,0)/Ee.length),Me>0)Ye=0,H(E,Me,oe);else if(Ye++,ae>0&&Ye<=ae&&Ee.length>0){const Ie=Ee[Ee.length-1];Ie>0&&H(E,Ie,oe)}ne=requestAnimationFrame(ue),A.current[E]=ne};ue()}catch(me){It.warn("startLocalPitch error",me)}})(),()=>{ne&&cancelAnimationFrame(ne),le&&le.close().catch(()=>{})}}function Z(E,q,X,re=0){X==="crepe"&&N.current?(N.current.stop(),N.current=null):X==="librosa"&&L.current&&(L.current.stop(),L.current=null);const oe=window.location,se=oe.protocol==="https:"?"wss:":"ws:",D=X==="librosa"?`${se}//${oe.host}/api/librosa/ws/pyin`:`${se}//${oe.host}/api/ai/audio/pitch/ws/pitch_server`,J=X==="librosa"?_:ee;J(pe=>({...pe,[E]:"connecting"}));const ae=[],ce=pe=>{if(pe>0){for(ae.push(x.current);ae.length>200;)ae.shift();X==="crepe"&&Y(fe=>({...fe,[E]:(fe[E]||0)+1}))}},le=()=>{J(pe=>({...pe,[E]:"closed"})),ae.length=0},ne=pe=>{if(typeof pe.hz=="number"&&pe.hz>0){const fe=pe.hz,he=(ae.length>0?ae.shift():x.current)-re/1e3;R(we=>{const je=we[E]||[];return{...we,[E]:[...je,{t:he,hz:fe}]}})}else ae.length>0&&ae.shift()};if(X==="librosa"){const pe=new Wh({wsUrl:D,onOpen:()=>J(fe=>({...fe,[E]:"connected"})),onClose:le,onError:fe=>{J(me=>({...me,[E]:"error"})),It.warn("Librosa WS error",fe)},onMessage:ne,onSend:ce});return L.current=pe,pe.startWithMediaStream(q).catch(fe=>{It.warn("Librosa client start failed",fe),J(me=>({...me,[E]:"failed"}))}),()=>{pe.stop(),L.current=null,J(fe=>({...fe,[E]:""}))}}else{const pe=new Gh({wsUrl:D,onOpen:()=>J(fe=>({...fe,[E]:"connected"})),onClose:le,onError:fe=>{J(me=>({...me,[E]:"error"})),It.warn("Crepe WS error",fe)},onMessage:ne,onSend:ce,onFallback:()=>{J(me=>({...me,[E]:"fallback-pitchy"})),N.current=null;const fe=z(E,q,"pitchy",.02,re);I.current.push(fe)}});return N.current=pe,pe.startWithMediaStream(q).catch(fe=>{It.warn("Crepe client start failed",fe),J(me=>({...me,[E]:"failed"}))}),()=>{pe.stop(),N.current=null,J(fe=>({...fe,[E]:""}))}}}if(e){if(R({}),t!=="pad"){const E={};C.current.forEach(q=>{if(!q.micId)return;const X=s[q.id]||i,re=q.micId&&o[q.micId]||.02,oe=q.micId&&l[q.micId]||0,se=q.micId&&c[q.micId]||0,D=q.micId&&u[q.micId]||.6,J=q.micId&&h[q.micId]||0,ae=q.micId&&p[q.micId]||0,ce=q.micId&&g[q.micId]||!1,le=q.micId&&y[q.micId]||!1,ne=(q.micId?m[q.micId]:void 0)??100,pe=new La;pe.startRecording({deviceId:q.micId,onLevel:()=>{},gain:se,monitorEnabled:le,monitorVolume:ne}).then(()=>{if(B.current){pe.stopRecording().catch(()=>{});return}E[q.id]=pe;const fe=pe.getStream();if(!fe){It.warn(`No stream from recorder for player ${q.id}`);return}if(X==="librosa"||X==="crepe"){const me=Z(q.id,fe,X,oe);I.current.push(me)}else{const me=z(q.id,fe,X,re,oe,D,se,J,ae,ce);I.current.push(me)}}).catch(fe=>It.warn(`recorder start failed for player ${q.id}`,fe))}),j.current=E}}else{const E=j.current,q=Object.keys(E).map(Number);Promise.allSettled(q.map(async X=>{const re=await E[X].stopRecording();return{pid:X,blob:re}})).then(X=>{const re={};for(const oe of X)oe.status==="fulfilled"&&oe.value.blob&&(re[oe.value.pid]=oe.value.blob);Object.keys(re).length>0&&P(oe=>({...oe,...re}))}),j.current={},Object.values(A.current).forEach(X=>X&&cancelAnimationFrame(X)),A.current={}}return()=>{B.current=!0,I.current.forEach(E=>E()),I.current=[],Object.values(j.current).forEach(E=>E.stopRecording().catch(()=>{})),j.current={},Object.values(A.current).forEach(E=>E&&cancelAnimationFrame(E)),A.current={}}},[e,t,a,s,i,o,l,c,u,h,p,g,y,m]),d.useEffect(()=>{if(!v)return;const B=300,H=async()=>{try{const Z={...M.current};for(const E of Object.keys(Z)){const q=Number(E),X=Z[q]||[];if(!X||X.length===0)continue;M.current[q]=[];const re=Fo(X,120),oe={playerId:q,points:re,clientNowUtc:new Date().toISOString(),quantized:!0};k!=null&&k.current&&(oe.EventId=k.current);try{v.isConnected()&&await v.publishTimelineUpdate(oe)}catch(se){It.warn("failed to publish timeline update, will retry",se),M.current[q]=(M.current[q]||[]).concat(X).slice(-1e3)}}}catch{}},z=window.setInterval(H,B);return()=>{z&&window.clearInterval(z)}},[v,k]),d.useEffect(()=>{if(!v)return;const B=H=>{try{const z=H;if(!z||typeof z.playerId>"u"||!Array.isArray(z.points))return;const Z=Number(z.playerId),E=z.points.map(q=>({t:q.t,hz:q.hz}));if(!E.length)return;if(z.serverTimeUtc){const q=Oo(z.serverTimeUtc,Date.now(),(f==null?void 0:f.current)||0);U(X=>({...X,[Z]:q}))}R(q=>{const X=q[Z]||[];return{...q,[Z]:[...X,...E]}})}catch{}};return v.onTimelineUpdate(B),()=>v.offTimelineUpdate(B)},[v,f]),{livePitch:w,setLivePitch:R,recordings:T,recordersRef:j,unsentPitchRef:M,pitchCleanupsRef:I,remoteLatencyMs:O,showRemoteTimelines:V,setShowRemoteTimelines:K,compactTimelines:G,setCompactTimelines:W}}function Jo(e){return e>=.95?"Perfect":e>=.8?"Great":e>=.6?"Good":e>=.4?"OK":e>=.2?"Bad":"Awful"}function el(e){return e>=50?3:e>=30?2.5:e>=20?2:e>=10?1.5:1}function tl(e,t,n){const{semitoneTolerance:a,preWindow:s,postExtra:i}=n,o=n.segMs??.25,l=typeof n.completionBonusFactor=="number"?n.completionBonusFactor:.15,c=typeof n.goldFullBonusFactor=="number"?n.goldFullBonusFactor:.3,u=typeof n.difficultyMult=="number"?n.difficultyMult:1,h=!!n.disableGoldNotes;let p=0,g=0,y=0;const m=[];let x=0,b=0,f=0;const k=new Map;e.forEach((P,A)=>{const I=P.startTime,L=P.startTime+P.duration,N=I-s,_=L+i,ee=t.filter(C=>C.t>=N&&C.t<=_&&C.hz>0);if(!ee||ee.length===0)return;const Y=Math.max(1,Math.ceil((P.duration||.25)/o)),O=Math.max(10,Math.round(100*(P.duration||1))),U=Math.max(1,Math.round(O/Y));let V=0;const K=[];for(let C=0;C<Y;C++){const $=I+C*(P.duration/Y),S=I+(C+1)*(P.duration/Y),B=Math.min(.06,P.duration/Y*.2),H=$-B,z=S+B,Z=t.filter(se=>se.t>=H&&se.t<=z&&se.hz>0);if(!Z||Z.length===0)continue;let E=0;Z.forEach(se=>{let J=((12*Math.log2(se.hz/440)+69)%12+12)%12;for(;J-P.pitch>6;)J-=12;for(;J-P.pitch<-6;)J+=12;const ae=Math.abs(J-P.pitch);E+=ae});const q=E/Z.length;let X=0;if(a<=0)X=q===0?1:0;else{const se=a*2;X=Math.max(0,1-Math.min(q/se,1))}if(X<=0)continue;const re=!h&&P.isGold?2:1,oe=Math.round(U*re*X);oe>0&&(p+=oe,V+=oe,K.push({segIndex:C,frac:X,add:oe,segStart:H,segEnd:z,visualStart:$,visualEnd:S}))}const G=P.line??0;k.has(G)||k.set(G,{total:0,hit:0,comboBonus:0});const W=k.get(G);if(W.total++,V>0){x++,x>b&&(b=x),W.hit++;const C=el(x),$=C>1?Math.round(V*(C-1)):0;f+=$,W.comboBonus+=$;const S=Math.max(1,Math.ceil((P.duration||.25)/o)),H=K.length>=S,z=H?Math.round(Math.max(10,Math.round(100*(P.duration||1)))*l*(!h&&P.isGold?1.5:1)*u):0,Z=H&&!h&&P.isGold?Math.round(Math.max(10,Math.round(100*(P.duration||1)))*c*u):0;g+=z,y+=Z,m.push({noteKey:`${P.line??0}-${P.idx??0}`,segments:K,totalAdded:V,completed:H,completionBonus:z,goldFullBonus:Z})}else x=0});const v=[];for(const[P,A]of k.entries()){const I=A.total>0?A.hit/A.total:0;v.push({verseIndex:P,hitFraction:I,label:Jo(I),comboBonus:A.comboBonus})}const w={maxCombo:b,currentCombo:0,totalComboBonus:f},R=f+g+y,M=m.length,j=m.filter(P=>P.completed).length,T={hits:M,misses:e.length-M,good:M-j,perfect:j,maxCombo:b};return{classicScore:p,bonusScore:R,totalScore:p+R,perNote:m,combo:w,verseRatings:v,noteStats:T}}function nl(e,t){let n=0;for(const a of e){const s=Math.max(10,Math.round(100*(a.duration||1))),i=!t&&a.isGold?2:1;n+=s*i}return n}function rl(e,t){return t<=0?0:Math.min(1e4,Math.round(e/t*1e4))}function al(e,t,n){const a=nl(t,n);if(a<=0)return{...e,classicScore:0,bonusScore:0,totalScore:0};const s=rl(e.classicScore,a),i=Math.round(e.bonusScore/a*1e4);return{...e,classicScore:s,bonusScore:i,totalScore:s+i}}const kn={maxCombo:0,currentCombo:0,totalComboBonus:0},qs={hits:0,misses:0,good:0,perfect:0,maxCombo:0};function sl({livePitch:e,uploadedSong:t,isPlaying:n,difficulty:a,players:s,isPadMode:i}){const[o,l]=d.useState(0),[c,u]=d.useState(0),[h,p]=d.useState(0),[g,y]=d.useState([]),[m,x]=d.useState(kn),[b,f]=d.useState([]),[k,v]=d.useState([]),[w,R]=d.useState({}),[M,j]=d.useState({}),[T,P]=d.useState({}),[A,I]=d.useState({}),[L,N]=d.useState({});return d.useEffect(()=>{if(!t||!n)return;const _=Hn(t.notes.map(Z=>Z.noteLine),t.bpm??void 0),ee=(t.gap??0)/1e3,Y=Ka(_,ee),O=zr(a),U=[];let V=null,K=null,G=null,W=[];const C={},$={},S={},B={},H={},z=i?s[0]:s.find(Z=>!!Z.micId)||s[0];for(let Z=0;Z<s.length;Z++){const E=s[Z],q=(E==null?void 0:E.id)!=null?e[E.id]||[]:[];if(q.length===0){U.push({id:E.id,name:E.name||`Player ${E.id}`,color:E.color||Xe[Z%Xe.length],classicScore:0,bonusScore:0,totalScore:0}),C[E.id]=[],$[E.id]={...kn},S[E.id]=[],B[E.id]=0,H[E.id]={...qs};continue}const X=Ua(E.id),re=!!(X!=null&&X.disableGoldNotes),oe=tl(Y,q,{semitoneTolerance:O.semitoneTolerance,preWindow:O.preWindow,postExtra:O.postExtra,difficultyMult:O.difficultyMult,disableGoldNotes:re}),se=al(oe,Y,re);U.push({id:E.id,name:E.name||`Player ${E.id}`,color:E.color||Xe[Z%Xe.length],classicScore:se.classicScore,bonusScore:se.bonusScore,totalScore:se.totalScore}),C[E.id]=Do(oe.perNote,_,ee),$[E.id]=oe.combo??{...kn},S[E.id]=oe.verseRatings??[],B[E.id]=se.totalScore,H[E.id]=oe.noteStats??{...qs},E.id===(z==null?void 0:z.id)&&(V=se,K=oe.combo??null,G=oe.verseRatings??null,W=C[E.id])}v(U),R(C),j($),P(S),I(B),N(H),V?(l(V.classicScore),u(V.bonusScore),p(V.totalScore),y(W),x(K??kn),f(G??[])):(l(0),u(0),p(0),y([]),x(kn),f([]))},[e,t,n,a,s,i]),{liveScore:o,liveBonusScore:c,liveTotalScore:h,liveSegmentScores:g,liveCombo:m,liveVerseRatings:b,perPlayerScores:k,perPlayerSegmentScores:w,perPlayerCombo:M,perPlayerVerseRatings:T,perPlayerTotalScores:A,perPlayerNoteStats:L}}const qh=[],Hh=e=>!!e&&/youtu(\.be|be\.com)/i.test(e),Kh=({players:e=qh,song:t,initialSong:n=null,difficulty:a="normal",gameMode:s="normal",height:i=480,showTimelines:o=!0,showLyrics:l=!0,singleTimeline:c=!1,requestMicPermission:u=!0,initiallyActivated:h=!1,showUploader:p=!1,parseSong:g,micAlgorithms:y,defaultPitchAlgorithm:m="pitchy",micRmsThresholds:x,micOffsets:b,micGains:f,micPitchThresholds:k,micSmoothingWindows:v,micHysteresisFrames:w,micUseHanning:R,micMonitorEnabled:M,micMonitorVolumes:j,searchYouTubeByArtistTitle:T,fetchTopSingings:P,onSaveResults:A,rtc:I,onSongChange:L,onPlayingChange:N,onTimeUpdate:_,onEnded:ee,onContinue:Y,renderReport:O,t:U,className:V,style:K,id:G,accessMode:W,"data-testid":C})=>{var _e;const{t:$}=xe(),S=U??$,[B,H]=d.useState(t??n??null),[z,Z]=d.useState(!1),[E,q]=d.useState(0),[X,re]=d.useState(h),[oe,se]=d.useState(!1),[D,J]=d.useState([]),[ae,ce]=d.useState(""),[le,ne]=d.useState(null),[pe,fe]=d.useState(0),me=s==="pad",[he,we]=d.useState([]),[je,Ne]=d.useState([]),[Ee,Ye]=d.useState([]),[ue,be]=d.useState([]),Oe=d.useRef(null),Me=d.useRef(null),Ie=d.useRef(null),Qe=d.useRef(!1),Be=d.useRef(0);d.useEffect(()=>{Be.current=E},[E]);const He=d.useRef(t);d.useEffect(()=>{t!==void 0&&t!==He.current&&(He.current=t,H(t),se(!1),q(0),fe(ve=>ve+1))},[t]);const Lt=d.useMemo(()=>JSON.stringify(e.map(ve=>({id:ve.id,micId:ve.micId}))),[e]),{livePitch:ct,setLivePitch:ht,recordings:it,remoteLatencyMs:wt}=Qo({isPlaying:z,gameMode:s,players:e,playersMicKey:Lt,micAlgorithms:y,defaultPitchAlgorithm:m,micRmsThresholds:x,micOffsets:b,micGains:f,micPitchThresholds:k,micSmoothingWindows:v,micHysteresisFrames:w,micUseHanning:R,micMonitorEnabled:M,micMonitorVolumes:j,currentTimeRef:Be,isPadMode:me,rtc:I}),Je=sl({livePitch:ct,uploadedSong:B,isPlaying:z,difficulty:a,players:e,isPadMode:me}),Pt=d.useRef(Je);Pt.current=Je;const Xt=d.useMemo(()=>B?Go(B,s):null,[B,s]),Se=((_e=e[0])==null?void 0:_e.id)??1;d.useEffect(()=>{var Re;if(!me||!z||!B){(Re=Oe.current)==null||Re.stop(),Oe.current=null,we([]),Ne([]),Ye([]),be([]);return}const ve=new Zo({difficulty:a,noteLines:B.notes.map(Le=>Le.noteLine),bpm:B.bpm??void 0,gap:B.gap??0,onPitch:Le=>{const Ge=Be.current;ht(De=>{const tt=De[Se]||[];return{...De,[Se]:[...tt,{t:Ge,hz:Le}]}})},onHitFeedback:Le=>be(Ge=>[...Ge.slice(-20),Le]),onLaneActive:Le=>Ye(Le)});return we(ve.getLanes()),Ne(ve.getEvents()),Ye(new Array(ve.getLanes().length).fill(!1)),ve.start(()=>Be.current),Oe.current=ve,()=>{ve.stop(),Oe.current=null}},[me,z,B,a,Se,ht]);const Ce=d.useCallback(ve=>{Z(ve),N==null||N(ve)},[N]),We=d.useCallback(ve=>{q(ve),_==null||_(ve)},[_]),ze=d.useCallback(()=>{var Re;try{Yt()}catch{}const ve=()=>{re(!0),Qe.current=!0};!me&&u&&((Re=navigator.mediaDevices)!=null&&Re.getUserMedia)?navigator.mediaDevices.getUserMedia({audio:!0}).then(Le=>Le.getTracks().forEach(Ge=>Ge.stop())).catch(()=>{}).finally(ve):ve()},[me,u]);d.useEffect(()=>{if(!X||!Qe.current)return;Qe.current=!1;const ve=window.setInterval(()=>{Me.current&&(window.clearInterval(ve),Me.current.play())},100),Re=window.setTimeout(()=>window.clearInterval(ve),3e3);return()=>{window.clearInterval(ve),window.clearTimeout(Re)}},[X]);const $e=d.useCallback(()=>{se(!0),ee==null||ee();const ve=(B==null?void 0:B.id)??0,Re=Pt.current,Le=[];for(const De of e){const tt=Re.perPlayerTotalScores[De.id]??0;if(tt<=0)continue;const Ke=Re.perPlayerNoteStats[De.id];Le.push({playerId:De.id,songId:ve,score:tt,hits:(Ke==null?void 0:Ke.hits)??0,misses:(Ke==null?void 0:Ke.misses)??0,good:(Ke==null?void 0:Ke.good)??0,perfect:(Ke==null?void 0:Ke.perfect)??0,combo:(Ke==null?void 0:Ke.maxCombo)??0})}const Ge=()=>{P&&ve>0&&Promise.resolve(P(ve)).then(J).catch(()=>{})};A&&Le.length>0?Promise.resolve(A(Le)).then(Ge).catch(Ge):Ge()},[e,B,A,P,ee]);d.useEffect(()=>{var ve;s==="demo"&&z&&E>=12&&((ve=Me.current)==null||ve.pause(),$e())},[s,z,E,$e]),d.useEffect(()=>{if(!B||pe===0||!T||Hh(B.videoPath))return;if(B.youtubeId){const Re=`https://www.youtube.com/watch?v=${B.youtubeId}`;H(Le=>Le&&{...Le,videoPath:Re});return}if(!B.artist||!B.title)return;let ve=!1;return ce(S("karaokeManager.ytSearching","Searching YouTube…")),ne("searching"),Promise.resolve(T(B.artist,B.title)).then(Re=>{if(!ve)if(Re){const Le=`https://www.youtube.com/watch?v=${Re}`;H(Ge=>Ge&&{...Ge,videoPath:Le}),ce(""),ne(null)}else ce(S("karaokeManager.ytNotFound","Not found on YouTube")),ne("error"),window.setTimeout(()=>{ve||(ce(""),ne(null))},4e3)}).catch(()=>{ve||(ce(S("karaokeManager.ytSearchError","Search error")),ne("error"))}),()=>{ve=!0}},[pe,B,T,S]);const Pe=d.useCallback(()=>{var ve,Re;se(!1),ht({}),(ve=Me.current)==null||ve.seekTo(0),(Re=Me.current)==null||Re.play()},[ht]),de=d.useCallback(()=>{se(!1),Y==null||Y()},[Y]),ge=d.useCallback(ve=>{H(ve),se(!1),q(0),fe(Re=>Re+1),L==null||L(ve)},[L]),Ae=d.useMemo(()=>{if(!c)return e;const ve=e.find(Re=>!!Re.micId)||e[0];return ve?[ve]:[]},[e,c]),Te=((B==null?void 0:B.gap)??0)/1e3;return W==="hidden"?null:r.jsxs("div",{className:`nice-karaoke-manager${V?` ${V}`:""}`,style:{position:"relative",textAlign:"center",minHeight:i,...K},id:G,"data-testid":C,children:[ae&&r.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",gap:8,margin:"10px auto",padding:"8px 16px",maxWidth:420,borderRadius:8,fontSize:14,fontWeight:500,background:"var(--nice-accent, #3b82f6)",color:"var(--nice-text-on-primary, #fff)"},children:[le==="error"?r.jsx(F.NtdClose,{size:16}):r.jsx(F.NtdSearch,{size:16}),ae]}),!B&&p&&r.jsx(Vo,{onSongUpload:ge,parseSong:g,t:S}),B&&!X&&r.jsxs("button",{type:"button",className:"nice-karaoke-manager__activate",onClick:ze,style:{position:"absolute",inset:0,zIndex:30,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:16,border:"none",cursor:"pointer",background:"var(--nice-overlay-80, rgba(0,0,0,0.82))",color:"#fff"},children:[r.jsx("div",{style:{fontSize:56,lineHeight:0},children:me?r.jsx(F.NtdGamepad,{size:56}):r.jsx(F.NtdMicrophone,{size:56})}),r.jsx("h2",{style:{margin:0,fontSize:22,fontWeight:700,color:"#fff"},children:S("karaokeManager.activateAudio","Tap to start")}),r.jsx("p",{style:{margin:0,maxWidth:360,fontSize:14,color:"var(--nice-text-muted, #94a3b8)"},children:me?S("karaokeManager.padHint","Hit the notes with your keys or pad!"):S("karaokeManager.micHint","Your browser needs a tap to unlock the microphone and audio.")})]}),B&&r.jsxs("div",{ref:Ie,style:{position:"relative",width:"100%",maxWidth:1200,margin:"0 auto"},children:[r.jsx("div",{style:{width:"100%",position:"relative",zIndex:10},children:r.jsx(Io,{tracks:Xt?[Xt]:[],autoPlay:!1,uiMode:"nobuttons",height:i,externalRef:Me,onPlayingChange:Ce,onTimeUpdate:We,onEnded:$e})}),o&&X&&r.jsx("div",{style:{position:"absolute",inset:0,zIndex:20,pointerEvents:"none"},children:Ae.map((ve,Re)=>{const Le=ct[ve.id]||[],Ge=Te?Le.map(De=>({t:De.t-Te,hz:De.hz})):Le;return r.jsx(To,{song:B,currentTime:E,playerRef:Ie,userPitch:Ge,segmentScores:Je.perPlayerSegmentScores[ve.id],combo:Je.perPlayerCombo[ve.id],verseRatings:Je.perPlayerVerseRatings[ve.id],config:{playerName:ve.name,score:Je.perPlayerTotalScores[ve.id]??0,playerBgColor:ve.color||Xe[Re%Xe.length],difficultyLevel:a,isPlaying:z,playerCount:Ae.length,latencyMs:wt[ve.id]??null,top:30+Re*160}},ve.id)})}),me&&he.length>0&&r.jsx(Uo,{lanes:he,events:je,currentTime:E,activeLanes:Ee,difficulty:a,feedbackQueue:ue,isPlaying:z}),l&&X&&r.jsx("div",{style:{position:"absolute",bottom:20,left:0,right:0,zIndex:25,pointerEvents:"none"},children:r.jsx(po,{song:B,currentTime:E})})]}),oe&&Object.keys(it).length>0&&r.jsx(Yh,{recordings:it,players:e,t:S}),oe&&r.jsx($o,{uploadedSong:B,playerScores:Je.perPlayerScores,topSingings:D,onRestart:Pe,onContinue:de,t:S,renderReport:O})]})},Yh=({recordings:e,players:t,t:n})=>{const a=d.useMemo(()=>{const s={};for(const[i,o]of Object.entries(e))o&&(s[Number(i)]=URL.createObjectURL(o));return s},[e]);return d.useEffect(()=>()=>{for(const s of Object.values(a))URL.revokeObjectURL(s)},[a]),r.jsxs("div",{style:{margin:"24px auto",maxWidth:640,background:"var(--nice-bg-tertiary)",borderRadius:12,padding:16,textAlign:"left"},children:[r.jsxs("h4",{style:{marginTop:0,color:"var(--nice-text-primary, #fff)"},children:[r.jsx(F.NtdMicrophone,{size:16})," ",n("karaokeManager.playerRecordings","Player recordings")]}),r.jsx("ul",{style:{listStyle:"none",padding:0,margin:0,color:"var(--nice-text-primary, #fff)"},children:t.map(s=>r.jsxs("li",{style:{marginBottom:12,display:"flex",alignItems:"center",gap:10},children:[r.jsx("b",{children:s.name||n("karaokeManager.player","Player {id}").replace("{id}",String(s.id))}),a[s.id]?r.jsxs(r.Fragment,{children:[r.jsx("audio",{controls:!0,src:a[s.id],style:{flex:1,maxWidth:300}}),r.jsxs("a",{href:a[s.id],download:`${s.name||`player-${s.id}`}-recording.webm`,style:{color:"var(--nice-accent-light, #4fc3f7)",whiteSpace:"nowrap"},children:[r.jsx(F.NtdDownload,{size:13})," ",n("karaokeManager.download","Download")]})]}):r.jsx("span",{style:{opacity:.6},children:n("karaokeManager.noRecording","No recording")})]},s.id))})]})},il=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"];function on(e){return 12*Math.log2(e/440)+69}function Jn(e){const t=il[Math.round(e)%12],n=Math.floor(Math.round(e)/12)-1;return`${t}${n}`}function Jr(e,t){const n=e-t;return n-12*Math.round(n/12)}function er(e,t){if(e.length===0)return 0;const n=t/100*(e.length-1),a=Math.floor(n),s=Math.ceil(n);return a===s?e[a]:e[a]+(e[s]-e[a])*(n-a)}function ol(e){const{playerName:t,playerColor:n,songTitle:a,songArtist:s,songBpm:i,difficulty:o,pitchPoints:l,notes:c,verseRatings:u,combo:h,classicScore:p,bonusScore:g,totalScore:y,micSettings:m}=e,x=l.filter(ue=>ue.hz>0),b=x.map(ue=>on(ue.hz)),f=[],k=[],v=[...c].sort((ue,be)=>ue.startTime-be.startTime);function w(ue){let be=0,Oe=v.length-1;for(;be<=Oe;){const Me=be+Oe>>>1,Ie=v[Me];if(ue<Ie.startTime)Oe=Me-1;else if(ue>Ie.startTime+Ie.duration)be=Me+1;else return Ie.pitch}return null}const R=[];for(const ue of l){const be=ue.hz>0?on(ue.hz):0,Oe=w(ue.t);R.push({t:ue.t,sung:be,expected:Oe}),be>0&&Oe!==null&&f.push(Jr(be,Oe)*100)}const M=R.flatMap(ue=>ue.sung>0&&ue.expected!==null?[ue.sung-ue.expected]:[]).sort((ue,be)=>ue-be),j=M.length>0?12*Math.round(er(M,50)/12):0,T=R.map(ue=>({t:ue.t,sung:ue.sung,expected:ue.expected===null?0:ue.expected+j}));let P=0;for(const ue of v){const be=ue.startTime-.3,Oe=ue.startTime+ue.duration;for(;P<x.length&&x[P].t<be;)P++;P<x.length&&x[P].t<=Oe&&k.push((x[P].t-ue.startTime)*1e3)}const A=f.map(Math.abs),I=[...A].sort((ue,be)=>ue-be),L=A.length>0?A.reduce((ue,be)=>ue+be,0)/A.length:0,N=er(I,50),_=A.length>1?Math.sqrt(A.reduce((ue,be)=>ue+(be-L)**2,0)/(A.length-1)):0,ee=A.filter(ue=>ue<=50).length,Y=A.filter(ue=>ue<=15).length,O=A.length>0?ee/A.length*100:0,U=A.length>0?Y/A.length*100:0,V=["< −100","−100 to −50","−50 to −25","−25 to −15","−15 to 0","0 to +15","+15 to +25","+25 to +50","+50 to +100","> +100"],K=new Array(10).fill(0);for(const ue of f){const be=ue<-100?0:ue<-50?1:ue<-25?2:ue<-15?3:ue<0?4:ue<15?5:ue<25?6:ue<50?7:ue<100?8:9;K[be]++}const G=V.map((ue,be)=>({centRange:ue,count:K[be],pct:f.length>0?K[be]/f.length*100:0})),W=x.map(ue=>ue.hz).sort((ue,be)=>ue-be),C=W.length>0?W[0]:0,$=W.length>0?W[W.length-1]:0,S=C>0?on(C):0,B=$>0?on($):0,H=B-S,z=[...b].sort((ue,be)=>ue-be),Z=er(z,10),E=er(z,90),q=new Array(12).fill(0);for(const ue of b){const be=Math.round(ue)%12;be>=0&&be<12&&q[be]++}const X=q.reduce((ue,be)=>ue+be,0),re=il.map((ue,be)=>({note:ue,count:q[be],pct:X>0?q[be]/X*100:0})),oe=Zh(x),se=k.length>0?k.reduce((ue,be)=>ue+be,0)/k.length:0,D=k.length>1?Math.sqrt(k.reduce((ue,be)=>ue+(be-se)**2,0)/(k.length-1)):0,J=D>0?Math.max(0,Math.min(100,100-D/2)):100;let ae=0,ce=0;for(let ue=1;ue<b.length;ue++){const be=Math.abs(b[ue]-b[ue-1]);ae+=be,ce++}const le=ce>0?ae/ce*100/12:0,ne=l.filter(ue=>ue.hz<=0).length,pe=l.length>0?(1-ne/l.length)*100:0,fe=new Map;for(const ue of c){const be=ue.line??0;fe.has(be)||fe.set(be,[]),fe.get(be).push(ue)}const me=new Map;for(const ue of x){const be=w(ue.t);if(be===null)continue;let Oe=0,Me=v.length-1,Ie=-1;for(;Oe<=Me;){const Be=Oe+Me>>>1,He=v[Be];if(ue.t<He.startTime)Me=Be-1;else if(ue.t>He.startTime+He.duration)Oe=Be+1;else{Ie=He.line??0;break}}if(Ie<0)continue;const Qe=Math.abs(Jr(on(ue.hz),be)*100);me.has(Ie)||me.set(Ie,[]),me.get(Ie).push(Qe)}const he=u.map(ue=>{const be=fe.get(ue.verseIndex)??[],Oe=me.get(ue.verseIndex)??[],Me=Oe.length>0?Oe.reduce((Ie,Qe)=>Ie+Qe,0)/Oe.length:0;return{verseIndex:ue.verseIndex,label:ue.label,hitFraction:ue.hitFraction,avgCentDeviation:Math.round(Me*10)/10,noteCount:be.length,notesHit:Math.round(ue.hitFraction*be.length),comboBonus:ue.comboBonus}}),we=2,je=.5,Ne=l.length>0?l[l.length-1].t:0,Ee=[],Ye=R.flatMap(ue=>ue.sung>0&&ue.expected!==null?[{t:ue.t,hit:Math.abs(Jr(ue.sung,ue.expected))<=.5}]:[]);if(Ye.length>0){let ue=0,be=0,Oe=0;for(let Me=0;Me<=Ne;Me+=je){const Ie=Me-we/2,Qe=Me+we/2;for(;be<Ye.length&&Ye[be].t<Qe;)Ye[be].hit&&Oe++,be++;for(;ue<be&&Ye[ue].t<Ie;)Ye[ue].hit&&Oe--,ue++;const Be=be-ue;Ee.push({t:Me,accuracy:Be>0?Oe/Be*100:0})}}else for(let ue=0;ue<=Ne;ue+=je)Ee.push({t:ue,accuracy:0});return{playerName:t,playerColor:n,songTitle:a,songArtist:s,songBpm:i,difficulty:o,timestamp:new Date().toISOString(),classicScore:p,bonusScore:g,totalScore:y,maxCombo:(h==null?void 0:h.maxCombo)??0,totalComboBonus:(h==null?void 0:h.totalComboBonus)??0,totalPitchPoints:l.length,avgCentDeviation:Math.round(L*10)/10,medianCentDeviation:Math.round(N*10)/10,stdDevCents:Math.round(_*10)/10,intonationAccuracyPct:Math.round(O*10)/10,perfectHitPct:Math.round(U*10)/10,pitchDeviationHistogram:G,lowestHz:Math.round(C*10)/10,highestHz:Math.round($*10)/10,lowestNote:S>0?Jn(S):"—",highestNote:B>0?Jn(B):"—",rangeInSemitones:Math.round(H*10)/10,tessituraLow:Z>0?Jn(Z):"—",tessituraHigh:E>0?Jn(E):"—",pitchClassDistribution:re,vibrato:oe,avgOnsetDeviationMs:Math.round(se*10)/10,rhythmStabilityPct:Math.round(J*10)/10,jitterPct:Math.round(le*100)/100,shimmerProxy:Math.round(pe*10)/10,verseMetrics:he,micSettings:m,pitchOverTime:T,accuracyOverTime:Ee}}function Zh(e){if(e.length<20)return{detected:!1,avgRateHz:0,avgExtentCents:0,regularityPct:0};const t=e.map(y=>on(y.hz)),n=e.map(y=>y.t),a=.5,s=[],i=[];let o=0,l=0,c=0;for(let y=0;y<e.length;y++){for(l+=t[y],c++;o<y&&n[y]-n[o]>=a;)l-=t[o],c--,o++;if(c<6||(y-o)%10!==0)continue;const m=l/c;let x=0,b=t[o]-m,f=Math.abs(b);for(let w=o+1;w<=y;w++){const R=t[w]-m;R*b<0&&x++,b=R;const M=Math.abs(R);M>f&&(f=M)}const k=n[y]-n[o];if(k<=0)continue;const v=x/2/k;v>=3&&v<=12&&(s.push(v),i.push(f*100))}if(s.length<3)return{detected:!1,avgRateHz:0,avgExtentCents:0,regularityPct:0};const u=s.reduce((y,m)=>y+m,0)/s.length,h=i.reduce((y,m)=>y+m,0)/i.length,p=Math.sqrt(s.reduce((y,m)=>y+(m-u)**2,0)/s.length),g=Math.max(0,Math.min(100,100-p*20));return{detected:!0,avgRateHz:Math.round(u*10)/10,avgExtentCents:Math.round(h*10)/10,regularityPct:Math.round(g)}}const Q={overlay:{position:"fixed",inset:0,background:"var(--nice-overlay-90, rgba(0,0,0,0.92))",display:"flex",alignItems:"flex-start",justifyContent:"center",zIndex:250,color:"var(--nice-text, #e2e8f0)",overflowY:"auto",padding:"24px 12px"},container:{background:"var(--nice-bg, #0f172a)",borderRadius:16,padding:32,width:"min(960px, 95vw)",boxShadow:"0 16px 48px var(--nice-overlay-60, rgba(0,0,0,0.6))",fontFamily:"'Segoe UI', system-ui, -apple-system, sans-serif"},header:{textAlign:"center",marginBottom:24,borderBottom:"2px solid var(--nice-border, #334155)",paddingBottom:20},title:{fontSize:28,fontWeight:800,color:"var(--nice-text, #f1f5f9)",margin:"0 0 4px"},subtitle:{fontSize:14,color:"var(--nice-text-muted, #64748b)",margin:0},sectionTitle:{fontSize:18,fontWeight:700,color:"var(--nice-accent, #38bdf8)",margin:"28px 0 12px",borderBottom:"1px solid var(--nice-bg-secondary, #1e293b)",paddingBottom:6,display:"flex",alignItems:"center",gap:8},table:{width:"100%",borderCollapse:"collapse",fontSize:13,margin:"8px 0"},th:{background:"var(--nice-bg-secondary, #1e293b)",color:"var(--nice-text-muted, #94a3b8)",padding:"8px 12px",textAlign:"left",fontWeight:600,fontSize:12,textTransform:"uppercase",letterSpacing:.5,borderBottom:"2px solid var(--nice-border, #334155)"},thRight:{background:"var(--nice-bg-secondary, #1e293b)",color:"var(--nice-text-muted, #94a3b8)",padding:"8px 12px",textAlign:"right",fontWeight:600,fontSize:12,textTransform:"uppercase",letterSpacing:.5,borderBottom:"2px solid var(--nice-border, #334155)"},td:{padding:"6px 12px",borderBottom:"1px solid var(--nice-bg-secondary, #1e293b)",color:"var(--nice-text-secondary, #cbd5e1)"},tdRight:{padding:"6px 12px",borderBottom:"1px solid var(--nice-bg-secondary, #1e293b)",textAlign:"right",color:"var(--nice-text, #e2e8f0)",fontWeight:500},tdBold:{padding:"6px 12px",borderBottom:"1px solid var(--nice-bg-secondary, #1e293b)",color:"var(--nice-text, #f1f5f9)",fontWeight:700},kpiGrid:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(180px, 1fr))",gap:12,margin:"12px 0"},kpiCard:{background:"var(--nice-bg-secondary, #1e293b)",borderRadius:10,padding:"14px 16px",textAlign:"center",border:"1px solid var(--nice-border, #334155)"},kpiValue:{fontSize:26,fontWeight:800,color:"var(--nice-warning, #fbbf24)"},kpiLabel:{fontSize:11,color:"var(--nice-text-muted, #64748b)",marginTop:2,textTransform:"uppercase",letterSpacing:.8},kpiUnit:{fontSize:13,fontWeight:400,color:"var(--nice-text-muted, #94a3b8)",marginLeft:2},chartWrap:{background:"var(--nice-bg-secondary, #1e293b)",borderRadius:10,padding:16,margin:"12px 0",border:"1px solid var(--nice-border, #334155)"},chartTitle:{fontSize:13,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)",marginBottom:8,textAlign:"center"},badge:e=>({display:"inline-block",padding:"2px 10px",borderRadius:20,background:e,color:"#fff",fontSize:12,fontWeight:700}),btnPrimary:{background:"var(--nice-info, #3b82f6)",color:"#fff",border:"none",borderRadius:8,padding:"10px 22px",fontSize:14,fontWeight:700,cursor:"pointer"},btnSecondary:{background:"var(--nice-border, #334155)",color:"var(--nice-text, #e2e8f0)",border:"none",borderRadius:8,padding:"10px 22px",fontSize:14,fontWeight:600,cursor:"pointer"},row:{display:"flex",gap:16,flexWrap:"wrap"},half:{flex:"1 1 45%",minWidth:280},footer:{textAlign:"center",marginTop:24,paddingTop:16,borderTop:"1px solid var(--nice-bg-secondary, #1e293b)",color:"var(--nice-text-muted, #475569)",fontSize:11}};function mt(e){return e>=90?"#22c55e":e>=70?"#84cc16":e>=50?"#eab308":e>=30?"#f97316":"#ef4444"}function Hs(e){switch(e){case"Perfect":return"#22c55e";case"Great":return"#84cc16";case"Good":return"#eab308";case"OK":return"#f97316";default:return"#ef4444"}}function Xh(e){return e.includes("−15 to 0")||e.includes("0 to +15")?"var(--nice-success, #22c55e)":e.includes("25")?"var(--nice-warning, #eab308)":"var(--nice-danger, #ef4444)"}const Ut=e=>Math.round(e*10)/10;function Ks(e,t,n){return e.map((a,s)=>({name:a,color:n[s],data:t.map((i,o)=>o===s?Ut(i):0)}))}function Ys(e,t){if(e.length<=t)return e;const n=Math.ceil(e.length/t);return e.filter((a,s)=>s%n===0)}function Zs(e){const t=e.length>1?e[e.length-1]-e[0]:0,n=[1,2,5,10,15,30,60,120,300].find(s=>t/s<=10)??600;let a=Math.ceil((e[0]??0)/n)*n;return e.map(s=>{if(s+1e-9<a)return"";for(;a<=s+1e-9;)a+=n;return`${Math.round(s)}s`})}const Xs=240,Qh=({reports:e,noteCount:t,uploadedSong:n=null,playerScores:a,livePitch:s,liveVerseRatings:i,liveCombo:o,difficulty:l="normal",micSettings:c,onClose:u,t:h,className:p,style:g,id:y,accessMode:m,"data-testid":x})=>{const{t:b}=xe(),f=h??b,k=d.useRef(null),v=d.useMemo(()=>{if(e||!n)return[];const S=Hn(n.notes.map(H=>H.noteLine),n.bpm??void 0),B=(n.gap??0)/1e3;return Ka(S,B)},[e,n]),w=d.useMemo(()=>e||(!n||!a||!o?[]:a.map(S=>{const B=(s==null?void 0:s[S.id])||[];return ol({playerName:S.name,playerColor:S.color,songTitle:n.title,songArtist:n.artist,songBpm:n.bpm??0,difficulty:l,pitchPoints:B,notes:v,verseRatings:i??[],combo:o,classicScore:S.classicScore,bonusScore:S.bonusScore,totalScore:S.totalScore,micSettings:(c==null?void 0:c[S.id])??null})})),[e,n,a,s,i,o,l,v,c]),R=d.useCallback(()=>{var Z,E;if(!k.current)return;const S=`<!DOCTYPE html>
46
+ -`]})]}),c&&c.length>0&&r.jsxs("div",{style:{marginTop:24},children:[r.jsx("b",{children:i("audioPitch.waveformRms","Waveform and RMS:")}),r.jsx("canvas",{width:600,height:100,style:{background:"var(--nice-bg-secondary, #222)",borderRadius:4,width:"100%",maxWidth:600,display:"block"},role:"img","aria-label":i("audioPitch.waveformAndRmsVisualizationCanvas","Waveform and RMS visualization canvas"),ref:G=>{if(!G)return;const Z=G.getContext("2d");if(Z){Z.clearRect(0,0,600,100),Z.strokeStyle=ve.resolveCssColor("var(--nice-info, #0ff)",Z.canvas),Z.beginPath();for(let w=0;w<c.length;w+=Math.ceil(c.length/600)){const R=w/c.length*600,S=50-c[w]*48;w===0?Z.moveTo(R,S):Z.lineTo(R,S)}if(Z.stroke(),b.length>0){Z.strokeStyle=ve.resolveCssColor("var(--nice-warning, #ff0)",Z.canvas),Z.beginPath();for(let w=0;w<b.length;w++){const R=w/b.length*600,S=100-b[w]*90;w===0?Z.moveTo(R,S):Z.lineTo(R,S)}Z.stroke()}}}}),r.jsxs("div",{style:{color:"var(--nice-text-muted, #aaa)",fontSize:12,marginTop:4},children:[r.jsx("span",{style:{color:"var(--nice-info, #0ff)"},children:i("audioPitch.waveform","Waveform")})," "," |  ",r.jsx("span",{style:{color:"var(--nice-warning, #ff0)"},children:"RMS"})]})]}),!C&&j.length===0&&!M&&r.jsx("div",{style:{marginTop:16,color:"var(--nice-text-muted, #aaa)"},children:r.jsx("i",{children:i("audioPitch.noNotesDetected","No notes detected")})}),h&&Object.keys(g).length>0&&r.jsxs("div",{style:{marginTop:16},children:[r.jsx("h4",{children:i("audioPitch.algorithmComparison","Algorithm comparison")}),Object.entries(g).map(([G,Z])=>r.jsxs("div",{style:{marginBottom:12},children:[r.jsx("b",{children:G}),": ",i("audioPitch.detectedSegments","detected segments:")," ",Z.length,r.jsx("pre",{style:{background:"var(--nice-text, #111)",color:"var(--nice-text-inverse, #ddd)",padding:8,borderRadius:4,marginTop:8},children:Z.map(w=>`: ${Math.round(w.start*10)} ${Math.round(w.duration*10)} ${w.pitch} [${w.freq.toFixed(1)} Hz]`).join(`
47
+ `)})]},G))]})]})}const Dt=1e4,Bs=5e3;function Xr(e,t=.35){const n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!n)return e;const a=Math.min(255,Math.round(parseInt(n[1],16)+(255-parseInt(n[1],16))*t)),s=Math.min(255,Math.round(parseInt(n[2],16)+(255-parseInt(n[2],16))*t)),i=Math.min(255,Math.round(parseInt(n[3],16)+(255-parseInt(n[3],16))*t));return`rgb(${a},${s},${i})`}const fh=["var(--nice-warning, #facc15)","var(--nice-text-secondary, #cbd5e1)","var(--nice-warning, #d97706)"],mh=({entry:e,rank:t,animDelay:n})=>{const[a,s]=d.useState(0),[i,o]=d.useState(0),[l,c]=d.useState(0),[u,h]=d.useState(0),p=Math.min(e.classicScore,Dt),g=Math.min(e.bonusScore,Dt),y=p/Dt*Bs,m=g>0?g/Dt*Bs:0;return d.useEffect(()=>{let x,b=null;const f=Math.max(y,400),j=Math.max(m,m>0?300:0),v=C=>{b===null&&(b=C);const N=C-b-n;if(N<0){x=requestAnimationFrame(v);return}if(N<=f){const M=Math.min(1,N/f),k=1-Math.pow(1-M,3);s(Math.min(k*(p/Dt)*100,100)),c(Math.round(k*e.classicScore)),x=requestAnimationFrame(v);return}if(s(Math.min(p/Dt*100,100)),c(e.classicScore),j>0){const M=N-f;if(M<=j){const k=Math.min(1,M/j),T=1-Math.pow(1-k,3);o(Math.min(T*(g/Dt)*100,100)),h(Math.round(T*e.bonusScore)),x=requestAnimationFrame(v);return}o(Math.min(g/Dt*100,100)),h(e.bonusScore)}};return x=requestAnimationFrame(v),()=>cancelAnimationFrame(x)},[e.classicScore,e.bonusScore,p,g,y,m,n]),r.jsxs("div",{className:"nice-karaoke-summary__bar",children:[r.jsx("span",{className:"nice-karaoke-summary__bar-rank",children:t<=3?r.jsx(B.NtdMedal,{size:18,primaryColor:fh[t-1]}):`#${t}`}),r.jsx("span",{className:"nice-karaoke-summary__bar-name",style:{color:e.color},children:e.name}),r.jsxs("div",{className:"nice-karaoke-summary__bar-track",children:[e.bonusScore>0&&r.jsx("div",{className:"nice-karaoke-summary__bar-fill-bonus",style:{width:`${Math.min(a+i,100)}%`,background:Xr(e.color,.45)}}),r.jsx("div",{className:"nice-karaoke-summary__bar-fill-classic",style:{width:`${a}%`,background:`linear-gradient(90deg, ${e.color}, ${Xr(e.color,.15)})`,boxShadow:`0 0 8px ${e.color}55`}}),r.jsxs("div",{className:"nice-karaoke-summary__bar-text",children:[l.toLocaleString(),u>0&&r.jsxs("span",{className:"nice-karaoke-summary__bar-text-bonus",style:{color:Xr(e.color,.5)},children:["+",u.toLocaleString()]})]})]}),r.jsx("span",{className:"nice-karaoke-summary__bar-total",children:(l+u).toLocaleString()})]})},Gs=({title:e,entries:t,highlightNames:n,playerColorMap:a})=>r.jsxs("div",{className:"nice-karaoke-summary__rank",children:[r.jsx("h4",{className:"nice-karaoke-summary__rank-title",children:e}),r.jsx("table",{className:"nice-karaoke-summary__rank-table",children:r.jsx("tbody",{children:t.map((s,i)=>{const o=n.has(s.name),l=a.get(s.name);return r.jsxs("tr",{className:`nice-karaoke-summary__rank-row ${o?"nice-karaoke-summary__rank-row--hl":""}`,children:[r.jsx("td",{className:`nice-karaoke-summary__rank-pos ${i<3?"nice-karaoke-summary__rank-pos--top":""}`,children:s.rank}),r.jsxs("td",{className:"nice-karaoke-summary__rank-name",style:l?{color:l}:void 0,children:[o&&r.jsxs(r.Fragment,{children:[r.jsx(B.NtdCircle,{size:8})," "]}),s.name]}),r.jsx("td",{className:"nice-karaoke-summary__rank-score",children:s.score.toLocaleString()})]},`${s.name}-${i}`)})})})]}),$o=({uploadedSong:e,playerScores:t,topSingings:n,onRestart:a,onContinue:s,t:i,renderReport:o,className:l,style:c,id:u,accessMode:h,"data-testid":p})=>{const[g,y]=d.useState(!1),m=d.useMemo(()=>[...t].sort((C,N)=>N.totalScore-C.totalScore),[t]),x=d.useMemo(()=>{const C=new Map;for(const N of t)C.set(N.name,N.color);return C},[t]),b=d.useMemo(()=>new Set(t.map(C=>C.name)),[t]),f=d.useMemo(()=>m.map((C,N)=>({rank:N+1,name:C.name,score:C.totalScore,color:C.color})),[m]),j=d.useMemo(()=>{const C=n.map(M=>({name:M.playerName,score:M.score})),N=new Set;for(const M of m)N.has(M.id)||(N.add(M.id),C.push({name:M.name,score:M.totalScore}));return C.sort((M,k)=>k.score-M.score),C.slice(0,10).map((M,k)=>({rank:k+1,name:M.name,score:M.score}))},[n,m]),v=e?e.artist?`${e.artist} — ${e.title}`:e.title:i("karaokeSummary.unknownSong","Unknown song");return h==="hidden"?null:r.jsxs("div",{className:`nice-karaoke-summary ${l??""}`,style:c,id:u,"data-testid":p,children:[r.jsxs("div",{className:"nice-karaoke-summary__card",children:[r.jsx("h1",{className:"nice-karaoke-summary__title",children:v}),r.jsx("div",{className:"nice-karaoke-summary__bars",children:m.length===0?r.jsx("div",{className:"nice-karaoke-summary__empty",children:i("karaokeSummary.noScores","No scores")}):m.map((C,N)=>r.jsx(mh,{entry:C,rank:N+1,animDelay:N*300},C.id))}),(m.length>1||n.length>0)&&r.jsxs("div",{className:"nice-karaoke-summary__ranks",children:[m.length>1&&r.jsx(Gs,{title:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[r.jsx(B.NtdHome,{size:14})," ",i("karaokeSummary.localRanking","Session ranking")]}),entries:f,highlightNames:b,playerColorMap:x}),n.length>0&&r.jsx(Gs,{title:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[r.jsx(B.NtdTrophy,{size:14})," ",i("karaokeSummary.globalRanking","Top 10")]}),entries:j,highlightNames:b,playerColorMap:x})]}),r.jsxs("div",{className:"nice-karaoke-summary__actions",children:[o&&r.jsxs("button",{type:"button",className:"nice-karaoke-summary__btn nice-karaoke-summary__btn--report",onClick:()=>y(!0),children:[r.jsx(B.NtdBarChart,{size:15})," ",i("karaokeSummary.report","Report")]}),r.jsx("button",{type:"button",className:"nice-karaoke-summary__btn nice-karaoke-summary__btn--restart",onClick:a,children:i("karaokeSummary.restart","Restart")}),r.jsx("button",{type:"button",className:"nice-karaoke-summary__btn nice-karaoke-summary__btn--continue",onClick:s,children:i("karaokeSummary.continue","Continue")})]})]}),g&&(o==null?void 0:o(()=>y(!1)))]})},gh=st.scoped("GenericPlayer"),yh=e=>/youtu(\.be|be\.com)/i.test(e),Ao=e=>!!e&&/\.m3u8(\?.*)?$/i.test(e),vh=e=>!!e&&/\.(mp3|aac|m4a|flac|wav|ogg)(\?.*)?$/i.test(e),bh=e=>{var i;if(!((i=e==null?void 0:e.sources)!=null&&i.length))return null;const t=o=>e.sources.find(l=>l.kind===o),n=e.sources.find(o=>o.kind==="youtube"&&(o.videoId||o.url&&yh(o.url)))??null;if(n)return n;const a=t("hls")||e.sources.find(o=>o.url&&Ao(o.url))||null;if(a)return a;const s=t("audio")||e.sources.find(o=>o.url&&vh(o.url))||null;return s||(e.sources[0]??null)},Ar=e=>{(!isFinite(e)||e<0)&&(e=0);const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`},xh=[.25,.5,.75,1,1.25,1.5,1.75,2],Io=({tracks:e=[],initialIndex:t=0,autoPlay:n=!0,countdownSeconds:a=0,height:s=360,onIndexChange:i,onPlayingChange:o,onTimeUpdate:l,externalRef:c,uiMode:u="full",compactNextCount:h=3,progressBarPosition:p="inline",loop:g=!1,onEnded:y,enableKeyboardShortcuts:m=!0,shuffle:x=!1,repeatMode:b="none",playbackSpeed:f=1,abLoop:j=null,onRepeatModeChange:v,onShuffleChange:C,onSpeedChange:N,sleepTimer:M=0,onSleepTimerExpired:k})=>{const{t:T}=xe(),{t:E}=xe(),[A,I]=d.useState(Math.min(Math.max(0,t),Math.max(0,e.length-1))),L=e[A],P=d.useMemo(()=>bh(L),[L]),_=(L==null?void 0:L.startOffset)??0,[ee,K]=d.useState(!1),[z,V]=d.useState(0),[W,H]=d.useState(0),[G,Z]=d.useState(.9),[w,R]=d.useState(null),[S,F]=d.useState(null),Y=d.useRef(null),[O,U]=d.useState(x),[$,q]=d.useState(b),[X,re]=d.useState(f),[oe,se]=d.useState(j),[D,J]=d.useState([]),[ae,ce]=d.useState(M>0?M*60:null),le=d.useRef(null),[ne,pe]=d.useState(()=>Ei()),fe=d.useRef(null),ge=d.useRef(null),he=d.useRef(null),we=d.useRef(null);d.useEffect(()=>{if(O&&e.length>0){const de=Array.from({length:e.length},(me,Re)=>Re);for(let me=de.length-1;me>0;me--){const Re=Math.floor(Math.random()*(me+1));[de[me],de[Re]]=[de[Re],de[me]]}J(de)}},[O,e.length]);const je=d.useRef(k);je.current=k,d.useEffect(()=>(le.current&&(window.clearInterval(le.current),le.current=null),M>0&&ee&&(ce(M*60),le.current=window.setInterval(()=>{ce(de=>{var me;return!de||de<=1?(le.current&&window.clearInterval(le.current),le.current=null,(me=je.current)==null||me.call(je),null):de-1})},1e3)),()=>{le.current&&window.clearInterval(le.current)}),[M,ee]);const Pe=d.useCallback(de=>{const me=Math.min(Math.max(0,de),Math.max(0,e.length-1));I(me),i==null||i(me)},[e.length,i]),$e=d.useCallback(()=>{if(O&&D.length>0){const me=D.indexOf(A)+1;return me<D.length?D[me]:$==="all"?D[0]:-1}return A<e.length-1?A+1:$==="all"?0:-1},[A,e.length,O,D,$]),Ye=d.useCallback(()=>{if(O&&D.length>0){const de=D.indexOf(A);return de>0?D[de-1]:$==="all"?D[D.length-1]:-1}return A>0?A-1:$==="all"?e.length-1:-1},[A,e.length,O,D,$]),ue=d.useCallback(()=>{const de=$e();de>=0&&Pe(de)},[$e,Pe]),Se=d.useCallback(async()=>{var de,me;await Yt(),pe(!0),(P==null?void 0:P.kind)==="youtube"?(de=fe.current)==null||de.playVideo():(me=ge.current)==null||me.play(),K(!0),o==null||o(!0)},[P,o]),Oe=d.useCallback(()=>{var de,me;(P==null?void 0:P.kind)==="youtube"?(de=fe.current)==null||de.pauseVideo():(me=ge.current)==null||me.pause(),K(!1),o==null||o(!1)},[P,o]),Me=d.useCallback(()=>ee?Oe():Se(),[ee,Se,Oe]),Ie=d.useCallback(de=>{var Ne;const me=de+_;(P==null?void 0:P.kind)==="youtube"?(Ne=fe.current)==null||Ne.seekTo(me,!0):ge.current&&(ge.current.currentTime=me);const Re=Math.max(0,de);H(Re),l==null||l(Re)},[P==null?void 0:P.kind,l,_]),Qe=d.useCallback(()=>{if(W>3){Ie(0);return}const de=Ye();de>=0&&Pe(de)},[Ye,Pe,W,Ie]),Be=d.useCallback(de=>{var me,Re;Z(de),R(null),(P==null?void 0:P.kind)==="youtube"?(Re=(me=fe.current)==null?void 0:me.setVolume)==null||Re.call(me,Math.round(de*100)):ge.current&&(ge.current.volume=de)},[P]),He=d.useCallback(()=>{w!==null?Be(w):(R(G),Be(0))},[G,w,Be]),Lt=d.useCallback(de=>{var me,Re;re(de),ge.current&&(ge.current.playbackRate=de),(P==null?void 0:P.kind)==="youtube"&&((Re=(me=fe.current)==null?void 0:me.setPlaybackRate)==null||Re.call(me,de)),N==null||N(de)},[P,N]),ct=d.useCallback(()=>{const de=["none","all","one"],me=de[(de.indexOf($)+1)%de.length];q(me),v==null||v(me)},[$,v]),ht=d.useCallback(()=>{const de=!O;U(de),C==null||C(de)},[O,C]),it=d.useCallback(de=>{se(de)},[]);d.useImperativeHandle(c,()=>({play:Se,pause:Oe,toggle:Me,seekTo:Ie,setVolume:Be,setSpeed:Lt,setRepeatMode:de=>{q(de),v==null||v(de)},toggleShuffle:ht,setABLoop:it,getUnderlyingPlayer:()=>(P==null?void 0:P.kind)==="youtube"?fe.current:(P==null?void 0:P.kind)==="hls"||(P==null?void 0:P.kind)==="audio"?ge.current:null}),[Se,Oe,Me,Ie,Be,Lt,v,ht,it,P==null?void 0:P.kind]),d.useEffect(()=>{const de=window.setInterval(()=>{let me=0,Re=0;(P==null?void 0:P.kind)==="youtube"&&fe.current?(me=fe.current.getCurrentTime()||0,Re=fe.current.getDuration()||0):ge.current&&(me=ge.current.currentTime||0,Re=ge.current.duration||0);const Ne=Math.max(0,me-_);H(Ne),V(Re),l==null||l(Ne),oe&&Ne>=oe.b&&Ie(oe.a)},250);return()=>window.clearInterval(de)},[P==null?void 0:P.kind,l,oe,_,Ie]),d.useEffect(()=>()=>{Y.current&&(window.clearInterval(Y.current),Y.current=null)},[]);const wt=P==null?void 0:P.url,Je=P==null?void 0:P.kind,Pt=P==null?void 0:P.withCredentials,Xt=JSON.stringify((P==null?void 0:P.headers)??null),ke=d.useRef(G);ke.current=G;const Ce=d.useRef(a);Ce.current=a;const We=d.useRef(o);We.current=o,d.useEffect(()=>{if(he.current){try{he.current.destroy()}catch{}he.current=null}if(ge.current&&(ge.current.volume=ke.current,ge.current.crossOrigin=Pt?"use-credentials":"anonymous"),Je==="hls"&&Ao(wt)){const de=ge.current;if(!de)return;const me=()=>{de.src=wt,de.load();try{_&&!isNaN(_)&&(de.currentTime=_)}catch{}n&&de.play().catch(()=>{})};de.canPlayType("application/vnd.apple.mpegurl")?me():(async()=>{var Re;try{const _e=(await import("hls.js")).default;if((Re=_e==null?void 0:_e.isSupported)!=null&&Re.call(_e)){const be=JSON.parse(Xt),Te=new _e({xhrSetup:Le=>{if(Pt&&(Le.withCredentials=!0),be)for(const[Ge,ze]of Object.entries(be))try{Le.setRequestHeader(Ge,ze)}catch{}}});he.current=Te,Te.loadSource(wt),Te.attachMedia(de),Te.on(_e.Events.MANIFEST_PARSED,()=>{n&&de.play().catch(()=>{})})}else me()}catch(Ne){gh.debug("HLS.js setup failed, falling back to native playback",Ne),me()}})()}else if(Je==="audio"&&wt&&ge.current){const de=ge.current;de.src=wt,de.load();try{_&&!isNaN(_)&&(de.currentTime=_)}catch{}n&&de.play().catch(()=>{})}Y.current&&(window.clearInterval(Y.current),Y.current=null),F(null),H(0),V(0),n&&Je==="youtube"&&Ce.current>0?(F(Ce.current),Y.current=window.setInterval(()=>{F(de=>{var me,Re;if(!de)return null;if(de<=1){Y.current&&(window.clearInterval(Y.current),Y.current=null);try{(me=fe.current)==null||me.playVideo()}catch{}return K(!0),(Re=We.current)==null||Re.call(We,!0),null}return de-1})},1e3)):K(!!n)},[wt,Je,Pt,Xt,_,n]);const De=d.useCallback(()=>{if($==="one"){Ie(0),Se();return}const de=$e();de>=0?Pe(de):(K(!1),o==null||o(!1),Ie(0),y==null||y())},[$,$e,Pe,o,Ie,y,Se]);d.useEffect(()=>{if(!m)return;const de=me=>{var _e;const Re=me.target instanceof HTMLElement?me.target:document.body;if(Re.tagName==="INPUT"||Re.tagName==="TEXTAREA"||Re.isContentEditable||Re!==document.body&&!((_e=we.current)!=null&&_e.contains(Re))||me.key===" "&&Re.closest('button, a[href], [role="button"], [role="slider"], [role="menuitem"]')||me.key.startsWith("Arrow")&&Re.closest('[role="slider"], [role="listbox"], [role="menu"]'))return;const Ne=me.niceSource;if(!(me.key.startsWith("Arrow")&&Ne&&Ne!=="keyboard"&&Re!==document.body&&Re!==we.current))switch(me.key){case" ":me.preventDefault(),Me();break;case"ArrowRight":me.preventDefault(),Ie(Math.min(W+5,z));break;case"ArrowLeft":me.preventDefault(),Ie(Math.max(0,W-5));break;case"ArrowUp":me.preventDefault(),Be(Math.min(1,G+.05));break;case"ArrowDown":me.preventDefault(),Be(Math.max(0,G-.05));break;case"m":case"M":He();break;case"n":case"N":ue();break;case"p":case"P":Qe();break;case"r":case"R":ct();break;case"s":case"S":ht();break}};return document.addEventListener("keydown",de),()=>document.removeEventListener("keydown",de)},[m,Me,Ie,W,z,Be,G,He,ue,Qe,ct,ht]);const Ae=(P==null?void 0:P.kind)==="youtube"||u==="full"||u==="nobuttons",Ee=h>0?e.slice(A+1,A+1+h):[];return r.jsxs("div",{ref:we,className:"gp-player",style:{display:"grid",gap:12},tabIndex:-1,children:[n&&!ne&&r.jsx("div",{role:"button",tabIndex:0,onKeyDown:ve.clickOnActivationKey,className:"gp-audio-activation",onClick:()=>{pe(!0),Se()},style:{position:"fixed",inset:0,zIndex:200,display:"flex",alignItems:"center",justifyContent:"center",background:"var(--nice-overlay-60, rgba(0, 0, 0, 0.6))",cursor:"pointer"},children:r.jsx("span",{style:{color:"#fff",fontSize:24},children:T("player.clickToActivateAudio","Click to activate audio")})}),Ae&&r.jsxs("div",{className:"gp-stage",style:{width:"100%",height:s,background:(P==null?void 0:P.kind)==="youtube"?"transparent":"var(--player-bg, #0f172a)",borderRadius:8,overflow:"hidden",position:"relative",display:"grid",placeItems:"center"},children:[(P==null?void 0:P.kind)==="youtube"&&r.jsx(Pa,{videoId:P.videoId??Mh(P.url),onReady:de=>{fe.current=de.target,Be(G);const me=(L==null?void 0:L.startOffset)??0;try{me&&de.target.seekTo(me,!0)}catch{}if(u==="nobuttons"){try{de.target.playVideo()}catch{}K(!0)}},onEnd:De,opts:{width:"100%",height:"100%",playerVars:{autoplay:n||u==="nobuttons"?1:0,controls:0,modestbranding:1,rel:0,showinfo:0,fs:0,disablekb:1,iv_load_policy:3,loop:g?1:0}},style:{width:"100%",height:"100%"}}),S!==null&&r.jsx("div",{style:{position:"absolute",inset:0,zIndex:120,display:"flex",alignItems:"center",justifyContent:"center",background:"var(--nice-overlay-70, rgba(0, 0, 0, 0.7))"},children:r.jsx("span",{style:{color:"#fff",fontSize:72,fontWeight:"bold"},children:S})}),u==="nobuttons"&&r.jsx("div",{style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"auto",zIndex:100,cursor:"default"}}),((P==null?void 0:P.kind)==="audio"||(P==null?void 0:P.kind)==="hls")&&r.jsxs(r.Fragment,{children:[u==="full"&&r.jsx("div",{style:{textAlign:"center",color:"var(--nice-overlay-light-90, rgba(255, 255, 255, 0.9))"},children:L!=null&&L.coverUrl?r.jsx("img",{alt:"cover",src:L.coverUrl,style:{height:s-24,objectFit:"contain"}}):r.jsxs("div",{style:{opacity:.8},children:[r.jsxs("div",{style:{fontSize:18,fontWeight:600},children:[L==null?void 0:L.artist," — ",L==null?void 0:L.title]}),r.jsx("div",{style:{marginTop:8,fontSize:12,color:"var(--nice-text-secondary, #64748b)"},children:(P==null?void 0:P.label)??`${(P==null?void 0:P.codec)??""} ${(P==null?void 0:P.quality)??""}`.trim()})]})}),r.jsx("audio",{ref:ge,onEnded:De,onLoadedMetadata:()=>{const de=ge.current;de&&V(de.duration||0)},crossOrigin:P!=null&&P.withCredentials?"use-credentials":"anonymous",style:{display:"none"}})]})]}),(u==="minimal"||u==="compact")&&r.jsx("div",{style:{display:"flex",alignItems:"baseline",gap:8,justifyContent:"space-between"},children:r.jsxs("div",{children:[r.jsx("div",{style:{fontWeight:600},children:(L==null?void 0:L.title)??""}),r.jsx("div",{style:{color:"var(--nice-text-secondary, #64748b)",fontSize:13},children:(L==null?void 0:L.artist)??""})]})}),u==="full"&&r.jsxs(r.Fragment,{children:[r.jsx(Lo,{currentTime:W,duration:z}),r.jsx(Sh,{isPlaying:ee,index:A,count:e.length,currentTime:W,duration:z,volume:G,onPrev:Qe,onNext:ue,onToggle:Me,onSeek:Ie,onVolume:Be}),r.jsx(jh,{shuffleOn:O,repeatMode:$,speed:X,abLoop:oe,currentTime:W,sleepRemaining:ae,onToggleShuffle:ht,onCycleRepeat:ct,onSpeedChange:Lt,onSetABLoop:it,onMuteToggle:He,isMuted:w!==null})]}),u==="progressOnly"&&r.jsx("div",{style:p==="fixedBottom"?{position:"fixed",left:0,right:0,bottom:0,padding:"8px 12px",background:"var(--nice-overlay-90, rgba(15, 23, 42, 0.9))",backdropFilter:"blur(2px)",zIndex:1e3}:{},children:r.jsx(kh,{currentTime:W,duration:z,onSeek:Ie})}),(u==="minimal"||u==="compact")&&r.jsx(wh,{isPlaying:ee,canPrev:A>0,canNext:A<e.length-1,onPrev:Qe,onNext:ue,onToggle:Me}),u==="compact"&&Ee.length>0&&r.jsx(Ch,{items:Ee,onSelect:de=>Pe(A+1+de)}),u==="nobuttons"&&r.jsx(r.Fragment,{}),u==="full"&&e.length>0&&r.jsx("div",{className:"gp-list",style:{display:"grid",gap:4},children:e.map((de,me)=>r.jsxs("button",{onClick:()=>Pe(me),style:{textAlign:"left",border:"1px solid var(--nice-border-color)",borderRadius:8,padding:"8px 10px",background:me===A?"color-mix(in srgb, var(--nice-color-primary) 14%, transparent)":"var(--nice-bg-secondary)",color:"var(--nice-text-primary)",cursor:"pointer"},title:de.sources.map(Re=>Re.kind).join(", "),children:[r.jsx("div",{style:{fontWeight:600},children:de.title}),r.jsx("div",{style:{color:"var(--nice-text-secondary)",fontSize:12},children:de.artist})]},de.id))})]})},yt={border:"1px solid var(--nice-border-color)",borderRadius:8,padding:"6px 10px",background:"var(--nice-bg-secondary)",color:"var(--nice-text-primary)",cursor:"pointer"},Lo=({currentTime:e,duration:t})=>r.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:8,justifyContent:"space-between"},children:[r.jsx("div",{}),r.jsxs("div",{style:{fontSize:12,color:"var(--nice-text-secondary, #64748b)"},children:[Ar(e)," / ",Ar(t)]})]}),Sh=({isPlaying:e,index:t,count:n,currentTime:a,duration:s,volume:i,onPrev:o,onNext:l,onToggle:c,onSeek:u,onVolume:h})=>{const{t:p}=xe();return r.jsxs("div",{className:"gp-controls",style:{display:"grid",gridTemplateColumns:"auto 1fr auto",gap:12,alignItems:"center"},children:[r.jsxs("div",{style:{display:"flex",gap:8},children:[r.jsx("button",{onClick:o,disabled:t<=0,title:p("player.previousTrack","Previous track"),"aria-label":p("player.previousTrack","Previous track"),style:yt,children:r.jsx(B.NtdSkipBack,{size:16})}),r.jsx("button",{onClick:c,title:e?p("player.pause","Pause"):p("player.play","Play"),"aria-label":e?p("player.pause","Pause"):p("player.play","Play"),style:yt,children:e?r.jsx(B.NtdPause,{size:16}):r.jsx(B.NtdPlay,{size:16})}),r.jsx("button",{onClick:l,disabled:t>=n-1,title:p("player.nextTrack","Next track"),"aria-label":p("player.nextTrack","Next track"),style:yt,children:r.jsx(B.NtdSkipForward,{size:16})})]}),r.jsx("input",{type:"range",min:0,max:Math.max(1,s),step:.1,value:a,onChange:g=>u(parseFloat(g.target.value)),"aria-label":p("player.seekPosition","Seek position")}),r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[r.jsx(B.NtdVolume,{size:16}),r.jsx("input",{type:"range",min:0,max:1,step:.01,value:i,onChange:g=>h(parseFloat(g.target.value)),"aria-label":p("player.volume","Volume")})]})]})},kh=({currentTime:e,duration:t,onSeek:n})=>{const{t:a}=xe();return r.jsxs(r.Fragment,{children:[r.jsx(Lo,{currentTime:e,duration:t}),r.jsx("input",{type:"range",min:0,max:Math.max(1,t),step:.1,value:e,onChange:s=>n(parseFloat(s.target.value)),"aria-label":a("player.seekPosition","Seek position")})]})},wh=({isPlaying:e,canPrev:t,canNext:n,onPrev:a,onNext:s,onToggle:i})=>{const{t:o}=xe();return r.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[r.jsx("button",{onClick:a,disabled:!t,title:o("player.previousTrack","Previous track"),"aria-label":o("player.previousTrack","Previous track"),style:yt,children:r.jsx(B.NtdSkipBack,{size:16})}),r.jsx("button",{onClick:i,title:e?o("player.pause","Pause"):o("player.play","Play"),"aria-label":e?o("player.pause","Pause"):o("player.play","Play"),style:yt,children:e?r.jsx(B.NtdPause,{size:16}):r.jsx(B.NtdPlay,{size:16})}),r.jsx("button",{onClick:s,disabled:!n,title:o("player.nextTrack","Next track"),"aria-label":o("player.nextTrack","Next track"),style:yt,children:r.jsx(B.NtdSkipForward,{size:16})})]})},Ch=({items:e,onSelect:t})=>{const{t:n}=xe();return r.jsxs("div",{style:{border:"1px solid var(--nice-border-color)",borderRadius:8,padding:10,background:"var(--nice-bg-secondary)",color:"var(--nice-text-primary)"},children:[r.jsx("div",{style:{fontWeight:600,marginBottom:6},children:n("player.upNext","Up next")}),r.jsx("ol",{style:{margin:0,paddingLeft:18},children:e.map((a,s)=>r.jsx("li",{style:{marginBottom:4},children:r.jsxs("button",{type:"button",onClick:()=>t(s),style:{border:"none",padding:0,background:"transparent",cursor:"pointer",color:"var(--nice-text-primary, #0f172a)"},title:a.sources.map(i=>i.kind).join(", "),children:[r.jsx("span",{style:{fontWeight:600},children:a.artist})," — ",a.title]})},a.id))})]})},jh=({shuffleOn:e,repeatMode:t,speed:n,abLoop:a,currentTime:s,sleepRemaining:i,onToggleShuffle:o,onCycleRepeat:l,onSpeedChange:c,onSetABLoop:u,onMuteToggle:h,isMuted:p})=>{const{t:g}=xe(),y={none:g("player.off","Off"),all:g("player.all","All"),one:g("player.one","One")},m=t==="one"?r.jsxs("span",{style:{position:"relative",display:"inline-flex"},children:[r.jsx(B.NtdRepeat,{size:16}),r.jsx("span",{style:{position:"absolute",right:-3,bottom:-3,fontSize:8,fontWeight:700},children:"1"})]}):t==="all"?r.jsx(B.NtdRepeat,{size:16}):r.jsx(B.NtdArrowRight,{size:16});return r.jsxs("div",{className:"gp-pro-controls",style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap",fontSize:13},children:[r.jsx("button",{onClick:o,title:g("player.shuffle","Shuffle"),"aria-label":g("player.shuffle","Shuffle"),style:{...yt,opacity:e?1:.4,fontWeight:e?700:400},children:r.jsx(B.NtdShuffle,{size:16})}),r.jsx("button",{onClick:l,title:`${g("player.repeat","Repeat")}: ${y[t]}`,"aria-label":`${g("player.repeat","Repeat")}: ${y[t]}`,style:{...yt,opacity:t==="none"?.4:1},children:m}),r.jsx("select",{value:n,onChange:x=>c(parseFloat(x.target.value)),title:g("player.speed","Speed"),"aria-label":g("player.speed","Speed"),style:{...yt,minWidth:56,fontSize:12},children:xh.map(x=>r.jsxs("option",{value:x,children:[x,"x"]},x))}),r.jsx("button",{onClick:h,title:g("player.mute","Mute"),"aria-label":g("player.mute","Mute"),style:{...yt,opacity:p?1:.6},children:p?r.jsx(B.NtdVolumeMute,{size:16}):r.jsx(B.NtdVolume,{size:16})}),a?r.jsxs("span",{style:{display:"flex",gap:4,alignItems:"center"},children:[r.jsxs("span",{style:{fontSize:11,color:"var(--nice-text-secondary, #64748b)"},children:["A: ",Ar(a.a)," — B: ",Ar(a.b)]}),r.jsx("button",{onClick:()=>u(null),title:g("player.clearLoop","Clear loop"),style:{...yt,fontSize:11,padding:"2px 6px"},children:r.jsx(B.NtdClose,{size:12})})]}):r.jsx("button",{onClick:()=>u({a:s,b:s+10}),title:g("player.abLoop","A-B Loop"),"aria-label":g("player.setAbLoop","Set A-B Loop"),style:{...yt,opacity:.4},children:"A-B"}),i!==null&&i>0&&r.jsxs("span",{style:{marginLeft:"auto",fontSize:11,color:"var(--nice-text-secondary, #64748b)",display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(B.NtdMoon,{size:12})," ",Math.floor(i/60),":",(i%60).toString().padStart(2,"0")]})]})};function Mh(e){if(!e)return;const t=e.match(/youtu\.be\/([A-Za-z0-9_-]{6,})/);if(t)return t[1];const n=e.match(/[?&]v=([A-Za-z0-9_-]{6,})/);if(n)return n[1]}function _o(e){const t={};if(!e)return t;const n=e.split(",");for(const a of n){const s=a.trim();s.startsWith("v=")?t.youtubeId=s.substring(2):s.startsWith("co=")?t.coverImage=s.substring(3):s.startsWith("bg=")&&(t.backgroundImage=s.substring(3))}return t}function Rh(e,t="/api/karaoke/cover"){var a,s;const n=((a=e.coverImage)==null?void 0:a.startsWith("http://"))||((s=e.coverImage)==null?void 0:s.startsWith("https://"));return e.coverImage&&n?e.coverImage:e.youtubeId?`https://img.youtube.com/vi/${e.youtubeId}/hqdefault.jpg`:e.coverImage?`${t}?filePath=${encodeURIComponent(e.coverImage)}`:"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='180'%3E%3Crect width='320' height='180' fill='%23333'/%3E%3Ctext x='160' y='95' text-anchor='middle' fill='%23999' font-size='16'%3ENo Cover%3C/text%3E%3C/svg%3E"}function Nh(e,t="/backgrounds"){return e.backgroundImage?`${t}/${e.backgroundImage}`:""}function Do(e,t,n=.01){let a=0;for(let o=0;o<e.length;o++)a+=e[o]*e[o];if(a=Math.sqrt(a/e.length),a<n)return 0;let s=-1,i=0;for(let o=20;o<e.length/2;o++){let l=0;for(let c=0;c<e.length/2;c++)l+=e[c]*e[c+o];l/=e.length/2,l>i&&(i=l,s=o)}return s>0?t/s:0}function Ka(e,t){const n=[];return e.forEach((a,s)=>{a.forEach((i,o)=>{n.push({startTime:i.startTime+t,duration:i.duration,pitch:i.pitch,isGold:i.isGold,line:s,idx:o})})}),n}function zo(e,t,n){const a=[];return e.forEach(s=>{var c;const[i,o]=s.noteKey.split("-").map(Number),l=(c=t[i])==null?void 0:c[o];l&&s.segments.forEach(u=>{a.push({start:u.visualStart-n,end:u.visualEnd-n,pitch:l.pitch,frac:u.frac,isGold:l.isGold,noteStart:l.startTime,noteEnd:l.startTime+l.duration})})}),a}function Fo(e,t=120){let n=e;if(e.length>t){const a=e.length/t,s=[];for(let i=0;i<t;i++)s.push(e[Math.floor(i*a)]);n=s}return n.map(a=>({t:Math.round(a.t*1e3)/1e3,hz:Math.round(a.hz)}))}function Oo(e,t,n){const s=Date.parse(e)-n;return Math.max(0,Math.round(t-s))}const Bo={crepe:"var(--nice-accent, #a78bfa)",librosa:"var(--nice-success-light, #34d399)",pitchy:"var(--nice-primary-light, #60a5fa)",autocorr:"var(--nice-text-secondary, #555555)"};function Th(e){return e==="autocorr"?"Ultrastar":e.charAt(0).toUpperCase()+e.slice(1)}function Ph(e){return Bo[e]??"var(--nice-text-secondary, #555555)"}function Eh(e){const t=Bo[e]??"var(--nice-text-secondary, #555555)";return`var(--algo-${e}, ${t})`}function Go(e,t){const n=!(t!=null&&t.includes("no-music")),a=t==null?void 0:t.includes("instrumental"),s=[];if(n){if(e.videoPath){let i=e.videoPath;if(i.startsWith("v=")){const o=_o(i);o.youtubeId&&(i=`https://www.youtube.com/watch?v=${o.youtubeId}`)}/youtu(\.be|be\.com)/i.test(i)?s.push({kind:"youtube",url:i}):/^(https?:\/\/|blob:|data:\/\/|\/)/i.test(e.videoPath)&&s.push({kind:"audio",url:e.videoPath})}if(s.length===0){const i=a?e.instrumentalPath:e.audioPath;i&&/^(https?:\/\/|blob:|data:\/\/|\/)/i.test(i)&&s.push({kind:"audio",url:i})}s.length===0&&e.youtubeId&&s.push({kind:"youtube",url:`https://www.youtube.com/watch?v=${e.youtubeId}`})}return{id:String(e.id??e.title??"song"),title:e.title??"—",artist:e.artist??"—",coverUrl:e.coverPath??void 0,sources:s}}function $h(e){const t=e.videoPath??e.video??void 0;return{id:e.id,title:e.title??"",artist:e.artist??"",year:e.year,genre:e.genre,language:e.language,filePath:e.filePath,coverPath:e.coverPath,audioPath:e.audioPath??e.audio??void 0,videoPath:t,format:0,notes:e.notes??[],gap:e.gap,bpm:e.bpm,videoGap:e.videoGap,start:e.start,end:e.end,youtubeId:e.youtubeId,instrumentalPath:e.instrumentalPath,isVerified:e.isVerified,coverImage:e.coverImage,backgroundImage:e.backgroundImage}}var Ya=(e=>(e[e.Ultrastar=0]="Ultrastar",e))(Ya||{});function Wo(e,t="song.txt"){const n=e.split(/\r?\n/),a={},s=[];for(const o of n){const l=o.replace(/\uFEFF/g,"");if(l.trim()){if(l.startsWith("#")){const c=l.indexOf(":");c>0&&(a[l.slice(1,c).trim().toUpperCase()]=l.slice(c+1).trim())}else if(/^[:*\-FG]/.test(l))s.push({noteLine:l});else if(l.trim()==="E")break}}const i=o=>{if(!o)return;const l=parseFloat(o.replace(",","."));return Number.isFinite(l)?l:void 0};return{title:a.TITLE||t.replace(/\.txt$/i,""),artist:a.ARTIST||"",format:Ya.Ultrastar,bpm:i(a.BPM),gap:i(a.GAP),genre:a.GENRE||void 0,language:a.LANGUAGE||void 0,year:a.YEAR||void 0,audioPath:a.MP3||void 0,videoPath:a.VIDEO||a.MP3||void 0,notes:s}}const Ah=e=>window.btoa(unescape(encodeURIComponent(e))),Uo=({onSongUpload:e,parseSong:t,onError:n,accept:a=".txt",maxFileSize:s=5*1024*1024,t:i})=>{const{t:o}=xe(),l=i??o,c=h=>{const p=new FileReader;p.onload=async g=>{var m;if(!((m=g.target)!=null&&m.result))return;const y=g.target.result;try{const x=t?await t({fileName:h.name,data:Ah(y)}):Wo(y,h.name);e(x)}catch(x){n==null||n(x)}},p.readAsText(h,"UTF-8")},u=h=>/\.txt$/i.test(h.name)?h.size===0?l("karaokeUploader.empty","The file is empty."):null:l("karaokeUploader.notTxt","Please choose an UltraStar .txt file.");return r.jsx("div",{className:"nice-karaoke-uploader",children:r.jsx(ie.NiceUpload,{accept:a,maxFileSize:s,validateFile:u,multiple:!1,text:l("karaokeUploader.dropPrompt","Click or drag & drop an UltraStar file (.txt)"),onFilesSelected:h=>{const p=h[0];p&&c(p)}})})},Ih=[],Lh=[],_h=[],Dh=[];function zh(e,t,n,a,s){const o=a*.45;e.beginPath();for(let l=0;l<10;l++){const c=l%2===0?a:o,u=Math.PI/5*l-Math.PI/2,h=t+Math.cos(u)*c,p=n+Math.sin(u)*c;l===0?e.moveTo(h,p):e.lineTo(h,p)}e.closePath(),e.fillStyle=s,e.fill()}const Ut=60,Ws=4,Qr="#888",Us=["A","B","X","Y","LB","RB","LT","RT"],Vo=({lanes:e=Ih,events:t=Lh,currentTime:n,activeLanes:a=_h,difficulty:s,feedbackQueue:i=Dh,isPlaying:o,height:l=300})=>{const{t:c}=xe(),u=e.length,h=d.useRef(null),p=d.useRef([]);return d.useEffect(()=>{p.current=i},[i]),d.useEffect(()=>{var N,M;const g=h.current;if(!g)return;const y=g.getContext("2d");if(!y)return;const m=window.devicePixelRatio||1,x=g.clientWidth,b=g.clientHeight;if(g.width=x*m,g.height=b*m,y.scale(m,m),y.clearRect(0,0,x,b),u===0)return;const f=x/u;for(let k=0;k<u;k++){const T=k*f;y.fillStyle=k%2===0?"rgba(255,255,255,0.03)":"rgba(255,255,255,0.01)",y.fillRect(T,0,f,b),k>0&&(y.strokeStyle="rgba(255,255,255,0.1)",y.lineWidth=1,y.beginPath(),y.moveTo(T,0),y.lineTo(T,b),y.stroke())}const j=b-Ut-10;y.strokeStyle="rgba(255,255,255,0.4)",y.lineWidth=2,y.setLineDash([8,4]),y.beginPath(),y.moveTo(0,j),y.lineTo(x,j),y.stroke(),y.setLineDash([]);const v=e.map(k=>ve.resolveCssColor((k==null?void 0:k.color)??Qr,g)),C=(b-Ut-20)/Ws;for(const k of t){const T=k.note.startTime,E=T+k.note.duration,A=T-n;if(A>Ws||E<n-.5)continue;const I=k.lane,L=I*f+4,P=f-8,_=j-A*C,ee=k.note.duration*C,K=n>=T-.15&&n<=E+.15,z=n>E+.15,V=v[I]??Qr;z?y.fillStyle="rgba(100,100,100,0.3)":K?(y.fillStyle=V,y.shadowColor=V,y.shadowBlur=12):(y.fillStyle=V,y.globalAlpha=.6);const W=Math.max(ee,8),H=6;y.beginPath(),y.moveTo(L+H,_),y.lineTo(L+P-H,_),y.quadraticCurveTo(L+P,_,L+P,_+H),y.lineTo(L+P,_+W-H),y.quadraticCurveTo(L+P,_+W,L+P-H,_+W),y.lineTo(L+H,_+W),y.quadraticCurveTo(L,_+W,L,_+W-H),y.lineTo(L,_+H),y.quadraticCurveTo(L,_,L+H,_),y.fill(),y.globalAlpha=1,y.shadowBlur=0,k.note.isGold&&zh(y,L+P/2,_+W/2,Math.min(7,P/4),"#fbbf24")}for(let k=0;k<u;k++){const T=k*f,E=b-Ut,A=a[k],I=v[k]??Qr;y.fillStyle=A?I:"rgba(30,30,30,0.9)",y.fillRect(T+2,E+2,f-4,Ut-4),y.strokeStyle=A?"#fff":I,y.lineWidth=A?3:1,y.strokeRect(T+2,E+2,f-4,Ut-4),y.fillStyle=A?"#000":"#fff",y.font=`bold ${Math.min(24,f*.3)}px monospace`,y.textAlign="center",y.textBaseline="middle",y.fillText(((N=e[k])==null?void 0:N.label)??"",T+f/2,E+Ut/2);const L=((M=e[k])==null?void 0:M.gamepadButton)??-1;L>=0&&L<Us.length&&(y.fillStyle=A?"rgba(0,0,0,0.6)":"rgba(255,255,255,0.4)",y.font="10px sans-serif",y.fillText(Us[L],T+f/2,E+Ut-8))}for(const k of p.current){const T=n-k.time;if(T<0||T>.8)continue;const E=Math.max(0,1-T/.8),A=k.lane*f;y.save(),y.globalAlpha=E,y.font="bold 20px sans-serif",y.textAlign="center",y.textBaseline="bottom",y.fillStyle=k.type==="perfect"?"#10b981":k.type==="good"?"#f59e0b":"#ef4444";const I=k.type==="perfect"?c("padKaraokeOverlay.perfect","PERFECT"):k.type==="good"?c("padKaraokeOverlay.good","GOOD"):c("padKaraokeOverlay.miss","MISS");y.fillText(I,A+f/2,j-10-T*40),y.restore()}},[n,e,t,a,u,o,c]),!o||u===0?null:r.jsxs("div",{className:"nice-pad-karaoke-overlay",style:{position:"absolute",top:0,left:0,right:0,height:l,zIndex:35,pointerEvents:"none"},children:[r.jsx("canvas",{ref:h,role:"img","aria-label":c("padKaraokeOverlay.padKaraokeNoteHighwayHit","Pad karaoke note highway — hit notes in time with the music"),style:{width:"100%",height:"100%",display:"block"}}),r.jsxs("div",{style:{position:"absolute",top:8,right:12,background:"var(--nice-overlay-60, rgba(0,0,0,0.6))",color:"#fff",padding:"4px 12px",borderRadius:8,fontSize:12,fontWeight:700,textTransform:"uppercase",letterSpacing:1,display:"flex",alignItems:"center",gap:6},children:[r.jsx(B.NtdGamepad,{size:14})," ",c("padKaraokeOverlay.pad","PAD — {difficulty}").replace("{difficulty}",String(s))]})]})},In=["var(--player-color-1, #ef4444)","var(--player-color-2, #f59e0b)","var(--player-color-3, #10b981)","var(--player-color-4, #3b82f6)","var(--player-color-5, #8b5cf6)","var(--player-color-6, #ec4899)"],qo={easy:{keys:["f","j"],buttons:[0,1],labels:["F","J"]},normal:{keys:["d","f","j","k"],buttons:[3,2,0,1],labels:["D","F","J","K"]},hard:{keys:["s","d","f","j","k","l"],buttons:[4,3,2,0,1,5],labels:["S","D","F","J","K","L"]}};function ga(e){return 440*Math.pow(2,(e-69)/12)}function Ho(e,t){const n=qo[t],a=n.keys.length,s=[];for(const u of e)for(const h of u)s.includes(h.pitch)||s.push(h.pitch);if(s.sort((u,h)=>u-h),s.length===0)return n.keys.map((u,h)=>({index:h,key:u,gamepadButton:n.buttons[h],label:n.labels[h],minPitch:-999,maxPitch:999,color:In[h%In.length]}));const i=s[0],l=s[s.length-1]-i+1,c=[];for(let u=0;u<a;u++){const h=i+Math.floor(l*u/a),p=i+Math.floor(l*(u+1)/a)-1;c.push({index:u,key:n.keys[u],gamepadButton:n.buttons[u],label:n.labels[u],minPitch:u===0?-999:h,maxPitch:u===a-1?999:p,color:In[u%In.length]})}return c}function Ko(e,t){for(const s of t)if(e>=s.minPitch&&e<=s.maxPitch)return s.index;let n=0,a=1/0;for(const s of t){const i=(s.minPitch+s.maxPitch)/2,o=Math.abs(e-i);o<a&&(a=o,n=s.index)}return n}function Yo(e,t,n){const a=[];for(let s=0;s<e.length;s++)for(let i=0;i<e[s].length;i++){const o={...e[s][i]};o.startTime+=n,a.push({note:o,lane:Ko(o.pitch,t),lineIndex:s,noteIndex:i})}return a.sort((s,i)=>s.note.startTime-i.note.startTime),a}class Zo{constructor(t){this.lanes=[],this.events=[],this.raf=null,this.keysDown=new Set,this.gamepadButtonsDown=new Set,this.running=!1,this.getCurrentTime=()=>0,this.lastFeedbackTime=0,this.lastActiveNote=null,this.preWindow=.15,this.postWindow=.15,this.loop=()=>{var c,u,h,p,g,y,m,x;if(!this.running)return;const s=this.getCurrentTime();this.pollGamepad();const i=this.getActiveLanes();(u=(c=this.config).onLaneActive)==null||u.call(c,i);const o=this.findActiveNote(s);if(o!==this.lastActiveNote&&(this.lastActiveNote=o,(p=(h=this.config).onCurrentNote)==null||p.call(h,o)),i.some(Boolean)&&o){const b=o.lane,f=i.indexOf(!0);if(i[b]){const j=ga(o.note.pitch);this.config.onPitch(j),s-this.lastFeedbackTime>.3&&(this.lastFeedbackTime=s,(y=(g=this.config).onHitFeedback)==null||y.call(g,{type:"perfect",lane:b,time:s}))}else if(f>=0){const v=Math.abs(f-b)*3,C=ga(o.note.pitch+v);this.config.onPitch(C),s-this.lastFeedbackTime>.3&&(this.lastFeedbackTime=s,(x=(m=this.config).onHitFeedback)==null||x.call(m,{type:"miss",lane:f,time:s}))}}this.raf=requestAnimationFrame(this.loop)},this.config=t;const n=Hn(t.noteLines,t.bpm),a=(t.gap??0)/1e3;switch(this.lanes=Ho(n,t.difficulty),this.events=Yo(n,this.lanes,a),t.difficulty){case"easy":this.preWindow=.25,this.postWindow=.25;break;case"normal":this.preWindow=.15,this.postWindow=.15;break;case"hard":this.preWindow=.08,this.postWindow=.08;break}}getLanes(){return this.lanes}getEvents(){return this.events}start(t){this.running||(this.running=!0,this.getCurrentTime=t,this.handleKeyDown=this.handleKeyDown.bind(this),this.handleKeyUp=this.handleKeyUp.bind(this),window.addEventListener("keydown",this.handleKeyDown),window.addEventListener("keyup",this.handleKeyUp),this.loop())}stop(){this.running=!1,this.raf&&(cancelAnimationFrame(this.raf),this.raf=null),window.removeEventListener("keydown",this.handleKeyDown),window.removeEventListener("keyup",this.handleKeyUp),this.keysDown.clear(),this.gamepadButtonsDown.clear()}handleKeyDown(t){var a;const n=(a=t.target)==null?void 0:a.tagName;n&&["INPUT","TEXTAREA","SELECT"].includes(n)||this.keysDown.add(t.key.toLowerCase())}handleKeyUp(t){this.keysDown.delete(t.key.toLowerCase())}pollGamepad(){var n;const t=ve.getInputEngine().gamepadSnapshot[0];if(t){this.gamepadButtonsDown.clear();for(let a=0;a<t.buttons.length;a++)(n=t.buttons[a])!=null&&n.pressed&&this.gamepadButtonsDown.add(a)}}getActiveLanes(){const t=new Array(this.lanes.length).fill(!1);for(const n of this.lanes)(this.keysDown.has(n.key)||this.gamepadButtonsDown.has(n.gamepadButton))&&(t[n.index]=!0);return t}findActiveNote(t){for(const n of this.events){const a=n.note.startTime-this.preWindow,s=n.note.startTime+n.note.duration+this.postWindow;if(t>=a&&t<=s)return n}return null}}const ft=st.scoped("BaseStreamClient");function Vs(e,t,n){if(t===n)return e.slice();const a=Math.round(e.length*n/t),s=new Float32Array(a),i=e.length/a;for(let o=0;o<a;o++){const l=o*i,c=Math.floor(l),u=Math.min(e.length-1,c+1),h=l-c;s[o]=e[c]*(1-h)+e[u]*h}return s}function Fh(e){const t=new Int16Array(e.length);for(let n=0;n<e.length;n++){const a=Math.max(-1,Math.min(1,e[n]));t[n]=a<0?Math.round(a*32768):Math.round(a*32767)}return t}const Sn=16e3,Oh="/scripts/pitch-worklet.js";class Xo{constructor(t){this.sendQueue=[],this.maxQueue=20,this.reconnectAttempts=0,this.maxReconnectAttempts=3,this.buffer=new Float32Array(0),this.externalStream=!1,this.usingWorklet=!1,this.closed=!1,this.started=!1,this.chunksSent=0,this.chunksDropped=0,this.responsesReceived=0,this.lastStatusLog=0,this.opts=t}onMaxReconnect(){var t,n;try{(n=(t=this.opts).onMaxReconnect)==null||n.call(t)}catch{}this.stopAudioNodes()}get useWorklet(){return!0}get workletPath(){return Oh}ts(){return new Date().toISOString().slice(11,23)}connectWs(){this.ws&&this.ws.readyState!==WebSocket.CLOSING&&this.ws.readyState!==WebSocket.CLOSED||(ft.info(`[${this.ts()}] connecting to ${this.opts.wsUrl}`),this.ws=new WebSocket(this.opts.wsUrl),this.ws.binaryType="arraybuffer",this.ws.onopen=()=>{var t,n,a,s,i,o;try{(n=(t=this.opts).onOpen)==null||n.call(t)}catch{}if(this.reconnectAttempts=0,this.chunksSent=0,this.chunksDropped=0,this.responsesReceived=0,ft.info(`[${this.ts()}] ws OPEN | worklet=${this.usingWorklet}`),this.ws&&this.ws.readyState===WebSocket.OPEN&&this.sendQueue.length){const l=this.sendQueue.length;try{for(const c of this.sendQueue)try{this.ws.send(c),this.chunksSent++,(s=(a=this.opts).onSend)==null||s.call(a,c.byteLength)}catch(u){(o=(i=this.opts).onError)==null||o.call(i,u);break}}finally{this.sendQueue=[]}ft.info(`[${this.ts()}] flushed ${l} queued chunks`)}},this.ws.onclose=t=>{var n,a;try{(a=(n=this.opts).onClose)==null||a.call(n,t)}catch{}if(ft.info(`[${this.ts()}] ws CLOSE code=${t.code} clean=${t.wasClean} | sent=${this.chunksSent} dropped=${this.chunksDropped} responses=${this.responsesReceived}`),this.sendQueue=[],this.ws=void 0,!this.closed&&this.started)if(this.reconnectAttempts++,this.reconnectAttempts<=this.maxReconnectAttempts){const s=Math.min(300*Math.pow(1.5,this.reconnectAttempts-1),5e3);ft.info(`[${this.ts()}] auto-reconnect #${this.reconnectAttempts} in ${s.toFixed(0)}ms`),this.reconnectTimer=setTimeout(()=>{this.closed||this.connectWs()},s)}else ft.warn(`[${this.ts()}] max reconnect attempts reached`),this.onMaxReconnect();else this.stopAudioNodes()},this.ws.onerror=t=>{var n,a;ft.warn(`[${this.ts()}] ws ERROR`,t);try{(a=(n=this.opts).onError)==null||a.call(n,t)}catch{}},this.ws.onmessage=t=>{var n,a;this.responsesReceived++;try{const s=typeof t.data=="string"?t.data:new TextDecoder().decode(t.data);this.handleWsMessage(s)}catch(s){(a=(n=this.opts).onError)==null||a.call(n,s)}})}handleAudioFrame(t){var g,y,m,x,b,f,j,v;const n=new Float32Array(this.buffer.length+t.length);n.set(this.buffer,0),n.set(t,this.buffer.length),this.buffer=n;const a=this.audioCtx.sampleRate,s=Math.round((this.opts.chunkMs??200)*Sn/1e3),i=Math.floor(this.buffer.length*Sn/a),o=Math.floor(i/s);if(o<=0)return;const l=o*s,c=Math.floor(l*a/Sn),u=this.buffer.slice(0,c);this.buffer=this.buffer.slice(c);const h=Vs(u,a,Sn);let p=0;for(;p+s<=h.length;){const C=h.subarray(p,p+s),M=Fh(C).buffer,k=this.ws;if(k&&k.readyState===WebSocket.OPEN)try{k.send(M),this.chunksSent++,(y=(g=this.opts).onSend)==null||y.call(g,M.byteLength)}catch(E){(x=(m=this.opts).onError)==null||x.call(m,E)}else k&&k.readyState===WebSocket.CONNECTING?this.sendQueue.length<this.maxQueue&&(this.sendQueue.push(M),(f=(b=this.opts).onSend)==null||f.call(b,0)):(this.chunksDropped++,(v=(j=this.opts).onSend)==null||v.call(j,0));const T=Date.now();T-this.lastStatusLog>5e3&&(this.lastStatusLog=T,ft.info(`[${this.ts()}] STATUS: sent=${this.chunksSent} dropped=${this.chunksDropped} responses=${this.responsesReceived} ws=${(k==null?void 0:k.readyState)??"none"} worklet=${this.usingWorklet}`)),p+=s}if(p<h.length){const C=h.subarray(p),N=Vs(C,Sn,a),M=new Float32Array(N.length+this.buffer.length);M.set(N,0),M.set(this.buffer,N.length),this.buffer=M}}async setupAudioNodes(t){if(this.useWorklet)try{await this.audioCtx.audioWorklet.addModule(this.workletPath);const a=new AudioWorkletNode(this.audioCtx,"pitch-processor");a.port.onmessage=s=>{this.handleAudioFrame(s.data)},t.connect(a),a.connect(this.audioCtx.destination),this.workletNode=a,this.usingWorklet=!0,ft.info(`[${this.ts()}] using AudioWorklet (pitch-processor)`);return}catch(a){ft.warn(`[${this.ts()}] AudioWorklet unavailable, falling back to ScriptProcessorNode`,a)}const n=4096;this.proc=this.audioCtx.createScriptProcessor(n,1,1),t.connect(this.proc),this.proc.connect(this.audioCtx.destination),this.proc.onaudioprocess=a=>{this.handleAudioFrame(a.inputBuffer.getChannelData(0))},this.usingWorklet=!1,ft.info(`[${this.ts()}] using ScriptProcessorNode fallback`)}stopAudioNodes(){try{this.workletNode&&(this.workletNode.port.close(),this.workletNode.disconnect(),this.workletNode=void 0)}catch{}try{this.proc&&(this.proc.onaudioprocess=null,this.proc.disconnect(),this.proc=void 0)}catch{}}async start(){if(this.closed)throw new Error("client closed");if(this.started)return;this.started=!0,(!this.ws||this.ws.readyState===WebSocket.CLOSED)&&this.connectWs(),this.mediaStream||(this.mediaStream=await navigator.mediaDevices.getUserMedia({audio:!0})),this.audioCtx=new AudioContext;const t=this.audioCtx.createMediaStreamSource(this.mediaStream);await this.setupAudioNodes(t)}async startWithMediaStream(t){if(this.closed)throw new Error("client closed");if(this.started)return;this.started=!0,this.externalStream=!0,(!this.ws||this.ws.readyState===WebSocket.CLOSED)&&this.connectWs(),this.mediaStream=t,this.audioCtx=new AudioContext;const n=this.audioCtx.createMediaStreamSource(this.mediaStream);await this.setupAudioNodes(n)}stop(){var t,n;if(ft.info(`[${this.ts()}] stop() called | closed=${this.closed} started=${this.started} sent=${this.chunksSent} responses=${this.responsesReceived}`),this.closed=!0,this.started=!1,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.stopAudioNodes(),this.audioCtx&&this.audioCtx.state!=="closed"&&this.audioCtx.close().catch(()=>{}),!this.externalStream)try{(t=this.mediaStream)==null||t.getTracks().forEach(a=>a.stop())}catch{}try{(n=this.ws)==null||n.close()}catch{}this.ws=void 0,this.sendQueue=[]}}const Bh=st.scoped("CrepeStreaming");class Gh extends Xo{constructor(t){super({...t,chunkMs:t.chunkMs??200}),this.crepeOpts=t}get tag(){return"CrepeStreamClient"}handleWsMessage(t){var a,s;const n=JSON.parse(t);(s=(a=this.crepeOpts).onMessage)==null||s.call(a,n)}onMaxReconnect(){var t,n;Bh.warn(`[${this.tag}] [${this.ts()}] triggering fallback`),this.stopAudioNodes();try{(n=(t=this.crepeOpts).onFallback)==null||n.call(t)}catch{}}}class Wh extends Xo{constructor(t){super({...t,chunkMs:t.chunkMs??100}),this.librosaOpts=t}get tag(){return"LibrosaStreamClient"}handleWsMessage(t){var a,s;const n=JSON.parse(t);(s=(a=this.librosaOpts).onMessage)==null||s.call(a,n)}get useWorklet(){return!1}}const It={debug:(...e)=>{},warn:(...e)=>{typeof console<"u"&&console.warn("[KaraokePitch]",...e)}};function Uh(e){const t=new Float32Array(e);for(let n=0;n<e;n++)t[n]=.5*(1-Math.cos(2*Math.PI*n/(e-1)));return t}function Vh(e,t){const n=new Float32Array(e.length);for(let a=0;a<e.length;a++)n[a]=e[a]*t[a];return n}function Qo({isPlaying:e,gameMode:t,players:n,playersMicKey:a,micAlgorithms:s={},defaultPitchAlgorithm:i="pitchy",micRmsThresholds:o={},micOffsets:l={},micGains:c={},micPitchThresholds:u={},micSmoothingWindows:h={},micHysteresisFrames:p={},micUseHanning:g={},micMonitorEnabled:y={},micMonitorVolumes:m={},currentTimeRef:x,isPadMode:b,clockOffsetMsRef:f,currentPartyIdRef:j,rtc:v}){const[C,N]=d.useState({}),M=d.useRef({}),k=d.useRef({}),[T,E]=d.useState({}),A=d.useRef({}),I=d.useRef([]),L=d.useRef(null),P=d.useRef(null),[,_]=d.useState({}),[,ee]=d.useState({}),[,K]=d.useState({}),[z,V]=d.useState({}),[W,H]=d.useState(!0),[G,Z]=d.useState(!1),w=d.useRef(n);w.current=n;const R=d.useRef(0),S=d.useRef(performance.now());return d.useEffect(()=>{I.current.forEach($=>$()),I.current=[];const F={current:!1};function Y($,q,X=0){x.current!==R.current&&(R.current=x.current,S.current=performance.now());const re=Math.min(.25,(performance.now()-S.current)/1e3),oe=x.current+re-X/1e3;N(D=>{const J=D[$]||[];return{...D,[$]:[...J,{t:oe,hz:q}]}}),M.current[$]=(M.current[$]||[]).concat({t:oe,hz:q});const se=M.current[$];se.length>500&&(M.current[$]=se.slice(-500))}function O($,q,X,re=.02,oe=0,se=.6,D=0,J=0,ae=0,ce=!1){let le=null,ne=null,pe=null;return(async()=>{try{le=new AudioContext;let he=le.createMediaStreamSource(q);if(D>0){const Se=le.createGain();Se.gain.value=D,he.connect(Se),he=Se}const we=le.createAnalyser();we.fftSize=2048,he.connect(we);const je=new Float32Array(we.fftSize),Pe=ce?Uh(we.fftSize):null,$e=[];let Ye=0;if(X==="pitchy")try{const{PitchDetector:Se}=await import("pitchy");pe=Se.forFloat32Array(we.fftSize)}catch(Se){It.warn("pitchy import failed, falling back to autocorrelation",Se)}const ue=()=>{try{we.getFloatTimeDomainData(je)}catch{}const Se=Pe?Vh(je,Pe):je;let Oe=0;for(let Ie=0;Ie<Se.length;Ie++)Oe+=Se[Ie]*Se[Ie];Oe=Math.sqrt(Oe/Se.length);let Me=0;if(Oe>=re)if(pe)try{const[Ie,Qe]=pe.findPitch(Se,le.sampleRate);Ie>50&&Ie<3e3&&Qe>se&&(Me=Ie)}catch{}else Me=Do(Se,le.sampleRate,re),(Me<50||Me>3e3)&&(Me=0);if(Me>0&&J>1&&($e.push(Me),$e.length>J&&$e.shift(),Me=$e.reduce((Ie,Qe)=>Ie+Qe,0)/$e.length),Me>0)Ye=0,Y($,Me,oe);else if(Ye++,ae>0&&Ye<=ae&&$e.length>0){const Ie=$e[$e.length-1];Ie>0&&Y($,Ie,oe)}ne=requestAnimationFrame(ue),A.current[$]=ne};ue()}catch(ge){It.warn("startLocalPitch error",ge)}})(),()=>{ne&&cancelAnimationFrame(ne),le&&le.close().catch(()=>{})}}function U($,q,X,re=0){X==="crepe"&&P.current?(P.current.stop(),P.current=null):X==="librosa"&&L.current&&(L.current.stop(),L.current=null);const oe=window.location,se=oe.protocol==="https:"?"wss:":"ws:",D=X==="librosa"?`${se}//${oe.host}/api/librosa/ws/pyin`:`${se}//${oe.host}/api/ai/audio/pitch/ws/pitch_server`,J=X==="librosa"?_:ee;J(pe=>({...pe,[$]:"connecting"}));const ae=[],ce=pe=>{if(pe>0){for(ae.push(x.current);ae.length>200;)ae.shift();X==="crepe"&&K(fe=>({...fe,[$]:(fe[$]||0)+1}))}},le=()=>{J(pe=>({...pe,[$]:"closed"})),ae.length=0},ne=pe=>{if(typeof pe.hz=="number"&&pe.hz>0){const fe=pe.hz,he=(ae.length>0?ae.shift():x.current)-re/1e3;N(we=>{const je=we[$]||[];return{...we,[$]:[...je,{t:he,hz:fe}]}})}else ae.length>0&&ae.shift()};if(X==="librosa"){const pe=new Wh({wsUrl:D,onOpen:()=>J(fe=>({...fe,[$]:"connected"})),onClose:le,onError:fe=>{J(ge=>({...ge,[$]:"error"})),It.warn("Librosa WS error",fe)},onMessage:ne,onSend:ce});return L.current=pe,pe.startWithMediaStream(q).catch(fe=>{It.warn("Librosa client start failed",fe),J(ge=>({...ge,[$]:"failed"}))}),()=>{pe.stop(),L.current=null,J(fe=>({...fe,[$]:""}))}}else{const pe=new Gh({wsUrl:D,onOpen:()=>J(fe=>({...fe,[$]:"connected"})),onClose:le,onError:fe=>{J(ge=>({...ge,[$]:"error"})),It.warn("Crepe WS error",fe)},onMessage:ne,onSend:ce,onFallback:()=>{J(ge=>({...ge,[$]:"fallback-pitchy"})),P.current=null;const fe=O($,q,"pitchy",.02,re);I.current.push(fe)}});return P.current=pe,pe.startWithMediaStream(q).catch(fe=>{It.warn("Crepe client start failed",fe),J(ge=>({...ge,[$]:"failed"}))}),()=>{pe.stop(),P.current=null,J(fe=>({...fe,[$]:""}))}}}if(e){if(N({}),t!=="pad"){const $={};w.current.forEach(q=>{if(!q.micId)return;const X=s[q.id]||i,re=q.micId&&o[q.micId]||.02,oe=q.micId&&l[q.micId]||0,se=q.micId&&c[q.micId]||0,D=q.micId&&u[q.micId]||.6,J=q.micId&&h[q.micId]||0,ae=q.micId&&p[q.micId]||0,ce=q.micId&&g[q.micId]||!1,le=q.micId&&y[q.micId]||!1,ne=(q.micId?m[q.micId]:void 0)??100,pe=new La;pe.startRecording({deviceId:q.micId,onLevel:()=>{},gain:se,monitorEnabled:le,monitorVolume:ne}).then(()=>{if(F.current){pe.stopRecording().catch(()=>{});return}$[q.id]=pe;const fe=pe.getStream();if(!fe){It.warn(`No stream from recorder for player ${q.id}`);return}if(X==="librosa"||X==="crepe"){const ge=U(q.id,fe,X,oe);I.current.push(ge)}else{const ge=O(q.id,fe,X,re,oe,D,se,J,ae,ce);I.current.push(ge)}}).catch(fe=>It.warn(`recorder start failed for player ${q.id}`,fe))}),k.current=$}}else{const $=k.current,q=Object.keys($).map(Number);Promise.allSettled(q.map(async X=>{const re=await $[X].stopRecording();return{pid:X,blob:re}})).then(X=>{const re={};for(const oe of X)oe.status==="fulfilled"&&oe.value.blob&&(re[oe.value.pid]=oe.value.blob);Object.keys(re).length>0&&E(oe=>({...oe,...re}))}),k.current={},Object.values(A.current).forEach(X=>X&&cancelAnimationFrame(X)),A.current={}}return()=>{F.current=!0,I.current.forEach($=>$()),I.current=[],Object.values(k.current).forEach($=>$.stopRecording().catch(()=>{})),k.current={},Object.values(A.current).forEach($=>$&&cancelAnimationFrame($)),A.current={}}},[e,t,a,s,i,o,l,c,u,h,p,g,y,m]),d.useEffect(()=>{if(!v)return;const F=300,Y=async()=>{try{const U={...M.current};for(const $ of Object.keys(U)){const q=Number($),X=U[q]||[];if(!X||X.length===0)continue;M.current[q]=[];const re=Fo(X,120),oe={playerId:q,points:re,clientNowUtc:new Date().toISOString(),quantized:!0};j!=null&&j.current&&(oe.EventId=j.current);try{v.isConnected()&&await v.publishTimelineUpdate(oe)}catch(se){It.warn("failed to publish timeline update, will retry",se),M.current[q]=(M.current[q]||[]).concat(X).slice(-1e3)}}}catch{}},O=window.setInterval(Y,F);return()=>{O&&window.clearInterval(O)}},[v,j]),d.useEffect(()=>{if(!v)return;const F=Y=>{try{const O=Y;if(!O||typeof O.playerId>"u"||!Array.isArray(O.points))return;const U=Number(O.playerId),$=O.points.map(q=>({t:q.t,hz:q.hz}));if(!$.length)return;if(O.serverTimeUtc){const q=Oo(O.serverTimeUtc,Date.now(),(f==null?void 0:f.current)||0);V(X=>({...X,[U]:q}))}N(q=>{const X=q[U]||[];return{...q,[U]:[...X,...$]}})}catch{}};return v.onTimelineUpdate(F),()=>v.offTimelineUpdate(F)},[v,f]),{livePitch:C,setLivePitch:N,recordings:T,recordersRef:k,unsentPitchRef:M,pitchCleanupsRef:I,remoteLatencyMs:z,showRemoteTimelines:W,setShowRemoteTimelines:H,compactTimelines:G,setCompactTimelines:Z}}function Jo(e){return e>=.95?"Perfect":e>=.8?"Great":e>=.6?"Good":e>=.4?"OK":e>=.2?"Bad":"Awful"}function el(e){return e>=50?3:e>=30?2.5:e>=20?2:e>=10?1.5:1}function tl(e,t,n){const{semitoneTolerance:a,preWindow:s,postExtra:i}=n,o=n.segMs??.25,l=typeof n.completionBonusFactor=="number"?n.completionBonusFactor:.15,c=typeof n.goldFullBonusFactor=="number"?n.goldFullBonusFactor:.3,u=typeof n.difficultyMult=="number"?n.difficultyMult:1,h=!!n.disableGoldNotes;let p=0,g=0,y=0;const m=[];let x=0,b=0,f=0;const j=new Map;e.forEach((E,A)=>{const I=E.startTime,L=E.startTime+E.duration,P=I-s,_=L+i,ee=t.filter(w=>w.t>=P&&w.t<=_&&w.hz>0);if(!ee||ee.length===0)return;const K=Math.max(1,Math.ceil((E.duration||.25)/o)),z=Math.max(10,Math.round(100*(E.duration||1))),V=Math.max(1,Math.round(z/K));let W=0;const H=[];for(let w=0;w<K;w++){const R=I+w*(E.duration/K),S=I+(w+1)*(E.duration/K),F=Math.min(.06,E.duration/K*.2),Y=R-F,O=S+F,U=t.filter(se=>se.t>=Y&&se.t<=O&&se.hz>0);if(!U||U.length===0)continue;let $=0;U.forEach(se=>{let J=((12*Math.log2(se.hz/440)+69)%12+12)%12;for(;J-E.pitch>6;)J-=12;for(;J-E.pitch<-6;)J+=12;const ae=Math.abs(J-E.pitch);$+=ae});const q=$/U.length;let X=0;if(a<=0)X=q===0?1:0;else{const se=a*2;X=Math.max(0,1-Math.min(q/se,1))}if(X<=0)continue;const re=!h&&E.isGold?2:1,oe=Math.round(V*re*X);oe>0&&(p+=oe,W+=oe,H.push({segIndex:w,frac:X,add:oe,segStart:Y,segEnd:O,visualStart:R,visualEnd:S}))}const G=E.line??0;j.has(G)||j.set(G,{total:0,hit:0,comboBonus:0});const Z=j.get(G);if(Z.total++,W>0){x++,x>b&&(b=x),Z.hit++;const w=el(x),R=w>1?Math.round(W*(w-1)):0;f+=R,Z.comboBonus+=R;const S=Math.max(1,Math.ceil((E.duration||.25)/o)),Y=H.length>=S,O=Y?Math.round(Math.max(10,Math.round(100*(E.duration||1)))*l*(!h&&E.isGold?1.5:1)*u):0,U=Y&&!h&&E.isGold?Math.round(Math.max(10,Math.round(100*(E.duration||1)))*c*u):0;g+=O,y+=U,m.push({noteKey:`${E.line??0}-${E.idx??0}`,segments:H,totalAdded:W,completed:Y,completionBonus:O,goldFullBonus:U})}else x=0});const v=[];for(const[E,A]of j.entries()){const I=A.total>0?A.hit/A.total:0;v.push({verseIndex:E,hitFraction:I,label:Jo(I),comboBonus:A.comboBonus})}const C={maxCombo:b,currentCombo:0,totalComboBonus:f},N=f+g+y,M=m.length,k=m.filter(E=>E.completed).length,T={hits:M,misses:e.length-M,good:M-k,perfect:k,maxCombo:b};return{classicScore:p,bonusScore:N,totalScore:p+N,perNote:m,combo:C,verseRatings:v,noteStats:T}}function nl(e,t){let n=0;for(const a of e){const s=Math.max(10,Math.round(100*(a.duration||1))),i=!t&&a.isGold?2:1;n+=s*i}return n}function rl(e,t){return t<=0?0:Math.min(1e4,Math.round(e/t*1e4))}function al(e,t,n){const a=nl(t,n);if(a<=0)return{...e,classicScore:0,bonusScore:0,totalScore:0};const s=rl(e.classicScore,a),i=Math.round(e.bonusScore/a*1e4);return{...e,classicScore:s,bonusScore:i,totalScore:s+i}}const kn={maxCombo:0,currentCombo:0,totalComboBonus:0},qs={hits:0,misses:0,good:0,perfect:0,maxCombo:0};function sl({livePitch:e,uploadedSong:t,isPlaying:n,difficulty:a,players:s,isPadMode:i}){const[o,l]=d.useState(0),[c,u]=d.useState(0),[h,p]=d.useState(0),[g,y]=d.useState([]),[m,x]=d.useState(kn),[b,f]=d.useState([]),[j,v]=d.useState([]),[C,N]=d.useState({}),[M,k]=d.useState({}),[T,E]=d.useState({}),[A,I]=d.useState({}),[L,P]=d.useState({});return d.useEffect(()=>{if(!t||!n)return;const _=Hn(t.notes.map(U=>U.noteLine),t.bpm??void 0),ee=(t.gap??0)/1e3,K=Ka(_,ee),z=Dr(a),V=[];let W=null,H=null,G=null,Z=[];const w={},R={},S={},F={},Y={},O=i?s[0]:s.find(U=>!!U.micId)||s[0];for(let U=0;U<s.length;U++){const $=s[U],q=($==null?void 0:$.id)!=null?e[$.id]||[]:[];if(q.length===0){V.push({id:$.id,name:$.name||`Player ${$.id}`,color:$.color||Xe[U%Xe.length],classicScore:0,bonusScore:0,totalScore:0}),w[$.id]=[],R[$.id]={...kn},S[$.id]=[],F[$.id]=0,Y[$.id]={...qs};continue}const X=Va($.id),re=!!(X!=null&&X.disableGoldNotes),oe=tl(K,q,{semitoneTolerance:z.semitoneTolerance,preWindow:z.preWindow,postExtra:z.postExtra,difficultyMult:z.difficultyMult,disableGoldNotes:re}),se=al(oe,K,re);V.push({id:$.id,name:$.name||`Player ${$.id}`,color:$.color||Xe[U%Xe.length],classicScore:se.classicScore,bonusScore:se.bonusScore,totalScore:se.totalScore}),w[$.id]=zo(oe.perNote,_,ee),R[$.id]=oe.combo??{...kn},S[$.id]=oe.verseRatings??[],F[$.id]=se.totalScore,Y[$.id]=oe.noteStats??{...qs},$.id===(O==null?void 0:O.id)&&(W=se,H=oe.combo??null,G=oe.verseRatings??null,Z=w[$.id])}v(V),N(w),k(R),E(S),I(F),P(Y),W?(l(W.classicScore),u(W.bonusScore),p(W.totalScore),y(Z),x(H??kn),f(G??[])):(l(0),u(0),p(0),y([]),x(kn),f([]))},[e,t,n,a,s,i]),{liveScore:o,liveBonusScore:c,liveTotalScore:h,liveSegmentScores:g,liveCombo:m,liveVerseRatings:b,perPlayerScores:j,perPlayerSegmentScores:C,perPlayerCombo:M,perPlayerVerseRatings:T,perPlayerTotalScores:A,perPlayerNoteStats:L}}const qh=[],Hh=e=>!!e&&/youtu(\.be|be\.com)/i.test(e),Kh=({players:e=qh,song:t,initialSong:n=null,difficulty:a="normal",gameMode:s="normal",height:i=480,showTimelines:o=!0,showLyrics:l=!0,singleTimeline:c=!1,requestMicPermission:u=!0,initiallyActivated:h=!1,showUploader:p=!1,parseSong:g,micAlgorithms:y,defaultPitchAlgorithm:m="pitchy",micRmsThresholds:x,micOffsets:b,micGains:f,micPitchThresholds:j,micSmoothingWindows:v,micHysteresisFrames:C,micUseHanning:N,micMonitorEnabled:M,micMonitorVolumes:k,searchYouTubeByArtistTitle:T,fetchTopSingings:E,onSaveResults:A,rtc:I,onSongChange:L,onPlayingChange:P,onTimeUpdate:_,onEnded:ee,onContinue:K,renderReport:z,t:V,className:W,style:H,id:G,accessMode:Z,"data-testid":w})=>{var _e;const{t:R}=xe(),S=V??R,[F,Y]=d.useState(t??n??null),[O,U]=d.useState(!1),[$,q]=d.useState(0),[X,re]=d.useState(h),[oe,se]=d.useState(!1),[D,J]=d.useState([]),[ae,ce]=d.useState(""),[le,ne]=d.useState(null),[pe,fe]=d.useState(0),ge=s==="pad",[he,we]=d.useState([]),[je,Pe]=d.useState([]),[$e,Ye]=d.useState([]),[ue,Se]=d.useState([]),Oe=d.useRef(null),Me=d.useRef(null),Ie=d.useRef(null),Qe=d.useRef(!1),Be=d.useRef(0);d.useEffect(()=>{Be.current=$},[$]);const He=d.useRef(t);d.useEffect(()=>{t!==void 0&&t!==He.current&&(He.current=t,Y(t),se(!1),q(0),fe(be=>be+1))},[t]);const Lt=d.useMemo(()=>JSON.stringify(e.map(be=>({id:be.id,micId:be.micId}))),[e]),{livePitch:ct,setLivePitch:ht,recordings:it,remoteLatencyMs:wt}=Qo({isPlaying:O,gameMode:s,players:e,playersMicKey:Lt,micAlgorithms:y,defaultPitchAlgorithm:m,micRmsThresholds:x,micOffsets:b,micGains:f,micPitchThresholds:j,micSmoothingWindows:v,micHysteresisFrames:C,micUseHanning:N,micMonitorEnabled:M,micMonitorVolumes:k,currentTimeRef:Be,isPadMode:ge,rtc:I}),Je=sl({livePitch:ct,uploadedSong:F,isPlaying:O,difficulty:a,players:e,isPadMode:ge}),Pt=d.useRef(Je);Pt.current=Je;const Xt=d.useMemo(()=>F?Go(F,s):null,[F,s]),ke=((_e=e[0])==null?void 0:_e.id)??1;d.useEffect(()=>{var Te;if(!ge||!O||!F){(Te=Oe.current)==null||Te.stop(),Oe.current=null,we([]),Pe([]),Ye([]),Se([]);return}const be=new Zo({difficulty:a,noteLines:F.notes.map(Le=>Le.noteLine),bpm:F.bpm??void 0,gap:F.gap??0,onPitch:Le=>{const Ge=Be.current;ht(ze=>{const tt=ze[ke]||[];return{...ze,[ke]:[...tt,{t:Ge,hz:Le}]}})},onHitFeedback:Le=>Se(Ge=>[...Ge.slice(-20),Le]),onLaneActive:Le=>Ye(Le)});return we(be.getLanes()),Pe(be.getEvents()),Ye(new Array(be.getLanes().length).fill(!1)),be.start(()=>Be.current),Oe.current=be,()=>{be.stop(),Oe.current=null}},[ge,O,F,a,ke,ht]);const Ce=d.useCallback(be=>{U(be),P==null||P(be)},[P]),We=d.useCallback(be=>{q(be),_==null||_(be)},[_]),De=d.useCallback(()=>{var Te;try{Yt()}catch{}const be=()=>{re(!0),Qe.current=!0};!ge&&u&&((Te=navigator.mediaDevices)!=null&&Te.getUserMedia)?navigator.mediaDevices.getUserMedia({audio:!0}).then(Le=>Le.getTracks().forEach(Ge=>Ge.stop())).catch(()=>{}).finally(be):be()},[ge,u]);d.useEffect(()=>{if(!X||!Qe.current)return;Qe.current=!1;const be=window.setInterval(()=>{Me.current&&(window.clearInterval(be),Me.current.play())},100),Te=window.setTimeout(()=>window.clearInterval(be),3e3);return()=>{window.clearInterval(be),window.clearTimeout(Te)}},[X]);const Ae=d.useCallback(()=>{se(!0),ee==null||ee();const be=(F==null?void 0:F.id)??0,Te=Pt.current,Le=[];for(const ze of e){const tt=Te.perPlayerTotalScores[ze.id]??0;if(tt<=0)continue;const Ke=Te.perPlayerNoteStats[ze.id];Le.push({playerId:ze.id,songId:be,score:tt,hits:(Ke==null?void 0:Ke.hits)??0,misses:(Ke==null?void 0:Ke.misses)??0,good:(Ke==null?void 0:Ke.good)??0,perfect:(Ke==null?void 0:Ke.perfect)??0,combo:(Ke==null?void 0:Ke.maxCombo)??0})}const Ge=()=>{E&&be>0&&Promise.resolve(E(be)).then(J).catch(()=>{})};A&&Le.length>0?Promise.resolve(A(Le)).then(Ge).catch(Ge):Ge()},[e,F,A,E,ee]);d.useEffect(()=>{var be;s==="demo"&&O&&$>=12&&((be=Me.current)==null||be.pause(),Ae())},[s,O,$,Ae]),d.useEffect(()=>{if(!F||pe===0||!T||Hh(F.videoPath))return;if(F.youtubeId){const Te=`https://www.youtube.com/watch?v=${F.youtubeId}`;Y(Le=>Le&&{...Le,videoPath:Te});return}if(!F.artist||!F.title)return;let be=!1;return ce(S("karaokeManager.ytSearching","Searching YouTube…")),ne("searching"),Promise.resolve(T(F.artist,F.title)).then(Te=>{if(!be)if(Te){const Le=`https://www.youtube.com/watch?v=${Te}`;Y(Ge=>Ge&&{...Ge,videoPath:Le}),ce(""),ne(null)}else ce(S("karaokeManager.ytNotFound","Not found on YouTube")),ne("error"),window.setTimeout(()=>{be||(ce(""),ne(null))},4e3)}).catch(()=>{be||(ce(S("karaokeManager.ytSearchError","Search error")),ne("error"))}),()=>{be=!0}},[pe,F,T,S]);const Ee=d.useCallback(()=>{var be,Te;se(!1),ht({}),(be=Me.current)==null||be.seekTo(0),(Te=Me.current)==null||Te.play()},[ht]),de=d.useCallback(()=>{se(!1),K==null||K()},[K]),me=d.useCallback(be=>{Y(be),se(!1),q(0),fe(Te=>Te+1),L==null||L(be)},[L]),Re=d.useMemo(()=>{if(!c)return e;const be=e.find(Te=>!!Te.micId)||e[0];return be?[be]:[]},[e,c]),Ne=((F==null?void 0:F.gap)??0)/1e3;return Z==="hidden"?null:r.jsxs("div",{className:`nice-karaoke-manager${W?` ${W}`:""}`,style:{position:"relative",textAlign:"center",minHeight:i,...H},id:G,"data-testid":w,children:[ae&&r.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",gap:8,margin:"10px auto",padding:"8px 16px",maxWidth:420,borderRadius:8,fontSize:14,fontWeight:500,background:"var(--nice-accent, #3b82f6)",color:"var(--nice-text-on-primary, #fff)"},children:[le==="error"?r.jsx(B.NtdClose,{size:16}):r.jsx(B.NtdSearch,{size:16}),ae]}),!F&&p&&r.jsx(Uo,{onSongUpload:me,parseSong:g,t:S}),F&&!X&&r.jsxs("button",{type:"button",className:"nice-karaoke-manager__activate",onClick:De,style:{position:"absolute",inset:0,zIndex:30,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:16,border:"none",cursor:"pointer",background:"var(--nice-overlay-80, rgba(0,0,0,0.82))",color:"#fff"},children:[r.jsx("div",{style:{fontSize:56,lineHeight:0},children:ge?r.jsx(B.NtdGamepad,{size:56}):r.jsx(B.NtdMicrophone,{size:56})}),r.jsx("h2",{style:{margin:0,fontSize:22,fontWeight:700,color:"#fff"},children:S("karaokeManager.activateAudio","Tap to start")}),r.jsx("p",{style:{margin:0,maxWidth:360,fontSize:14,color:"var(--nice-text-muted, #94a3b8)"},children:ge?S("karaokeManager.padHint","Hit the notes with your keys or pad!"):S("karaokeManager.micHint","Your browser needs a tap to unlock the microphone and audio.")})]}),F&&r.jsxs("div",{ref:Ie,style:{position:"relative",width:"100%",maxWidth:1200,margin:"0 auto"},children:[r.jsx("div",{style:{width:"100%",position:"relative",zIndex:10},children:r.jsx(Io,{tracks:Xt?[Xt]:[],autoPlay:!1,uiMode:"nobuttons",height:i,externalRef:Me,onPlayingChange:Ce,onTimeUpdate:We,onEnded:Ae})}),o&&X&&r.jsx("div",{style:{position:"absolute",inset:0,zIndex:20,pointerEvents:"none"},children:Re.map((be,Te)=>{const Le=ct[be.id]||[],Ge=Ne?Le.map(ze=>({t:ze.t-Ne,hz:ze.hz})):Le;return r.jsx(To,{song:F,currentTime:$,playerRef:Ie,userPitch:Ge,segmentScores:Je.perPlayerSegmentScores[be.id],combo:Je.perPlayerCombo[be.id],verseRatings:Je.perPlayerVerseRatings[be.id],config:{playerName:be.name,score:Je.perPlayerTotalScores[be.id]??0,playerBgColor:be.color||Xe[Te%Xe.length],difficultyLevel:a,isPlaying:O,playerCount:Re.length,latencyMs:wt[be.id]??null,top:30+Te*160}},be.id)})}),ge&&he.length>0&&r.jsx(Vo,{lanes:he,events:je,currentTime:$,activeLanes:$e,difficulty:a,feedbackQueue:ue,isPlaying:O}),l&&X&&r.jsx("div",{style:{position:"absolute",bottom:20,left:0,right:0,zIndex:25,pointerEvents:"none"},children:r.jsx(po,{song:F,currentTime:$})})]}),oe&&Object.keys(it).length>0&&r.jsx(Yh,{recordings:it,players:e,t:S}),oe&&r.jsx($o,{uploadedSong:F,playerScores:Je.perPlayerScores,topSingings:D,onRestart:Ee,onContinue:de,t:S,renderReport:z})]})},Yh=({recordings:e,players:t,t:n})=>{const a=d.useMemo(()=>{const s={};for(const[i,o]of Object.entries(e))o&&(s[Number(i)]=URL.createObjectURL(o));return s},[e]);return d.useEffect(()=>()=>{for(const s of Object.values(a))URL.revokeObjectURL(s)},[a]),r.jsxs("div",{style:{margin:"24px auto",maxWidth:640,background:"var(--nice-bg-tertiary)",borderRadius:12,padding:16,textAlign:"left"},children:[r.jsxs("h4",{style:{marginTop:0,color:"var(--nice-text-primary, #fff)"},children:[r.jsx(B.NtdMicrophone,{size:16})," ",n("karaokeManager.playerRecordings","Player recordings")]}),r.jsx("ul",{style:{listStyle:"none",padding:0,margin:0,color:"var(--nice-text-primary, #fff)"},children:t.map(s=>r.jsxs("li",{style:{marginBottom:12,display:"flex",alignItems:"center",gap:10},children:[r.jsx("b",{children:s.name||n("karaokeManager.player","Player {id}").replace("{id}",String(s.id))}),a[s.id]?r.jsxs(r.Fragment,{children:[r.jsx("audio",{controls:!0,src:a[s.id],style:{flex:1,maxWidth:300}}),r.jsxs("a",{href:a[s.id],download:`${s.name||`player-${s.id}`}-recording.webm`,style:{color:"var(--nice-accent-light, #4fc3f7)",whiteSpace:"nowrap"},children:[r.jsx(B.NtdDownload,{size:13})," ",n("karaokeManager.download","Download")]})]}):r.jsx("span",{style:{opacity:.6},children:n("karaokeManager.noRecording","No recording")})]},s.id))})]})},il=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"];function on(e){return 12*Math.log2(e/440)+69}function Jn(e){const t=il[Math.round(e)%12],n=Math.floor(Math.round(e)/12)-1;return`${t}${n}`}function Jr(e,t){const n=e-t;return n-12*Math.round(n/12)}function er(e,t){if(e.length===0)return 0;const n=t/100*(e.length-1),a=Math.floor(n),s=Math.ceil(n);return a===s?e[a]:e[a]+(e[s]-e[a])*(n-a)}function ol(e){const{playerName:t,playerColor:n,songTitle:a,songArtist:s,songBpm:i,difficulty:o,pitchPoints:l,notes:c,verseRatings:u,combo:h,classicScore:p,bonusScore:g,totalScore:y,micSettings:m}=e,x=l.filter(ue=>ue.hz>0),b=x.map(ue=>on(ue.hz)),f=[],j=[],v=[...c].sort((ue,Se)=>ue.startTime-Se.startTime);function C(ue){let Se=0,Oe=v.length-1;for(;Se<=Oe;){const Me=Se+Oe>>>1,Ie=v[Me];if(ue<Ie.startTime)Oe=Me-1;else if(ue>Ie.startTime+Ie.duration)Se=Me+1;else return Ie.pitch}return null}const N=[];for(const ue of l){const Se=ue.hz>0?on(ue.hz):0,Oe=C(ue.t);N.push({t:ue.t,sung:Se,expected:Oe}),Se>0&&Oe!==null&&f.push(Jr(Se,Oe)*100)}const M=N.flatMap(ue=>ue.sung>0&&ue.expected!==null?[ue.sung-ue.expected]:[]).sort((ue,Se)=>ue-Se),k=M.length>0?12*Math.round(er(M,50)/12):0,T=N.map(ue=>({t:ue.t,sung:ue.sung,expected:ue.expected===null?0:ue.expected+k}));let E=0;for(const ue of v){const Se=ue.startTime-.3,Oe=ue.startTime+ue.duration;for(;E<x.length&&x[E].t<Se;)E++;E<x.length&&x[E].t<=Oe&&j.push((x[E].t-ue.startTime)*1e3)}const A=f.map(Math.abs),I=[...A].sort((ue,Se)=>ue-Se),L=A.length>0?A.reduce((ue,Se)=>ue+Se,0)/A.length:0,P=er(I,50),_=A.length>1?Math.sqrt(A.reduce((ue,Se)=>ue+(Se-L)**2,0)/(A.length-1)):0,ee=A.filter(ue=>ue<=50).length,K=A.filter(ue=>ue<=15).length,z=A.length>0?ee/A.length*100:0,V=A.length>0?K/A.length*100:0,W=["< −100","−100 to −50","−50 to −25","−25 to −15","−15 to 0","0 to +15","+15 to +25","+25 to +50","+50 to +100","> +100"],H=new Array(10).fill(0);for(const ue of f){const Se=ue<-100?0:ue<-50?1:ue<-25?2:ue<-15?3:ue<0?4:ue<15?5:ue<25?6:ue<50?7:ue<100?8:9;H[Se]++}const G=W.map((ue,Se)=>({centRange:ue,count:H[Se],pct:f.length>0?H[Se]/f.length*100:0})),Z=x.map(ue=>ue.hz).sort((ue,Se)=>ue-Se),w=Z.length>0?Z[0]:0,R=Z.length>0?Z[Z.length-1]:0,S=w>0?on(w):0,F=R>0?on(R):0,Y=F-S,O=[...b].sort((ue,Se)=>ue-Se),U=er(O,10),$=er(O,90),q=new Array(12).fill(0);for(const ue of b){const Se=Math.round(ue)%12;Se>=0&&Se<12&&q[Se]++}const X=q.reduce((ue,Se)=>ue+Se,0),re=il.map((ue,Se)=>({note:ue,count:q[Se],pct:X>0?q[Se]/X*100:0})),oe=Zh(x),se=j.length>0?j.reduce((ue,Se)=>ue+Se,0)/j.length:0,D=j.length>1?Math.sqrt(j.reduce((ue,Se)=>ue+(Se-se)**2,0)/(j.length-1)):0,J=D>0?Math.max(0,Math.min(100,100-D/2)):100;let ae=0,ce=0;for(let ue=1;ue<b.length;ue++){const Se=Math.abs(b[ue]-b[ue-1]);ae+=Se,ce++}const le=ce>0?ae/ce*100/12:0,ne=l.filter(ue=>ue.hz<=0).length,pe=l.length>0?(1-ne/l.length)*100:0,fe=new Map;for(const ue of c){const Se=ue.line??0;fe.has(Se)||fe.set(Se,[]),fe.get(Se).push(ue)}const ge=new Map;for(const ue of x){const Se=C(ue.t);if(Se===null)continue;let Oe=0,Me=v.length-1,Ie=-1;for(;Oe<=Me;){const Be=Oe+Me>>>1,He=v[Be];if(ue.t<He.startTime)Me=Be-1;else if(ue.t>He.startTime+He.duration)Oe=Be+1;else{Ie=He.line??0;break}}if(Ie<0)continue;const Qe=Math.abs(Jr(on(ue.hz),Se)*100);ge.has(Ie)||ge.set(Ie,[]),ge.get(Ie).push(Qe)}const he=u.map(ue=>{const Se=fe.get(ue.verseIndex)??[],Oe=ge.get(ue.verseIndex)??[],Me=Oe.length>0?Oe.reduce((Ie,Qe)=>Ie+Qe,0)/Oe.length:0;return{verseIndex:ue.verseIndex,label:ue.label,hitFraction:ue.hitFraction,avgCentDeviation:Math.round(Me*10)/10,noteCount:Se.length,notesHit:Math.round(ue.hitFraction*Se.length),comboBonus:ue.comboBonus}}),we=2,je=.5,Pe=l.length>0?l[l.length-1].t:0,$e=[],Ye=N.flatMap(ue=>ue.sung>0&&ue.expected!==null?[{t:ue.t,hit:Math.abs(Jr(ue.sung,ue.expected))<=.5}]:[]);if(Ye.length>0){let ue=0,Se=0,Oe=0;for(let Me=0;Me<=Pe;Me+=je){const Ie=Me-we/2,Qe=Me+we/2;for(;Se<Ye.length&&Ye[Se].t<Qe;)Ye[Se].hit&&Oe++,Se++;for(;ue<Se&&Ye[ue].t<Ie;)Ye[ue].hit&&Oe--,ue++;const Be=Se-ue;$e.push({t:Me,accuracy:Be>0?Oe/Be*100:0})}}else for(let ue=0;ue<=Pe;ue+=je)$e.push({t:ue,accuracy:0});return{playerName:t,playerColor:n,songTitle:a,songArtist:s,songBpm:i,difficulty:o,timestamp:new Date().toISOString(),classicScore:p,bonusScore:g,totalScore:y,maxCombo:(h==null?void 0:h.maxCombo)??0,totalComboBonus:(h==null?void 0:h.totalComboBonus)??0,totalPitchPoints:l.length,avgCentDeviation:Math.round(L*10)/10,medianCentDeviation:Math.round(P*10)/10,stdDevCents:Math.round(_*10)/10,intonationAccuracyPct:Math.round(z*10)/10,perfectHitPct:Math.round(V*10)/10,pitchDeviationHistogram:G,lowestHz:Math.round(w*10)/10,highestHz:Math.round(R*10)/10,lowestNote:S>0?Jn(S):"—",highestNote:F>0?Jn(F):"—",rangeInSemitones:Math.round(Y*10)/10,tessituraLow:U>0?Jn(U):"—",tessituraHigh:$>0?Jn($):"—",pitchClassDistribution:re,vibrato:oe,avgOnsetDeviationMs:Math.round(se*10)/10,rhythmStabilityPct:Math.round(J*10)/10,jitterPct:Math.round(le*100)/100,shimmerProxy:Math.round(pe*10)/10,verseMetrics:he,micSettings:m,pitchOverTime:T,accuracyOverTime:$e}}function Zh(e){if(e.length<20)return{detected:!1,avgRateHz:0,avgExtentCents:0,regularityPct:0};const t=e.map(y=>on(y.hz)),n=e.map(y=>y.t),a=.5,s=[],i=[];let o=0,l=0,c=0;for(let y=0;y<e.length;y++){for(l+=t[y],c++;o<y&&n[y]-n[o]>=a;)l-=t[o],c--,o++;if(c<6||(y-o)%10!==0)continue;const m=l/c;let x=0,b=t[o]-m,f=Math.abs(b);for(let C=o+1;C<=y;C++){const N=t[C]-m;N*b<0&&x++,b=N;const M=Math.abs(N);M>f&&(f=M)}const j=n[y]-n[o];if(j<=0)continue;const v=x/2/j;v>=3&&v<=12&&(s.push(v),i.push(f*100))}if(s.length<3)return{detected:!1,avgRateHz:0,avgExtentCents:0,regularityPct:0};const u=s.reduce((y,m)=>y+m,0)/s.length,h=i.reduce((y,m)=>y+m,0)/i.length,p=Math.sqrt(s.reduce((y,m)=>y+(m-u)**2,0)/s.length),g=Math.max(0,Math.min(100,100-p*20));return{detected:!0,avgRateHz:Math.round(u*10)/10,avgExtentCents:Math.round(h*10)/10,regularityPct:Math.round(g)}}const Q={overlay:{position:"fixed",inset:0,background:"var(--nice-overlay-90, rgba(0,0,0,0.92))",display:"flex",alignItems:"flex-start",justifyContent:"center",zIndex:250,color:"var(--nice-text, #e2e8f0)",overflowY:"auto",padding:"24px 12px"},container:{background:"var(--nice-bg, #0f172a)",borderRadius:16,padding:32,width:"min(960px, 95vw)",boxShadow:"0 16px 48px var(--nice-overlay-60, rgba(0,0,0,0.6))",fontFamily:"'Segoe UI', system-ui, -apple-system, sans-serif"},header:{textAlign:"center",marginBottom:24,borderBottom:"2px solid var(--nice-border, #334155)",paddingBottom:20},title:{fontSize:28,fontWeight:800,color:"var(--nice-text, #f1f5f9)",margin:"0 0 4px"},subtitle:{fontSize:14,color:"var(--nice-text-muted, #64748b)",margin:0},sectionTitle:{fontSize:18,fontWeight:700,color:"var(--nice-accent, #38bdf8)",margin:"28px 0 12px",borderBottom:"1px solid var(--nice-bg-secondary, #1e293b)",paddingBottom:6,display:"flex",alignItems:"center",gap:8},table:{width:"100%",borderCollapse:"collapse",fontSize:13,margin:"8px 0"},th:{background:"var(--nice-bg-secondary, #1e293b)",color:"var(--nice-text-muted, #94a3b8)",padding:"8px 12px",textAlign:"left",fontWeight:600,fontSize:12,textTransform:"uppercase",letterSpacing:.5,borderBottom:"2px solid var(--nice-border, #334155)"},thRight:{background:"var(--nice-bg-secondary, #1e293b)",color:"var(--nice-text-muted, #94a3b8)",padding:"8px 12px",textAlign:"right",fontWeight:600,fontSize:12,textTransform:"uppercase",letterSpacing:.5,borderBottom:"2px solid var(--nice-border, #334155)"},td:{padding:"6px 12px",borderBottom:"1px solid var(--nice-bg-secondary, #1e293b)",color:"var(--nice-text-secondary, #cbd5e1)"},tdRight:{padding:"6px 12px",borderBottom:"1px solid var(--nice-bg-secondary, #1e293b)",textAlign:"right",color:"var(--nice-text, #e2e8f0)",fontWeight:500},tdBold:{padding:"6px 12px",borderBottom:"1px solid var(--nice-bg-secondary, #1e293b)",color:"var(--nice-text, #f1f5f9)",fontWeight:700},kpiGrid:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(180px, 1fr))",gap:12,margin:"12px 0"},kpiCard:{background:"var(--nice-bg-secondary, #1e293b)",borderRadius:10,padding:"14px 16px",textAlign:"center",border:"1px solid var(--nice-border, #334155)"},kpiValue:{fontSize:26,fontWeight:800,color:"var(--nice-warning, #fbbf24)"},kpiLabel:{fontSize:11,color:"var(--nice-text-muted, #64748b)",marginTop:2,textTransform:"uppercase",letterSpacing:.8},kpiUnit:{fontSize:13,fontWeight:400,color:"var(--nice-text-muted, #94a3b8)",marginLeft:2},chartWrap:{background:"var(--nice-bg-secondary, #1e293b)",borderRadius:10,padding:16,margin:"12px 0",border:"1px solid var(--nice-border, #334155)"},chartTitle:{fontSize:13,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)",marginBottom:8,textAlign:"center"},badge:e=>({display:"inline-block",padding:"2px 10px",borderRadius:20,background:e,color:"#fff",fontSize:12,fontWeight:700}),btnPrimary:{background:"var(--nice-info, #3b82f6)",color:"#fff",border:"none",borderRadius:8,padding:"10px 22px",fontSize:14,fontWeight:700,cursor:"pointer"},btnSecondary:{background:"var(--nice-border, #334155)",color:"var(--nice-text, #e2e8f0)",border:"none",borderRadius:8,padding:"10px 22px",fontSize:14,fontWeight:600,cursor:"pointer"},row:{display:"flex",gap:16,flexWrap:"wrap"},half:{flex:"1 1 45%",minWidth:280},footer:{textAlign:"center",marginTop:24,paddingTop:16,borderTop:"1px solid var(--nice-bg-secondary, #1e293b)",color:"var(--nice-text-muted, #475569)",fontSize:11}};function mt(e){return e>=90?"#22c55e":e>=70?"#84cc16":e>=50?"#eab308":e>=30?"#f97316":"#ef4444"}function Hs(e){switch(e){case"Perfect":return"#22c55e";case"Great":return"#84cc16";case"Good":return"#eab308";case"OK":return"#f97316";default:return"#ef4444"}}function Xh(e){return e.includes("−15 to 0")||e.includes("0 to +15")?"var(--nice-success, #22c55e)":e.includes("25")?"var(--nice-warning, #eab308)":"var(--nice-danger, #ef4444)"}const Vt=e=>Math.round(e*10)/10;function Ks(e,t,n){return e.map((a,s)=>({name:a,color:n[s],data:t.map((i,o)=>o===s?Vt(i):0)}))}function Ys(e,t){if(e.length<=t)return e;const n=Math.ceil(e.length/t);return e.filter((a,s)=>s%n===0)}function Zs(e){const t=e.length>1?e[e.length-1]-e[0]:0,n=[1,2,5,10,15,30,60,120,300].find(s=>t/s<=10)??600;let a=Math.ceil((e[0]??0)/n)*n;return e.map(s=>{if(s+1e-9<a)return"";for(;a<=s+1e-9;)a+=n;return`${Math.round(s)}s`})}const Xs=240,Qh=({reports:e,noteCount:t,uploadedSong:n=null,playerScores:a,livePitch:s,liveVerseRatings:i,liveCombo:o,difficulty:l="normal",micSettings:c,onClose:u,t:h,className:p,style:g,id:y,accessMode:m,"data-testid":x})=>{const{t:b}=xe(),f=h??b,j=d.useRef(null),v=d.useMemo(()=>{if(e||!n)return[];const S=Hn(n.notes.map(Y=>Y.noteLine),n.bpm??void 0),F=(n.gap??0)/1e3;return Ka(S,F)},[e,n]),C=d.useMemo(()=>e||(!n||!a||!o?[]:a.map(S=>{const F=(s==null?void 0:s[S.id])||[];return ol({playerName:S.name,playerColor:S.color,songTitle:n.title,songArtist:n.artist,songBpm:n.bpm??0,difficulty:l,pitchPoints:F,notes:v,verseRatings:i??[],combo:o,classicScore:S.classicScore,bonusScore:S.bonusScore,totalScore:S.totalScore,micSettings:(c==null?void 0:c[S.id])??null})})),[e,n,a,s,i,o,l,v,c]),N=d.useCallback(()=>{var U,$;if(!j.current)return;const S=`<!DOCTYPE html>
48
48
  <html lang="en"><head><meta charset="utf-8">
49
- <title>Vocal Performance Report — ${((Z=w[0])==null?void 0:Z.songTitle)??"Karaoke"}</title>
49
+ <title>Vocal Performance Report — ${((U=C[0])==null?void 0:U.songTitle)??"Karaoke"}</title>
50
50
  <style>
51
51
  body{margin:0;padding:24px;background:var(--nice-bg, #0f172a);color:var(--nice-text, #e2e8f0);font-family:'Segoe UI',system-ui,sans-serif}
52
52
  table{border-collapse:collapse;width:100%}th,td{padding:6px 10px;border-bottom:1px solid var(--nice-bg-secondary, #1e293b);text-align:left}
@@ -56,19 +56,19 @@ th{background:var(--nice-bg-secondary, #1e293b);color:var(--nice-text-muted, #94
56
56
  .nice-chart__grid-line,.nice-chart__axis{stroke:var(--nice-border, #334155)}.nice-chart__axis-label,.nice-chart__legend-text{fill:var(--nice-text-muted, #94a3b8);font-size:11px}
57
57
  @media print{body{background:#fff;color:#000}th{background:var(--nice-bg-secondary, #f0f0f0);color:var(--nice-text-muted, #333)}td{color:var(--nice-text-muted, #333);border-color:var(--nice-border, #ddd)}}
58
58
  </style></head><body>
59
- ${k.current.innerHTML}
60
- </body></html>`,B=new Blob([S],{type:"text/html"}),H=URL.createObjectURL(B),z=document.createElement("a");z.href=H,z.download=`vocal-report-${(((E=w[0])==null?void 0:E.songTitle)??"karaoke").replace(/[^a-z0-9]/gi,"_")}.html`,z.click(),URL.revokeObjectURL(H)},[w]),M=d.useCallback(()=>window.print(),[]),j=d.useCallback(()=>{var Z;const S=JSON.stringify(w,null,2),B=new Blob([S],{type:"application/json"}),H=URL.createObjectURL(B),z=document.createElement("a");z.href=H,z.download=`vocal-data-${(((Z=w[0])==null?void 0:Z.songTitle)??"karaoke").replace(/[^a-z0-9]/gi,"_")}.json`,z.click(),URL.revokeObjectURL(H)},[w]);if(m==="hidden")return null;if(w.length===0)return r.jsx("div",{className:p,style:{...Q.overlay,...g},id:y,"data-testid":x,onClick:S=>S.target===S.currentTarget&&(u==null?void 0:u()),onKeyDown:S=>S.key==="Escape"&&(u==null?void 0:u()),children:r.jsxs("div",{style:{...Q.container,textAlign:"center"},children:[r.jsxs("div",{style:Q.header,children:[r.jsxs("h2",{style:Q.title,children:[r.jsx(F.NtdBarChart,{size:24})," ",f("karaoke.report.title","Vocal Performance Report")]}),r.jsx("p",{style:Q.subtitle,children:f("karaoke.report.empty","No performance data yet — sing a song to see the report.")})]}),u&&r.jsxs("button",{style:Q.btnSecondary,onClick:u,children:[r.jsx(F.NtdClose,{size:16})," ",f("common.close","Close")]})]})});const T=w[0],P=t??v.length,A=zr(l),I=T.intonationAccuracyPct*.3+T.perfectHitPct*.2+T.rhythmStabilityPct*.15+T.shimmerProxy*.1+Math.min(100,T.maxCombo/Math.max(P,1)*100)*.1+Math.min(100,T.totalScore/1e4*100)*.15,L=I>=95?"A+":I>=90?"A":I>=85?"A−":I>=80?"B+":I>=75?"B":I>=70?"B−":I>=65?"C+":I>=60?"C":I>=55?"C−":I>=50?"D+":I>=45?"D":I>=40?"D−":"F",N={"A+":f("vocalReport.gradeAPlus","Outstanding — professional-level control."),A:f("vocalReport.gradeA","Excellent intonation and timing."),"A−":f("vocalReport.gradeAMinus","Very strong performance."),"B+":f("vocalReport.gradeBPlus","Great, with minor pitch slips."),B:f("vocalReport.gradeB","Solid and consistent."),"B−":f("vocalReport.gradeBMinus","Good, room to tighten timing."),"C+":f("vocalReport.gradeCPlus","Decent — practice pitch accuracy."),C:f("vocalReport.gradeC","Average; work on intonation."),"C−":f("vocalReport.gradeCMinus","Passable; needs steadier pitch."),"D+":f("vocalReport.gradeDPlus","Below average — keep practising."),D:f("vocalReport.gradeD","Weak intonation throughout."),"D−":f("vocalReport.gradeDMinus","Struggling with pitch and timing."),F:f("vocalReport.gradeF","Off-pitch for most notes.")};let _=0;const ee=[{metric:f("vocalReport.radarIntonation","Intonation"),value:T.intonationAccuracyPct,max:100},{metric:f("vocalReport.radarPerfectHits","Perfect hits"),value:T.perfectHitPct,max:100},{metric:f("vocalReport.radarRhythm","Rhythm"),value:T.rhythmStabilityPct,max:100},{metric:f("vocalReport.radarVocalRange","Range"),value:Math.min(100,T.rangeInSemitones/24*100),max:100},{metric:f("vocalReport.radarStability","Stability"),value:T.shimmerProxy,max:100},{metric:f("vocalReport.radarCombo","Combo"),value:Math.min(100,T.maxCombo/Math.max(P,1)*100),max:100}],Y=[{name:f("vocalReport.perfLabel","Perfect"),value:T.perfectHitPct,fill:"var(--nice-success, #22c55e)"},{name:f("vocalReport.goodLabel","Good"),value:T.intonationAccuracyPct-T.perfectHitPct,fill:"var(--nice-success, #84cc16)"},{name:f("vocalReport.offPitch","Off-pitch"),value:100-T.intonationAccuracyPct,fill:"var(--nice-danger, #ef4444)"}].filter(S=>S.value>0),O=T.pitchClassDistribution.filter(S=>S.count>0).sort((S,B)=>B.pct-S.pct),U=T.verseMetrics.map(S=>({verse:`V${S.verseIndex+1}`,accuracy:Math.round(S.hitFraction*100),label:S.label})),V=Ys(T.pitchOverTime,Xs),K=Ys(T.accuracyOverTime,Xs),G=T.pitchDeviationHistogram,W=f("vocalReport.samples","Samples"),C=f("vocalReport.hitPct","Hit %"),$=f("vocalReport.cents","cents");return r.jsxs("div",{className:p,style:{...Q.overlay,...g},id:y,"data-testid":x,onClick:S=>S.target===S.currentTarget&&(u==null?void 0:u()),onKeyDown:S=>S.key==="Escape"&&(u==null?void 0:u()),children:[r.jsx("style",{children:`
59
+ ${j.current.innerHTML}
60
+ </body></html>`,F=new Blob([S],{type:"text/html"}),Y=URL.createObjectURL(F),O=document.createElement("a");O.href=Y,O.download=`vocal-report-${((($=C[0])==null?void 0:$.songTitle)??"karaoke").replace(/[^a-z0-9]/gi,"_")}.html`,O.click(),URL.revokeObjectURL(Y)},[C]),M=d.useCallback(()=>window.print(),[]),k=d.useCallback(()=>{var U;const S=JSON.stringify(C,null,2),F=new Blob([S],{type:"application/json"}),Y=URL.createObjectURL(F),O=document.createElement("a");O.href=Y,O.download=`vocal-data-${(((U=C[0])==null?void 0:U.songTitle)??"karaoke").replace(/[^a-z0-9]/gi,"_")}.json`,O.click(),URL.revokeObjectURL(Y)},[C]);if(m==="hidden")return null;if(C.length===0)return r.jsx("div",{className:p,style:{...Q.overlay,...g},id:y,"data-testid":x,onClick:S=>S.target===S.currentTarget&&(u==null?void 0:u()),onKeyDown:S=>S.key==="Escape"&&(u==null?void 0:u()),children:r.jsxs("div",{style:{...Q.container,textAlign:"center"},children:[r.jsxs("div",{style:Q.header,children:[r.jsxs("h2",{style:Q.title,children:[r.jsx(B.NtdBarChart,{size:24})," ",f("karaoke.report.title","Vocal Performance Report")]}),r.jsx("p",{style:Q.subtitle,children:f("karaoke.report.empty","No performance data yet — sing a song to see the report.")})]}),u&&r.jsxs("button",{style:Q.btnSecondary,onClick:u,children:[r.jsx(B.NtdClose,{size:16})," ",f("common.close","Close")]})]})});const T=C[0],E=t??v.length,A=Dr(l),I=T.intonationAccuracyPct*.3+T.perfectHitPct*.2+T.rhythmStabilityPct*.15+T.shimmerProxy*.1+Math.min(100,T.maxCombo/Math.max(E,1)*100)*.1+Math.min(100,T.totalScore/1e4*100)*.15,L=I>=95?"A+":I>=90?"A":I>=85?"A−":I>=80?"B+":I>=75?"B":I>=70?"B−":I>=65?"C+":I>=60?"C":I>=55?"C−":I>=50?"D+":I>=45?"D":I>=40?"D−":"F",P={"A+":f("vocalReport.gradeAPlus","Outstanding — professional-level control."),A:f("vocalReport.gradeA","Excellent intonation and timing."),"A−":f("vocalReport.gradeAMinus","Very strong performance."),"B+":f("vocalReport.gradeBPlus","Great, with minor pitch slips."),B:f("vocalReport.gradeB","Solid and consistent."),"B−":f("vocalReport.gradeBMinus","Good, room to tighten timing."),"C+":f("vocalReport.gradeCPlus","Decent — practice pitch accuracy."),C:f("vocalReport.gradeC","Average; work on intonation."),"C−":f("vocalReport.gradeCMinus","Passable; needs steadier pitch."),"D+":f("vocalReport.gradeDPlus","Below average — keep practising."),D:f("vocalReport.gradeD","Weak intonation throughout."),"D−":f("vocalReport.gradeDMinus","Struggling with pitch and timing."),F:f("vocalReport.gradeF","Off-pitch for most notes.")};let _=0;const ee=[{metric:f("vocalReport.radarIntonation","Intonation"),value:T.intonationAccuracyPct,max:100},{metric:f("vocalReport.radarPerfectHits","Perfect hits"),value:T.perfectHitPct,max:100},{metric:f("vocalReport.radarRhythm","Rhythm"),value:T.rhythmStabilityPct,max:100},{metric:f("vocalReport.radarVocalRange","Range"),value:Math.min(100,T.rangeInSemitones/24*100),max:100},{metric:f("vocalReport.radarStability","Stability"),value:T.shimmerProxy,max:100},{metric:f("vocalReport.radarCombo","Combo"),value:Math.min(100,T.maxCombo/Math.max(E,1)*100),max:100}],K=[{name:f("vocalReport.perfLabel","Perfect"),value:T.perfectHitPct,fill:"var(--nice-success, #22c55e)"},{name:f("vocalReport.goodLabel","Good"),value:T.intonationAccuracyPct-T.perfectHitPct,fill:"var(--nice-success, #84cc16)"},{name:f("vocalReport.offPitch","Off-pitch"),value:100-T.intonationAccuracyPct,fill:"var(--nice-danger, #ef4444)"}].filter(S=>S.value>0),z=T.pitchClassDistribution.filter(S=>S.count>0).sort((S,F)=>F.pct-S.pct),V=T.verseMetrics.map(S=>({verse:`V${S.verseIndex+1}`,accuracy:Math.round(S.hitFraction*100),label:S.label})),W=Ys(T.pitchOverTime,Xs),H=Ys(T.accuracyOverTime,Xs),G=T.pitchDeviationHistogram,Z=f("vocalReport.samples","Samples"),w=f("vocalReport.hitPct","Hit %"),R=f("vocalReport.cents","cents");return r.jsxs("div",{className:p,style:{...Q.overlay,...g},id:y,"data-testid":x,onClick:S=>S.target===S.currentTarget&&(u==null?void 0:u()),onKeyDown:S=>S.key==="Escape"&&(u==null?void 0:u()),children:[r.jsx("style",{children:`
61
61
  @media print {
62
62
  body { background: #fff !important; color: #000 !important; }
63
63
  * { color-adjust: exact !important; -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }
64
64
  }
65
- `}),r.jsxs("div",{ref:k,style:Q.container,children:[r.jsxs("div",{style:Q.header,children:[r.jsxs("h1",{style:{...Q.title,display:"inline-flex",alignItems:"center",gap:8},children:[r.jsx(F.NtdBarChart,{size:26})," ",f("vocalReport.title","Vocal Performance Report")]}),r.jsxs("p",{style:Q.subtitle,children:[T.songArtist," — ",T.songTitle,"  | ",f("vocalReport.difficulty","Difficulty"),": ",r.jsx("strong",{children:T.difficulty})," "," | ",new Date(T.timestamp).toLocaleString()]}),r.jsxs("div",{style:{marginTop:16,display:"flex",justifyContent:"center",alignItems:"center",gap:16},children:[r.jsx("div",{style:{width:72,height:72,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:`linear-gradient(135deg, ${mt(I)}44, ${mt(I)})`,border:`3px solid ${mt(I)}`,boxShadow:`0 0 20px ${mt(I)}44`},children:r.jsx("span",{style:{fontSize:28,fontWeight:900,color:"#fff"},children:L})}),r.jsxs("div",{style:{textAlign:"left"},children:[r.jsxs("div",{style:{fontSize:14,fontWeight:700,color:mt(I)},children:[f("vocalReport.overallGrade","Overall grade"),": ",I.toFixed(1),"%"]}),r.jsx("div",{style:{fontSize:12,color:"var(--nice-text-muted, #94a3b8)",maxWidth:360},children:N[L]??""})]})]})]}),r.jsxs("div",{style:{display:"flex",gap:10,justifyContent:"flex-end",marginBottom:16,flexWrap:"wrap"},children:[r.jsxs("button",{style:Q.btnPrimary,onClick:R,children:[r.jsx(F.NtdDownload,{size:14})," ",f("vocalReport.downloadHtml","Download HTML")]}),r.jsxs("button",{style:Q.btnSecondary,onClick:M,children:[r.jsx(F.NtdPrint,{size:14})," ",f("vocalReport.printPdf","Print / PDF")]}),r.jsxs("button",{style:Q.btnSecondary,onClick:j,children:[r.jsx(F.NtdCode,{size:14})," ",f("vocalReport.exportJson","Export JSON")]}),r.jsxs("button",{style:Q.btnSecondary,onClick:u,children:[r.jsx(F.NtdClose,{size:14})," ",f("vocalReport.close","Close")]})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.scoreOverview","Score overview")]}),r.jsxs("div",{style:Q.kpiGrid,children:[r.jsxs("div",{style:Q.kpiCard,children:[r.jsx("div",{style:Q.kpiValue,children:T.totalScore.toLocaleString()}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.totalScore","Total score")})]}),r.jsxs("div",{style:Q.kpiCard,children:[r.jsx("div",{style:Q.kpiValue,children:T.classicScore.toLocaleString()}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.classicScore","Classic score")})]}),r.jsxs("div",{style:Q.kpiCard,children:[r.jsx("div",{style:Q.kpiValue,children:T.bonusScore.toLocaleString()}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.bonusScore","Bonus score")})]}),r.jsxs("div",{style:Q.kpiCard,children:[r.jsxs("div",{style:Q.kpiValue,children:[T.maxCombo,"×"]}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.maxCombo","Max combo")})]}),r.jsxs("div",{style:Q.kpiCard,children:[r.jsxs("div",{style:{...Q.kpiValue,color:mt(T.intonationAccuracyPct)},children:[T.intonationAccuracyPct,"%"]}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.intonationAccuracy","Intonation accuracy")})]}),r.jsxs("div",{style:Q.kpiCard,children:[r.jsxs("div",{style:{...Q.kpiValue,color:mt(T.perfectHitPct)},children:[T.perfectHitPct,"%"]}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.perfectHits","Perfect hits")})]})]}),w.length>1&&r.jsxs(r.Fragment,{children:[r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.playerComparison","Player comparison")]}),r.jsxs("table",{style:Q.table,children:[r.jsx("thead",{children:r.jsxs("tr",{children:[r.jsx("th",{style:Q.th,children:"#"}),r.jsx("th",{style:Q.th,children:f("vocalReport.player","Player")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.classic","Classic")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.bonus","Bonus")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.total","Total")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.intonation","Intonation")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.perfect","Perfect")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.range","Range")})]})}),r.jsx("tbody",{children:w.map((S,B)=>r.jsxs("tr",{children:[r.jsx("td",{style:Q.td,children:B+1}),r.jsx("td",{style:{...Q.tdBold,color:S.playerColor},children:S.playerName}),r.jsx("td",{style:Q.tdRight,children:S.classicScore.toLocaleString()}),r.jsx("td",{style:Q.tdRight,children:S.bonusScore.toLocaleString()}),r.jsx("td",{style:{...Q.tdRight,fontWeight:700,color:"var(--nice-warning, #fbbf24)"},children:S.totalScore.toLocaleString()}),r.jsx("td",{style:Q.tdRight,children:r.jsxs("span",{style:Q.badge(mt(S.intonationAccuracyPct)),children:[S.intonationAccuracyPct,"%"]})}),r.jsx("td",{style:Q.tdRight,children:r.jsxs("span",{style:Q.badge(mt(S.perfectHitPct)),children:[S.perfectHitPct,"%"]})}),r.jsxs("td",{style:Q.tdRight,children:[S.lowestNote,"–",S.highestNote]})]},B))})]})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.pitchAccuracy","Pitch accuracy")]}),r.jsxs("table",{style:Q.table,children:[r.jsx("thead",{children:r.jsxs("tr",{children:[r.jsx("th",{style:Q.th,children:f("vocalReport.metric","Metric")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.value","Value")}),r.jsx("th",{style:Q.th,children:f("vocalReport.description","Description")})]})}),r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.meanAbsDev","Mean abs. deviation")}),r.jsxs("td",{style:Q.tdRight,children:[T.avgCentDeviation,r.jsxs("span",{style:Q.kpiUnit,children:[" ",$]})]}),r.jsx("td",{style:Q.td,children:f("vocalReport.meanAbsDevDesc","Average distance from the target pitch.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.medianDev","Median deviation")}),r.jsxs("td",{style:Q.tdRight,children:[T.medianCentDeviation,r.jsxs("span",{style:Q.kpiUnit,children:[" ",$]})]}),r.jsx("td",{style:Q.td,children:f("vocalReport.medianDevDesc","Typical deviation, robust to outliers.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.stdDev","Std. deviation")}),r.jsxs("td",{style:Q.tdRight,children:[T.stdDevCents,r.jsxs("span",{style:Q.kpiUnit,children:[" ",$]})]}),r.jsx("td",{style:Q.td,children:f("vocalReport.stdDevDesc","Consistency of pitch (lower = steadier).")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.intonationAccuracyLabel","Intonation accuracy")}),r.jsxs("td",{style:{...Q.tdRight,color:mt(T.intonationAccuracyPct)},children:[T.intonationAccuracyPct,"%"]}),r.jsx("td",{style:Q.td,children:f("vocalReport.intonationAccuracyDesc","Share of frames within tolerance.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.perfectHitRate","Perfect-hit rate")}),r.jsxs("td",{style:{...Q.tdRight,color:mt(T.perfectHitPct)},children:[T.perfectHitPct,"%"]}),r.jsx("td",{style:Q.td,children:f("vocalReport.perfectHitRateDesc","Notes hit dead-on.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.totalPitchSamples","Total pitch samples")}),r.jsx("td",{style:Q.tdRight,children:T.totalPitchPoints.toLocaleString()}),r.jsx("td",{style:Q.td,children:f("vocalReport.totalPitchSamplesDesc","Number of analysed pitch frames.")})]})]})]}),r.jsxs("div",{style:Q.chartWrap,children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.deviationDistribution","Deviation distribution")}),r.jsx("div",{style:{height:220},children:r.jsx(ie.NiceChart,{width:860,height:220,stacked:!0,showLegend:!1,categories:G.map(S=>S.centRange),series:Ks(G.map(S=>`${W} (${S.centRange})`),G.map(S=>S.count),G.map(S=>Xh(S.centRange)))})})]}),r.jsxs("div",{style:Q.row,children:[r.jsxs("div",{style:{...Q.chartWrap,...Q.half},children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.hitClassification","Hit classification")}),r.jsx("div",{style:{height:220},children:r.jsx(ie.NicePieChart,{width:400,height:260,data:Y.map(S=>({label:S.name,value:Ut(S.value),color:S.fill}))})})]}),r.jsxs("div",{style:{...Q.chartWrap,...Q.half},children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.performanceProfile","Performance profile")}),r.jsx("div",{style:{height:220},children:r.jsx(ie.NiceChart,{width:400,height:220,showLegend:!1,categories:ee.map(S=>S.metric),series:[{name:f("vocalReport.performanceProfile","Performance profile"),type:"radar",color:"var(--nice-info, #3b82f6)",data:ee.map(S=>Ut(S.value))},{name:"100%",type:"radar",color:"transparent",data:ee.map(S=>S.max)}]})})]})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.pitchTracking","Pitch tracking")]}),r.jsxs("div",{style:Q.chartWrap,children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.sungVsExpected","Sung vs expected")}),r.jsx("div",{style:{height:260},children:r.jsx(ie.NiceChart,{width:860,height:230,categories:Zs(V.map(S=>S.t)),series:[{name:f("vocalReport.expected","Expected"),type:"line",color:"var(--nice-success, #22c55e)",data:V.map(S=>Ut(S.expected))},{name:f("vocalReport.sung","Sung"),type:"line",color:"var(--nice-info, #3b82f6)",data:V.map(S=>Ut(S.sung))}]})})]}),r.jsxs("div",{style:Q.chartWrap,children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.rollingAccuracy","Rolling accuracy")}),r.jsx("div",{style:{height:180},children:r.jsx(ie.NiceChart,{width:860,height:180,showLegend:!1,categories:Zs(K.map(S=>S.t)),series:[{name:f("vocalReport.rollingAccuracy","Rolling accuracy"),type:"area",color:"var(--nice-accent, #8b5cf6)",data:K.map(S=>Ut(S.accuracy))}]})})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.vocalRange","Vocal range")]}),r.jsxs("div",{style:Q.row,children:[r.jsx("div",{style:Q.half,children:r.jsx("table",{style:Q.table,children:r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.lowestNote","Lowest note")}),r.jsx("td",{style:Q.tdRight,children:f("vocalReport.hz","{lowestNote} ({lowestHz} Hz)").replace("{lowestNote}",String(T.lowestNote)).replace("{lowestHz}",String(T.lowestHz))})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.highestNote","Highest note")}),r.jsx("td",{style:Q.tdRight,children:f("vocalReport.hz2","{highestNote} ({highestHz} Hz)").replace("{highestNote}",String(T.highestNote)).replace("{highestHz}",String(T.highestHz))})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.rangeLabel","Range")}),r.jsxs("td",{style:Q.tdRight,children:[T.rangeInSemitones," ",f("vocalReport.semitones","semitones")]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.tessitura","Tessitura")}),r.jsxs("td",{style:Q.tdRight,children:[T.tessituraLow," — ",T.tessituraHigh]})]})]})})}),r.jsxs("div",{style:{...Q.chartWrap,...Q.half},children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.chromagram","Chromagram")}),r.jsx("div",{style:{height:180},children:r.jsx(ie.NiceChart,{width:400,height:180,showLegend:!1,categories:O.map(S=>S.note),series:[{name:f("vocalReport.usagePct","Usage %"),type:"bar",color:"var(--nice-primary, #6366f1)",data:O.map(S=>Ut(S.pct))}]})})]})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.vibratoStability","Vibrato & stability")]}),r.jsxs("div",{style:Q.row,children:[r.jsx("div",{style:Q.half,children:r.jsx("table",{style:Q.table,children:r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.vibratoDetected","Vibrato detected")}),r.jsx("td",{style:Q.tdRight,children:r.jsx("span",{style:Q.badge(T.vibrato.detected?"var(--nice-success, #22c55e)":"var(--nice-text-muted, #64748b)"),children:T.vibrato.detected?f("vocalReport.yes","Yes"):f("vocalReport.no","No")})})]}),T.vibrato.detected&&r.jsxs(r.Fragment,{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.avgRate","Avg. rate")}),r.jsxs("td",{style:Q.tdRight,children:[T.vibrato.avgRateHz," Hz"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.avgExtent","Avg. extent")}),r.jsxs("td",{style:Q.tdRight,children:["±",T.vibrato.avgExtentCents," ",$]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.regularity","Regularity")}),r.jsxs("td",{style:Q.tdRight,children:[T.vibrato.regularityPct,"%"]})]})]})]})})}),r.jsx("div",{style:Q.half,children:r.jsx("table",{style:Q.table,children:r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.jitter","Jitter")}),r.jsxs("td",{style:Q.tdRight,children:[T.jitterPct,"%"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.vocalPresence","Vocal presence")}),r.jsxs("td",{style:Q.tdRight,children:[T.shimmerProxy,"%"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.avgOnsetDev","Avg. onset deviation")}),r.jsxs("td",{style:Q.tdRight,children:[T.avgOnsetDeviationMs," ms"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.rhythmStability","Rhythm stability")}),r.jsx("td",{style:Q.tdRight,children:r.jsxs("span",{style:Q.badge(mt(T.rhythmStabilityPct)),children:[T.rhythmStabilityPct,"%"]})})]})]})})})]}),T.verseMetrics.length>0&&r.jsxs(r.Fragment,{children:[r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.verseBreakdown","Per-verse breakdown")]}),r.jsxs("div",{style:Q.chartWrap,children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.accuracyByVerse","Accuracy by verse")}),r.jsx("div",{style:{height:200},children:r.jsx(ie.NiceChart,{width:860,height:200,stacked:!0,showLegend:!1,categories:U.map(S=>S.verse),series:Ks(U.map(S=>`${C} (${S.verse})`),U.map(S=>S.accuracy),U.map(S=>Hs(S.label)))})})]}),r.jsxs("table",{style:Q.table,children:[r.jsx("thead",{children:r.jsxs("tr",{children:[r.jsx("th",{style:Q.th,children:f("vocalReport.verse","Verse")}),r.jsx("th",{style:Q.th,children:f("vocalReport.rating","Rating")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.hitPct","Hit %")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.avgDeviation","Avg. dev.")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.notes","Notes")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.notesHit","Hit")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.comboBonus","Combo bonus")})]})}),r.jsx("tbody",{children:T.verseMetrics.map((S,B)=>r.jsxs("tr",{children:[r.jsxs("td",{style:Q.td,children:[f("vocalReport.verse","Verse")," ",S.verseIndex+1]}),r.jsx("td",{style:Q.td,children:r.jsx("span",{style:Q.badge(Hs(S.label)),children:S.label})}),r.jsxs("td",{style:Q.tdRight,children:[(S.hitFraction*100).toFixed(1),"%"]}),r.jsxs("td",{style:Q.tdRight,children:[S.avgCentDeviation," ¢"]}),r.jsx("td",{style:Q.tdRight,children:S.noteCount}),r.jsx("td",{style:Q.tdRight,children:S.notesHit}),r.jsxs("td",{style:Q.tdRight,children:["+",S.comboBonus]})]},B))})]})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.scoringConfig","Scoring configuration")]}),r.jsxs("table",{style:Q.table,children:[r.jsx("thead",{children:r.jsxs("tr",{children:[r.jsx("th",{style:Q.th,children:f("vocalReport.parameter","Parameter")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.value","Value")}),r.jsx("th",{style:Q.th,children:f("vocalReport.description","Description")})]})}),r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.difficultyLevel","Difficulty level")}),r.jsx("td",{style:Q.tdRight,children:T.difficulty}),r.jsx("td",{style:Q.td,children:f("vocalReport.difficultyLevelDesc","Affects tolerance and multiplier.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.semitoneTolerance","Semitone tolerance")}),r.jsx("td",{style:Q.tdRight,children:A.semitoneTolerance}),r.jsx("td",{style:Q.td,children:f("vocalReport.semitoneToleranceDesc","Pitch window counted as a hit.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.preWindow","Pre window")}),r.jsxs("td",{style:Q.tdRight,children:[A.preWindow," s"]}),r.jsx("td",{style:Q.td,children:f("vocalReport.preWindowDesc","Lead-in time before a note.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.postExtra","Post extra")}),r.jsxs("td",{style:Q.tdRight,children:[A.postExtra," s"]}),r.jsx("td",{style:Q.td,children:f("vocalReport.postExtraDesc","Grace time after a note.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.difficultyMultiplier","Difficulty multiplier")}),r.jsxs("td",{style:Q.tdRight,children:[A.difficultyMult,"×"]}),r.jsx("td",{style:Q.td,children:f("vocalReport.difficultyMultiplierDesc","Score scaling for difficulty.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.songBpm","Song BPM")}),r.jsx("td",{style:Q.tdRight,children:T.songBpm}),r.jsx("td",{style:Q.td,children:f("vocalReport.songBpmDesc","Tempo used for note timing.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.totalNotes","Total notes")}),r.jsx("td",{style:Q.tdRight,children:P}),r.jsx("td",{style:Q.td,children:f("vocalReport.totalNotesDesc","Number of scored notes in the song.")})]})]})]}),w.some(S=>S.micSettings)&&r.jsxs(r.Fragment,{children:[r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.micConfig","Microphone configuration")]}),w.map((S,B)=>S.micSettings&&r.jsxs("div",{style:{marginBottom:16},children:[w.length>1&&r.jsx("h4",{style:{color:S.playerColor,margin:"0 0 8px",fontSize:14},children:S.playerName}),r.jsxs("table",{style:Q.table,children:[r.jsx("thead",{children:r.jsxs("tr",{children:[r.jsx("th",{style:Q.th,children:f("vocalReport.setting","Setting")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.value","Value")})]})}),r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.device","Device")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.deviceLabel||S.micSettings.deviceId})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.pitchAlgorithm","Pitch algorithm")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.algorithm})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.inputGain","Input gain")}),r.jsxs("td",{style:Q.tdRight,children:[S.micSettings.gain,"×"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.rmsThreshold","RMS threshold")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.rmsThreshold})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.pitchThreshold","Pitch threshold")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.pitchThreshold})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.smoothingWindow","Smoothing window")}),r.jsxs("td",{style:Q.tdRight,children:[S.micSettings.smoothingWindow," ",f("vocalReport.frames","frames")]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.hysteresisFrames","Hysteresis frames")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.hysteresisFrames})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.hanningWindow","Hanning window")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.useHanning?f("vocalReport.enabled","Enabled"):f("vocalReport.disabled","Disabled")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.latencyOffset","Latency offset")}),r.jsxs("td",{style:Q.tdRight,children:[S.micSettings.latencyOffsetMs," ms"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.monitor","Monitor")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.monitorEnabled?`${f("vocalReport.on","On")} (${Math.round(S.micSettings.monitorVolume*100)}%)`:f("vocalReport.off","Off")})]})]})]})]},B))]}),r.jsx("div",{style:Q.footer,children:r.jsxs("p",{children:[f("vocalReport.footerGenerated","Report generated")," ·"," ",T.timestamp.replace(/[-:T.Z]/g,"").slice(0,14)]})})]})]})},Jh="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100'%3E%3Crect width='100' height='100' fill='%23334155'/%3E%3Ccircle cx='42' cy='64' r='8' fill='%2394a3b8'/%3E%3Crect x='48' y='34' width='3' height='32' fill='%2394a3b8'/%3E%3C/svg%3E";function ep(e){if(!e)return"";const t=Math.floor(e/60),n=Math.round(e%60);return`${t}:${n.toString().padStart(2,"0")}`}function Qs(e){return Array.from(new Set(e.filter(t=>!!t))).sort((t,n)=>t.localeCompare(n))}const tp=Object.assign(d.memo(({song:e,index:t,active:n,coverUrl:a,topScore:s,selected:i,multiSelect:o,disabled:l,t:c,onPlay:u,onToggleSelect:h,onFocusRow:p})=>{const g=()=>{o?h(e.id):l||u==null||u(e)};return r.jsxs("div",{className:`nice-ksb-row${i?" nice-ksb-row--selected":""}${n?" nice-ksb-row--active":""}`,role:"option","aria-selected":i,"data-ksb-index":t,tabIndex:n?0:-1,onClick:g,onFocus:()=>p(t),onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.preventDefault(),g())},children:[o&&r.jsx("input",{type:"checkbox",className:"nice-ksb-row__check",checked:i,onChange:()=>h(e.id),onClick:y=>y.stopPropagation(),"aria-label":e.title}),r.jsx("img",{className:"nice-ksb-row__cover",src:a,alt:"",loading:"lazy"}),r.jsxs("div",{className:"nice-ksb-row__main",children:[r.jsx("div",{className:"nice-ksb-row__title",children:e.title}),r.jsx("div",{className:"nice-ksb-row__artist",children:e.artist||"—"})]}),r.jsxs("div",{className:"nice-ksb-row__meta",children:[e.genre&&r.jsx("span",{className:"nice-ksb-badge",children:e.genre}),e.year&&r.jsx("span",{className:"nice-ksb-badge",children:e.year}),e.durationSec?r.jsx("span",{className:"nice-ksb-badge",children:ep(e.durationSec)}):null,e.externalSource&&r.jsx("span",{className:"nice-ksb-badge nice-ksb-badge--src",children:e.externalSource}),s&&r.jsxs("span",{className:"nice-ksb-badge nice-ksb-badge--score",title:s.playerName,children:[r.jsx(F.NtdTrophy,{size:11})," ",s.score.toLocaleString()]})]}),!o&&r.jsxs("button",{type:"button",className:"nice-ksb-row__play",disabled:l,onClick:y=>{y.stopPropagation(),u==null||u(e)},children:[r.jsx(F.NtdPlay,{size:13})," ",c("karaokeBrowser.play","Play")]})]})}),{displayName:"NiceKaraokeSongRow"}),np={artist:"Artist",title:"Title",year:"Year",genre:"Genre"},rp=({songs:e,fetchSongs:t,loading:n=!1,getCover:a,getTopScore:s,onPlay:i,onSelect:o,multiSelect:l=!1,maxSelections:c=0,showSidebar:u=!0,enableGamepad:h=!0,disabled:p=!1,disabledReason:g,t:y,className:m,style:x,id:b,accessMode:f,"data-testid":k})=>{const{t:v}=xe(),w=y??v,[R,M]=d.useState(""),[j,T]=d.useState(""),[P,A]=d.useState(""),[I,L]=d.useState(""),[N,_]=d.useState("artist"),[ee,Y]=d.useState("asc"),[O,U]=d.useState({type:"all"}),[V,K]=d.useState(new Set),[G,W]=d.useState([]),[C,$]=d.useState(!1);d.useEffect(()=>{const he=setTimeout(()=>T(R),300);return()=>clearTimeout(he)},[R]),d.useEffect(()=>{if(e||!t)return;let he=!1;return $(!0),Promise.resolve(t({searchQuery:j.trim()||void 0,genres:P?[P]:void 0,languages:I?[I]:void 0})).then(we=>!he&&W(we)).catch(()=>!he&&W([])).finally(()=>!he&&$(!1)),()=>{he=!0}},[e,t,j,P,I]);const S=e??G,B=d.useMemo(()=>Qs(S.map(he=>he.genre)),[S]),H=d.useMemo(()=>Qs(S.map(he=>he.language)),[S]),z=d.useMemo(()=>{let he=S;const we=j.trim().toLowerCase();we&&(he=he.filter(Ne=>`${Ne.title} ${Ne.artist}`.toLowerCase().includes(we))),P&&(he=he.filter(Ne=>Ne.genre===P)),I&&(he=he.filter(Ne=>Ne.language===I)),O.type==="genre"&&(he=he.filter(Ne=>Ne.genre===O.value)),O.type==="language"&&(he=he.filter(Ne=>Ne.language===O.value));const je=ee==="asc"?1:-1;return[...he].sort((Ne,Ee)=>{const Ye=Ne[N]??"",ue=Ee[N]??"";return typeof Ye=="number"&&typeof ue=="number"?(Ye-ue)*je:String(Ye).localeCompare(String(ue))*je})},[S,j,P,I,O,N,ee]),Z=he=>{K(we=>{const je=new Set(we);return je.has(he)?je.delete(he):(c===0||je.size<c)&&je.add(he),je})},E=()=>{const he=S.filter(we=>V.has(we.id));o==null||o({songs:he})},q=n||C,X=he=>{he===N?Y(we=>we==="asc"?"desc":"asc"):(_(he),Y("asc"))},re=d.useRef(null),[oe,se]=d.useState(0),D=d.useRef(0),J=d.useRef(z);J.current=z,d.useEffect(()=>{se(he=>{const we=Math.min(Math.max(0,he),Math.max(0,z.length-1));return D.current=we,we})},[z.length]);const ae=d.useCallback(he=>{var je;const we=(je=re.current)==null?void 0:je.querySelector(`[data-ksb-index="${he}"]`);we==null||we.focus(),we==null||we.scrollIntoView({block:"nearest"})},[]),ce=d.useCallback(he=>{D.current=he,se(he)},[]),le=d.useCallback((he,we=!0)=>{const je=J.current.length;if(je===0)return;const Ne=Math.min(je-1,Math.max(0,he));D.current=Ne,se(Ne),we&&requestAnimationFrame(()=>ae(Ne))},[ae]),ne=d.useCallback(he=>le(D.current+he),[le]),pe=he=>{const we=J.current[he];we&&(l?Z(we.id):p||i==null||i(we))},fe=he=>{switch(he.key){case"ArrowDown":he.preventDefault(),ne(1);break;case"ArrowUp":he.preventDefault(),ne(-1);break;case"Home":he.preventDefault(),le(0);break;case"End":he.preventDefault(),le(J.current.length-1);break;case"PageDown":he.preventDefault(),ne(5);break;case"PageUp":he.preventDefault(),ne(-5);break}},me=ke.useGamepad({enabled:h,actions:{navUp:{button:"DpadUp",onPress:()=>ne(-1),repeatDelay:350,repeatRate:110},navDown:{button:"DpadDown",onPress:()=>ne(1),repeatDelay:350,repeatRate:110},stickUp:{axis:"LeftY",axisDirection:"negative",onPress:()=>ne(-1),repeatDelay:350,repeatRate:130},stickDown:{axis:"LeftY",axisDirection:"positive",onPress:()=>ne(1),repeatDelay:350,repeatRate:130},select:{button:"A",onPress:()=>pe(D.current)},confirm:{button:"Start",onPress:()=>{l&&E()}}}});return f==="hidden"?null:r.jsxs("div",{className:`nice-ksb${m?` ${m}`:""}`,style:x,id:b,"data-testid":k,children:[u&&r.jsxs("aside",{className:"nice-ksb__sidebar",children:[r.jsxs("button",{type:"button",className:`nice-ksb__node${O.type==="all"?" nice-ksb__node--active":""}`,onClick:()=>U({type:"all"}),children:[r.jsx(F.NtdMusic,{size:14})," ",w("karaokeBrowser.allSongs","All songs")," (",S.length,")"]}),B.length>0&&r.jsxs("div",{className:"nice-ksb__facet",children:[r.jsx("div",{className:"nice-ksb__facet-title",children:w("karaokeBrowser.genres","Genres")}),B.map(he=>r.jsx("button",{type:"button",className:`nice-ksb__node${O.type==="genre"&&O.value===he?" nice-ksb__node--active":""}`,onClick:()=>U({type:"genre",value:he}),children:he},he))]}),H.length>0&&r.jsxs("div",{className:"nice-ksb__facet",children:[r.jsx("div",{className:"nice-ksb__facet-title",children:w("karaokeBrowser.languages","Languages")}),H.map(he=>r.jsx("button",{type:"button",className:`nice-ksb__node${O.type==="language"&&O.value===he?" nice-ksb__node--active":""}`,onClick:()=>U({type:"language",value:he}),children:he},he))]})]}),r.jsxs("div",{className:"nice-ksb__main",children:[r.jsxs("div",{className:"nice-ksb__toolbar",children:[r.jsx("input",{className:"nice-ksb__search",type:"search",value:R,placeholder:w("karaokeBrowser.search","Search title or artist…"),onChange:he=>M(he.target.value)}),r.jsx("div",{className:"nice-ksb__sort",children:["artist","title","year","genre"].map(he=>r.jsxs("button",{type:"button",className:`nice-ksb__sort-btn${N===he?" nice-ksb__sort-btn--active":""}`,onClick:()=>X(he),children:[w(`karaokeBrowser.sort.${he}`,np[he]??he),N===he&&(ee==="asc"?r.jsx(F.NtdChevronUp,{size:12}):r.jsx(F.NtdChevronDown,{size:12}))]},he))}),r.jsxs("span",{className:`nice-ksb__navhint${me.connected?" nice-ksb__navhint--pad":""}`,title:w("karaokeBrowser.navHint","Navigate with ↑ ↓ or the D-pad · Enter / A to play"),children:[me.connected?r.jsx(F.NtdGamepad,{size:14}):r.jsx(F.NtdMove,{size:14}),r.jsx("span",{className:"nice-ksb__navhint-keys",children:me.connected?"D-pad · A":"↑ ↓ · Enter"})]})]}),p&&g&&r.jsx("div",{className:"nice-ksb__disabled",children:g}),r.jsx("div",{className:"nice-ksb__list",role:"listbox","aria-multiselectable":l,"aria-label":w("karaokeBrowser.songs","Songs"),ref:re,onKeyDown:fe,children:q?r.jsx("div",{className:"nice-ksb__empty",children:w("karaokeBrowser.loading","Loading…")}):z.length===0?r.jsx("div",{className:"nice-ksb__empty",children:w("karaokeBrowser.noResults","No songs found")}):z.map((he,we)=>r.jsx(tp,{song:he,index:we,active:we===oe,coverUrl:(a==null?void 0:a(he))||he.coverImage||he.externalCoverUrl||he.coverPath||Jh,topScore:s==null?void 0:s(he),selected:V.has(he.id),multiSelect:l,disabled:p,t:w,onPlay:i,onToggleSelect:Z,onFocusRow:ce},he.id))}),l&&r.jsxs("div",{className:"nice-ksb__footer",children:[r.jsxs("span",{children:[V.size,c>0?` / ${c}`:""," ",w("karaokeBrowser.selected","selected")]}),r.jsx("button",{type:"button",className:"nice-ksb__confirm",disabled:V.size===0,onClick:E,children:w("karaokeBrowser.confirm","Add selected")})]})]})]})};function ll(e,t,n=50,a=30){const s=Math.round(e/1e3*t),i=Math.round(n/1e3*t),o=Math.max(1,Math.round(a/1e3*t)),l=new Float32Array(s);for(let c=0;c<o;c++){const u=.5*(1-Math.cos(2*Math.PI*c/(o-1))),h=i+c-Math.floor(o/2);h>=0&&h<s&&(l[h]=u)}return l}function Js(e,t,n=1e3){const a=Math.max(1,Math.round(t/n)),s=Math.ceil(e.length/a),i=new Float32Array(s);for(let l=0;l<s;l++){const c=l*a,u=Math.min(e.length,c+a);let h=0;for(let p=c;p<u;p++)h+=Math.abs(e[p]);i[l]=h/(u-c||1)}let o=0;for(let l=0;l<i.length;l++)i[l]>o&&(o=i[l]);if(o>0)for(let l=0;l<i.length;l++)i[l]=i[l]/o;return{env:i,factor:a}}function ap(e,t){const n=e.length,a=t.length;if(n===0||a===0)return 0;let s={lag:0,score:-1/0};const i=Math.min(2e3,a);for(let o=-i;o<=i;o++){let l=0,c=0,u=0;for(let g=0;g<n;g++){const y=g+o+Math.floor((a-n)/2);if(y<0||y>=a)continue;const m=e[g],x=t[y];l+=m*x,c+=m*m,u+=x*x}const h=Math.sqrt(Math.max(1e-9,c*u)),p=l/h;p>s.score&&(s={lag:o,score:p})}return s.lag}function cl(e,t,n=50,a=30){try{const s=Math.max(300,Math.round(e.length/t*1e3)),i=ll(s,t,n,a),o=Js(e,t,1e3),l=Js(i,t,1e3),u=ap(l.env,o.env)*1e3/1e3;return Math.round(u)}catch{return null}}const sp=({deviceId:e,initialOffsetMs:t=null,onSave:n,onClose:a,rounds:s=3,t:i,className:o,style:l,id:c,accessMode:u,"data-testid":h})=>{const{t:p}=xe(),g=i??p,[y,m]=d.useState(null),[x,b]=d.useState(t),[f,k]=d.useState(!1),[v,w]=d.useState([]),[R,M]=d.useState(0),[j,T]=d.useState(!1),P=d.useRef(!1);d.useEffect(()=>{b(t??null)},[t,e]);const A=async()=>{const _=await navigator.mediaDevices.getUserMedia({audio:{deviceId:e?{exact:e}:void 0,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}}),ee=new AudioContext,Y=ee.sampleRate,O=ee.createMediaStreamSource(_),U=ee.createScriptProcessor(2048,1,1);O.connect(U),U.connect(ee.destination);const V=1200,K=Math.round(V/1e3*Y),G=new Float32Array(K);let W=0,C=!1;U.onaudioprocess=Z=>{if(C)return;const E=Z.inputBuffer.getChannelData(0),q=Math.min(E.length,K-W);q>0&&(G.set(E.subarray(0,q),W),W+=q),W>=K&&(C=!0)},await new Promise(Z=>setTimeout(Z,80));const $=new AudioContext,S=$.createOscillator(),B=$.createGain();S.type="sine",S.frequency.value=1e3,B.gain.value=1e-4,S.connect(B),B.connect($.destination);const H=$.currentTime+.05;B.gain.setValueAtTime(1e-4,H-.01),B.gain.linearRampToValueAtTime(1,H),B.gain.linearRampToValueAtTime(1e-4,H+.06),S.start(H-.02),S.stop(H+.1),await new Promise(Z=>{const E=()=>{if(C||W>=K){Z();return}setTimeout(E,50)};setTimeout(()=>{C=!0,Z()},V+500),E()}),U.onaudioprocess=null;try{U.disconnect()}catch{}try{O.disconnect()}catch{}try{await $.close()}catch{}try{await ee.close()}catch{}_.getTracks().forEach(Z=>Z.stop());const z=G.subarray(0,W);return cl(z,Y,130,30)},I=async()=>{if(!P.current){P.current=!0,T(!0),m(g("latencyCalibrator.requestingMic","Requesting microphone — click allow if prompted")),b(null),w([]),M(0);try{const _=[];for(let Y=0;Y<s;Y++){m(`${g("latencyCalibrator.playingTone","Playing test tone and recording…")} (${Y+1}/${s})`),M(Math.round(Y/s*100));const O=await A();O!==null&&(_.push(Math.max(-500,Math.min(2e3,Math.round(O)))),w([..._])),Y<s-1&&await new Promise(U=>setTimeout(U,400))}if(M(100),_.length===0){m(g("latencyCalibrator.noSignal","No signal detected — try louder or check the microphone"));return}let ee;if(_.length>=3){const O=[..._].sort((U,V)=>U-V).slice(1,-1);ee=Math.round(O.reduce((U,V)=>U+V,0)/O.length)}else ee=Math.round(_.reduce((Y,O)=>Y+O,0)/_.length);b(ee),m(`${g("latencyCalibrator.measured","Measured")} ~${ee} ms (${_.length}: ${_.join(", ")} ms)`)}catch(_){m(`${g("latencyCalibrator.calibrationError","Calibration error: ")}${_ instanceof Error?_.message:String(_)}`)}finally{P.current=!1,T(!1)}}},L=async()=>{if(!(x===null||!n)){k(!0);try{await n(Math.round(x)),m(g("latencyCalibrator.saved","Saved"))}catch(_){m(`${g("latencyCalibrator.saveError","Save error: ")}${String(_)}`)}finally{k(!1)}}},N={padding:"7px 16px",border:"none",borderRadius:8,cursor:"pointer",fontWeight:600};return u==="hidden"?null:r.jsxs("div",{className:`nice-latency-calibrator${o?` ${o}`:""}`,style:{padding:12,color:"var(--nice-text, inherit)",...l},id:c,"data-testid":h,children:[r.jsxs("h5",{style:{margin:"0 0 8px",display:"flex",alignItems:"center",gap:6},children:[r.jsx(F.NtdSettings,{size:16})," ",g("latencyCalibrator.title","Latency calibrator — microphone")]}),r.jsxs("div",{style:{fontSize:12,color:"var(--nice-text-muted, #94a3b8)"},children:[g("latencyCalibrator.device","Device"),": ",r.jsx("small",{children:e||"—"})]}),r.jsxs("div",{style:{marginTop:8,display:"flex",gap:8},children:[r.jsx("button",{type:"button",onClick:I,disabled:j,style:{...N,background:"var(--nice-accent, #3b82f6)",color:"var(--nice-text-on-primary, #fff)"},children:g("latencyCalibrator.calibrate","Calibrate")}),r.jsx("button",{type:"button",onClick:()=>{b(null),m(null),w([]),M(0)},style:{...N,background:"var(--nice-bg-tertiary)",color:"var(--nice-text, #e2e8f0)"},children:g("latencyCalibrator.clear","Clear")})]}),j&&r.jsx("div",{style:{marginTop:8,height:6,borderRadius:3,background:"var(--nice-bg-tertiary)",overflow:"hidden"},children:r.jsx("div",{style:{height:"100%",width:`${R}%`,background:"var(--nice-accent, #3b82f6)",transition:"width 0.2s"}})}),v.length>0&&r.jsxs("div",{style:{marginTop:6,fontSize:12,color:"var(--nice-text-muted, #94a3b8)"},children:[g("latencyCalibrator.rounds","Rounds"),": ",v.join(", ")," ms"]}),r.jsxs("div",{style:{marginTop:8,fontSize:13},children:[r.jsxs("div",{children:[g("latencyCalibrator.status","Status"),": ",y??g("latencyCalibrator.none","none")]}),r.jsxs("div",{children:[g("latencyCalibrator.measuredOffset","Measured offset"),":"," ",x!==null?r.jsxs("strong",{children:[x," ms"]}):"—"]})]}),r.jsxs("div",{style:{marginTop:12,display:"flex",gap:8},children:[n&&r.jsx("button",{type:"button",onClick:L,disabled:x===null||f,style:{...N,background:"var(--nice-success, #22c55e)",color:"var(--nice-text-on-primary, #fff)",opacity:x===null||f?.5:1},children:g("latencyCalibrator.save","Save")}),a&&r.jsx("button",{type:"button",onClick:a,style:{...N,background:"transparent",border:"1px solid var(--nice-border, #334155)",color:"var(--nice-text, #e2e8f0)"},children:g("latencyCalibrator.close","Close")})]})]})},ip=e=>[{value:"normal",label:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(F.NtdMicrophone,{size:14})," ",e("karaokeSetup.modeMic","Mic")]})},{value:"pad",label:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(F.NtdGamepad,{size:14})," ",e("karaokeSetup.modePad","Pad")]})},{value:"demo",label:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(F.NtdStopwatch,{size:14})," ",e("karaokeSetup.modeDemo","Demo")]})}],dl=({players:e,defaultPlayers:t,onPlayersChange:n,gameMode:a="normal",onGameModeChange:s,gameModes:i,difficulty:o="normal",onDifficultyChange:l,audioInputs:c,maxPlayers:u=4,onCalibrate:h,t:p,className:g,style:y,id:m,accessMode:x,"data-testid":b})=>{const{t:f}=xe(),k=p??f,v=d.useMemo(()=>i??ip(k),[i,k]),[w,R]=ke.useControllableState({value:e,defaultValue:t,fallbackValue:[],onChange:n,componentName:"NiceKaraokeSetupPanel"}),[M,j]=d.useState([]);d.useEffect(()=>{var ee,Y,O;if(c||!((ee=navigator.mediaDevices)!=null&&ee.enumerateDevices))return;let N=!1;const _=()=>navigator.mediaDevices.enumerateDevices().then(U=>!N&&j(U.filter(V=>V.kind==="audioinput"))).catch(()=>{});return _(),(O=(Y=navigator.mediaDevices).addEventListener)==null||O.call(Y,"devicechange",_),()=>{var U,V;N=!0,(V=(U=navigator.mediaDevices).removeEventListener)==null||V.call(U,"devicechange",_)}},[c]);const T=c??M,P=d.useMemo(()=>[{value:"",label:k("karaokeSetup.noMic","No microphone")},...T.map((N,_)=>({value:N.deviceId,label:N.label||`${k("karaokeSetup.microphone","Microphone")} ${_+1}`}))],[T,k]),A=(N,_)=>R(w.map(ee=>ee.id===N?{...ee,..._}:ee)),I=()=>{if(w.length>=u)return;const N=w.reduce((_,ee)=>Math.max(_,ee.id),0)+1;R([...w,{id:N,name:`${k("karaokeSetup.player","Player")} ${w.length+1}`,color:Xe[w.length%Xe.length],micId:null}])},L=N=>R(w.filter(_=>_.id!==N));return x==="hidden"?null:r.jsxs("div",{className:`nice-karaoke-setup${g?` ${g}`:""}`,style:{display:"flex",flexDirection:"column",gap:16,...y},id:m,"data-testid":b,children:[r.jsxs("div",{style:{display:"flex",gap:24,flexWrap:"wrap"},children:[r.jsxs("div",{children:[r.jsx("div",{style:{fontSize:12,fontWeight:600,marginBottom:6,color:"var(--nice-text-muted, #94a3b8)"},children:k("karaokeSetup.mode","Game mode")}),r.jsx(ie.NiceSegmentedControl,{options:v,value:a,onChange:N=>s==null?void 0:s(N)})]}),r.jsxs("div",{children:[r.jsx("div",{style:{fontSize:12,fontWeight:600,marginBottom:6,color:"var(--nice-text-muted, #94a3b8)"},children:k("karaokeSetup.difficulty","Difficulty")}),r.jsx(ie.NiceSegmentedControl,{options:[{value:"easy",label:k("karaokeSetup.easy","Easy")},{value:"normal",label:k("karaokeSetup.normal","Normal")},{value:"hard",label:k("karaokeSetup.hard","Hard")}],value:o,onChange:N=>l==null?void 0:l(N)})]})]}),r.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:10},children:[r.jsxs("div",{style:{fontSize:12,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)"},children:[k("karaokeSetup.players","Players")," (",w.length,"/",u,")"]}),w.map(N=>r.jsx(ie.NiceCard,{children:r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"},children:[r.jsx(ie.NiceColorPicker,{value:N.color||Xe[0],onChange:_=>A(N.id,{color:_})}),r.jsx("div",{style:{flex:"1 1 160px",minWidth:140},children:r.jsx(ie.NiceTextInput,{value:N.name,onChange:_=>A(N.id,{name:_}),placeholder:k("karaokeSetup.playerName","Player name"),size:"sm"})}),r.jsx("div",{style:{flex:"1 1 180px",minWidth:150},children:r.jsx(ie.NiceSelect,{options:P,value:N.micId??"",onChange:_=>A(N.id,{micId:(typeof _=="string"?_:_[0])||null}),placeholder:k("karaokeSetup.selectMic","Microphone"),size:"sm"})}),h&&N.micId&&r.jsxs(ie.NiceButton,{variant:"ghost",size:"sm",onClick:()=>h(N.micId),children:[r.jsx(F.NtdSettings,{size:14})," ",k("karaokeSetup.calibrate","Calibrate")]}),r.jsx(ie.NiceButton,{variant:"danger",size:"sm",onClick:()=>L(N.id),"aria-label":k("karaokeSetup.remove","Remove"),children:r.jsx(F.NtdClose,{size:14})})]})},N.id)),r.jsx("div",{children:r.jsxs(ie.NiceButton,{variant:"primary",onClick:I,disabled:w.length>=u,children:[r.jsx(F.NtdPlus,{size:14})," ",k("karaokeSetup.addPlayer","Add player")]})})]})]})},op=[],lp=["freeForAll","roundRobin","hostOnly","firstCome"],cp={freeForAll:F.NtdDice,roundRobin:F.NtdRepeat,hostOnly:F.NtdCrown,firstCome:F.NtdLightning},dp={freeForAll:"success",roundRobin:"warning",hostOnly:"info",firstCome:"danger"},ul=({players:e=op,mode:t,defaultMode:n,onModeChange:a,turnTimeSec:s=30,hostIndex:i=0,onActivePlayerChange:o,myPlayerIndex:l,t:c,className:u,style:h,id:p,accessMode:g,"data-testid":y})=>{const{t:m}=xe(),x=c??m,[b,f]=ke.useControllableState({value:t,defaultValue:n,fallbackValue:"freeForAll",onChange:a,componentName:"NiceKaraokeSelectionMode"}),k={freeForAll:x("songSelection.freeForAll","Free for all"),roundRobin:x("songSelection.roundRobin","Round robin"),hostOnly:x("songSelection.hostOnly","Host only"),firstCome:x("songSelection.firstCome","First come")},[v,w]=d.useState(0),[R,M]=d.useState(s),j=d.useRef(null),[T,P]=d.useState(null),[A,I]=d.useState(!1),[L,N]=d.useState(null),_=d.useRef(null),ee=d.useMemo(()=>b==="hostOnly"?i:b==="roundRobin"?v%Math.max(1,e.length):b==="firstCome"?A?-1:L??-1:-1,[b,v,e.length,i,A,L]);d.useEffect(()=>{o==null||o(ee)},[ee,o]),d.useEffect(()=>{if(b!=="roundRobin"||s<=0){j.current&&clearInterval(j.current);return}return M(s),j.current=setInterval(()=>{M(K=>K<=1?(w(G=>G+1),s):K-1)},1e3),()=>{j.current&&clearInterval(j.current)}},[b,s,v]);const Y=d.useCallback(()=>{N(null),I(!1),P(3),_.current&&clearInterval(_.current),_.current=setInterval(()=>{P(K=>K===null||K<=1?(_.current&&clearInterval(_.current),I(!0),null):K-1)},1e3)},[]);d.useEffect(()=>()=>{_.current&&clearInterval(_.current)},[]),d.useEffect(()=>{b!=="firstCome"&&(P(null),I(!1),N(null))},[b]);const O=d.useCallback(()=>{w(K=>K+1),M(s)},[s]),U=K=>{var G;return((G=e[K])==null?void 0:G.name)||`${x("songSelection.player","Player")} ${K+1}`},V=ee>=0&&ee<e.length?e[ee]:null;return g==="hidden"?null:r.jsxs("div",{className:`nice-karaoke-selection-mode${u?` ${u}`:""}`,style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:10,padding:"8px 12px",background:"var(--nice-bg-secondary)",borderRadius:10,border:"1px solid var(--nice-border, #333)",...h},id:p,"data-testid":y,children:[r.jsx("div",{style:{display:"flex",gap:4,flexWrap:"wrap"},children:lp.map(K=>r.jsxs(ie.NiceButton,{size:"sm",variant:b===K?dp[K]:"outline",onClick:()=>f(K),children:[d.createElement(cp[K],{size:14})," ",k[K]]},K))}),b!=="freeForAll"&&b!=="firstCome"&&V&&r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[r.jsxs(ie.NiceBadge,{variant:ee===l?"success":"secondary",children:[r.jsx(F.NtdMicrophone,{size:12})," ",U(ee)]}),ee===l&&r.jsx("span",{style:{color:"var(--nice-success, #4caf50)",fontSize:12,fontWeight:600},children:x("songSelection.yourTurn","Your turn!")})]}),b==="roundRobin"&&s>0&&r.jsx("div",{style:{flex:1,minWidth:120,maxWidth:200},children:r.jsx(ie.NiceProgress,{value:R,max:s,variant:R<=5?"error":R<=10?"warning":"info",showValue:!0,formatValue:K=>`${K}s`})}),b==="roundRobin"&&r.jsxs(ie.NiceButton,{size:"sm",variant:"ghost",onClick:O,children:[x("songSelection.next","Next")," ",r.jsx(F.NtdPlay,{size:12})]}),b==="firstCome"&&r.jsxs(r.Fragment,{children:[T!==null&&r.jsx("div",{style:{fontSize:32,fontWeight:900,color:"var(--nice-error, #f44336)",minWidth:60,textAlign:"center"},children:T}),A&&L===null&&r.jsxs(ie.NiceBadge,{variant:"danger",children:[r.jsx(F.NtdLightning,{size:12})," ",x("songSelection.raceGo","GO! Pick a song!")]}),L!==null&&L<e.length&&r.jsxs(ie.NiceBadge,{variant:"success",children:[r.jsx(F.NtdTrophy,{size:12})," ",U(L)," ",x("songSelection.raceWon","picks!")]}),r.jsx(ie.NiceButton,{size:"sm",variant:T!==null?"secondary":"danger",onClick:Y,disabled:T!==null,children:L!==null?r.jsxs(r.Fragment,{children:[r.jsx(F.NtdRepeat,{size:12})," ",x("songSelection.raceAgain","New race")]}):r.jsxs(r.Fragment,{children:[r.jsx(F.NtdLightning,{size:12})," ",x("songSelection.raceStart","Start race")]})})]})]})};function up(e,t,n,a){return d.useMemo(()=>e==="freeForAll"?!0:e==="firstCome"?t===-1:e==="hostOnly"?a===n:e==="roundRobin"?a===t:!1,[e,t,n,a])}const hp=({players:e,defaultPlayers:t,onPlayersChange:n,gameMode:a,onGameModeChange:s,gameModes:i,difficulty:o,onDifficultyChange:l,audioInputs:c,maxPlayers:u=4,onCalibrate:h,initialSelectionMode:p="freeForAll",turnTimeSec:g=30,hostIndex:y=0,myPlayerIndex:m,onChange:x,variant:b="bar",t:f,className:k,style:v,id:w,accessMode:R,"data-testid":M})=>{const{t:j}=xe(),T=f??j,[P,A]=ke.useControllableState({value:e,defaultValue:t,fallbackValue:[],onChange:n,componentName:"NiceKaraokeSessionJoin"}),[I,L]=d.useState([]);d.useEffect(()=>{var H,z,Z;if(c||!((H=navigator.mediaDevices)!=null&&H.enumerateDevices))return;let S=!1;const B=()=>navigator.mediaDevices.enumerateDevices().then(E=>!S&&L(E.filter(q=>q.kind==="audioinput"))).catch(()=>{});return B(),(Z=(z=navigator.mediaDevices).addEventListener)==null||Z.call(z,"devicechange",B),()=>{var E,q;S=!0,(q=(E=navigator.mediaDevices).removeEventListener)==null||q.call(E,"devicechange",B)}},[c]);const N=c??I,_=N.length===0,ee=P.some(S=>!S.micId),Y=!ee,[O,U]=d.useState(p),[V,K]=d.useState(-1),G=d.useCallback((S,B)=>{x==null||x({selectionMode:S,activePickerIndex:B,allMicsAssigned:Y,noInputDevices:_})},[x,Y,_]),W=d.useCallback(S=>{U(S),G(S,V)},[G,V]),C=d.useCallback(S=>{K(S),G(O,S)},[G,O]),$=d.useMemo(()=>({padding:10,borderRadius:8,fontWeight:700,marginTop:8,textAlign:"center"}),[]);return R==="hidden"?null:r.jsxs("div",{className:`nice-karaoke-session-join${k?` ${k}`:""}`,style:b==="card"?{background:"var(--nice-bg-secondary)",borderRadius:12,padding:16,...v}:v,id:w,"data-testid":M,children:[r.jsx(dl,{players:P,onPlayersChange:A,gameMode:a,onGameModeChange:s,gameModes:i,difficulty:o,onDifficultyChange:l,audioInputs:N,maxPlayers:u,onCalibrate:h,t:T}),_&&r.jsxs("div",{style:{...$,background:"var(--nice-error, #ef4444)",color:"#fff"},children:[T("karaokeSessionJoin.noInputDevices","No microphone detected"),r.jsx("br",{}),r.jsx("span",{style:{fontWeight:400,fontSize:13},children:T("karaokeSessionJoin.noInputDevicesHint","Connect a microphone to sing.")})]}),!_&&ee&&r.jsx("div",{style:{...$,background:"var(--nice-warning, #f59e0b)",color:"var(--nice-text-on-primary, #222)",fontSize:14},children:T("karaokeSessionJoin.assignMicWarning","Assign a microphone to each player.")}),P.length>1&&r.jsx("div",{style:{marginTop:12},children:r.jsx(ul,{players:P,mode:O,onModeChange:W,onActivePlayerChange:C,turnTimeSec:g,hostIndex:y,myPlayerIndex:m,t:T})})]})};function Ve(e,t){var s;const n=((s=t.split(".").pop())==null?void 0:s.toLowerCase())??"",a=n==="otf"?"opentype":n==="woff2"?"woff2":n==="woff"?"woff":"truetype";return{family:e,url:`/fonts/${t}`,format:a}}const pp=[Ve("Belagak","BelagakRegular-dr1zE.otf"),Ve("Big Scratch Brush","BigScratchBrush-PVY9g.ttf"),Ve("Gerhaus","Gerhaus-PK69E.ttf"),Ve("Gerhaus Italic","GerhausItalic-d96l7.ttf"),Ve("Handone Medium","HandoneMedium-nAevO.otf"),Ve("Handson Bold","HandsonBold-9MnrL.otf"),Ve("Kineks Round Bold","KineksRoundBold-7OR34.ttf"),Ve("Kineks Round Light","KineksRoundLight-m2r35.ttf"),Ve("Kineks Round Medium","KineksRoundMedium-drejZ.ttf"),Ve("Kineks Round","KineksRoundRegular-PVRl7.ttf"),Ve("Kineks Round SemiBold","KineksRoundSemiBold-LVWG3.ttf"),Ve("Lemon Jelly","LemonJellyPersonalUse-dEqR.ttf"),Ve("Lemon Milk Bold","LemonMilkBold-gx2B3.otf"),Ve("Lemon Milk Bold Italic","LemonMilkBoldItalic-PKZ3P.otf"),Ve("Lemon Milk Light","LemonMilkLight-owxMq.otf"),Ve("Lemon Milk Light Italic","LemonMilkLightItalic-7BjPE.otf"),Ve("Lemon Milk Medium","LemonMilkMedium-mLZYV.otf"),Ve("Lemon Milk Medium Italic","LemonMilkMediumItalic-d95nl.otf"),Ve("Lemon Milk","LemonMilkRegular-X3XE2.otf"),Ve("Lemon Milk Italic","LemonMilkRegularItalic-L3AEy.otf"),Ve("Pemage","PemageRegular-YqrdO.otf"),Ve("Rosmatika","RosmatikaRegular-BWA45.ttf"),Ve("Scabber","Scabber-q2Mn0.ttf"),Ve("Stylish Calligraphy","StylishCalligraphyDemo-XPZZ.ttf"),Ve("Super Adorable","SuperAdorable-MAvyp.ttf"),Ve("Super Chiby","SuperChiby-BL62V.ttf"),Ve("Super Joyful","SuperJoyful-lxwPq.ttf"),Ve("Super Kindly","SuperKindly-drE8E.ttf"),Ve("Super Meatball","SuperMeatball-Yq1Gy.ttf")],Za="nice2dev-karaoke-display",fp=(function(){return[{value:"Arial",label:"Arial (default)"},{value:"Georgia, serif",label:"Georgia"},{value:"'Courier New', monospace",label:"Courier New"},{value:"'Trebuchet MS', sans-serif",label:"Trebuchet MS"},{value:"Impact, sans-serif",label:"Impact"},...pp.map(e=>({value:e.family,label:e.family}))]})(),hl=[{id:"default",name:"Cyan ? Yellow ? Amber",sungGradient:["#00e5ff","#ffe600","#ffab00"],goldGradient:["var(--nice-warning, #FFD700)","#FFA000","var(--nice-warning, #FFD700)"],glowColor:"rgba(0,229,255,0.6)"},{id:"neon-pink",name:"Neon Pink ? Violet ? Blue",sungGradient:["#ff1493","#9b59b6","var(--nice-primary, #3498db)"],goldGradient:["var(--nice-warning, #FFD700)","#FF69B4","var(--nice-warning, #FFD700)"],glowColor:"rgba(255,20,147,0.6)"},{id:"fire",name:"Red ? Orange ? Yellow",sungGradient:["#ff1744","#ff9100","#ffea00"],goldGradient:["var(--nice-warning, #FFD700)","#FF6D00","var(--nice-warning, #FFD700)"],glowColor:"rgba(255,23,68,0.6)"},{id:"ocean",name:"Deep Blue ? Teal ? Aqua",sungGradient:["#1a237e","#00897b","#00e5ff"],goldGradient:["var(--nice-warning, #FFD700)","#00BCD4","var(--nice-warning, #FFD700)"],glowColor:"rgba(0,137,123,0.6)"},{id:"forest",name:"Green ? Lime ? Yellow",sungGradient:["#1b5e20","#76ff03","#ffea00"],goldGradient:["var(--nice-warning, #FFD700)","#76ff03","var(--nice-warning, #FFD700)"],glowColor:"rgba(118,255,3,0.6)"},{id:"retro",name:"Orange ? Pink ? Purple",sungGradient:["#ff6d00","var(--nice-color-accent-pink, #e91e63)","#7b1fa2"],goldGradient:["var(--nice-warning, #FFD700)","var(--nice-color-accent-pink, #e91e63)","var(--nice-warning, #FFD700)"],glowColor:"rgba(233,30,99,0.6)"}],gn={presetId:"default",customSungGradient:["#00e5ff","#ffe600","#ffab00"],customGoldGradient:["var(--nice-warning, #FFD700)","#FFA000","var(--nice-warning, #FFD700)"],customGlowColor:"rgba(0,229,255,0.6)",animationMode:"ball",fontFamily:"Arial",transitionEffect:"none",curtainPrimaryColor:"#8b0000",curtainSecondaryColor:"#1a0000",curtainDurationMs:900,immersiveMode:!1};let ei=!1;function pl(){try{const e=localStorage.getItem(Za);if(e){const t=JSON.parse(e);return{...gn,...t}}}catch{}return{...gn}}async function mp(e){if(ei||(ei=!0,!e))return;const t=await e();if(t)try{const n=JSON.parse(t),a={...gn,...n};localStorage.setItem(Za,JSON.stringify(a))}catch{}}function gp(e){const t=JSON.stringify(e);localStorage.setItem(Za,t),Xa(e)}function fl(e){if(e.presetId==="custom")return{sungGradient:e.customSungGradient,goldGradient:e.customGoldGradient,glowColor:e.customGlowColor};const t=hl.find(n=>n.id===e.presetId);return t?{sungGradient:t.sungGradient,goldGradient:t.goldGradient,glowColor:t.glowColor}:{sungGradient:gn.customSungGradient,goldGradient:gn.customGoldGradient,glowColor:gn.customGlowColor}}function Xa(e){const{sungGradient:t,goldGradient:n,glowColor:a}=fl(e),s=document.documentElement;s.style.setProperty("--karaoke-sung-gradient",`linear-gradient(90deg, ${t[0]} 0%, ${t[1]} 60%, ${t[2]} 100%)`),s.style.setProperty("--karaoke-gold-gradient",`linear-gradient(90deg, ${n[0]}, ${n[1]}, ${n[2]})`),s.style.setProperty("--karaoke-gold-glow-first",`0 0 12px ${n[0]}`),s.style.setProperty("--karaoke-active-glow",`0 0 10px ${a}, 0 0 4px ${t[1]}80`),s.style.setProperty("--karaoke-active-drop-first",`0 0 6px ${a}`),s.style.setProperty("--karaoke-active-bg",`linear-gradient(90deg, transparent 0%, ${t[0]}14 20%, ${t[1]}10 80%, transparent 100%)`),s.style.setProperty("--karaoke-font-family",e.fontFamily||"Arial")}function yp(){const e=pl();Xa(e)}function vp(e){const t=(e||"").split(/\r?\n/),n=[];for(let a=0;a<t.length;a++){const s=t[a].trim();if(s&&/^[:*F]\s/.test(s)){const i=s.slice(1).trim().split(/\s+/),o=parseInt(i[0]||"0",10),l=parseInt(i[1]||"0",10),c=isNaN(o)?0:o/10,u=isNaN(l)?0:l/10;n.push({lineIndex:a,start:c,duration:u,raw:t[a]})}}return n}const bp=({index:e,data:t})=>{const{lines:n,notes:a,currentIndex:s,animationConfig:i}=t,o=n[e]??"",l=a.findIndex(f=>f.lineIndex===e),c=l>=0&&l===s,u=(i==null?void 0:i.enabled)??!0,h=(i==null?void 0:i.durationMs)??300,p=(i==null?void 0:i.translateX)??8,g=(i==null?void 0:i.scale)??1.01,y=(i==null?void 0:i.easing)??"cubic-bezier(.22,1,.36,1)",m=(i==null?void 0:i.opacityInactive)??.9,x=(i==null?void 0:i.boxShadow)??"0 6px 18px var(--nice-primary-tint-8, rgba(3,102,214,0.08))",b={transition:u?`transform ${h}ms ${y}, opacity ${h}ms ${y}`:"none",transform:c?`translateX(${p}px) scale(${g})`:"translateX(0px) scale(1)",opacity:c?1:m,boxShadow:c?x:"none"};return r.jsx("div",{style:{height:"100%",padding:"4px 6px",borderRadius:4},"data-note-idx":l>=0?l:void 0,children:r.jsx("div",{style:{...b,background:c?"var(--nice-primary-tint-12, rgba(0,130,200,0.12))":"transparent",padding:"4px 6px",borderRadius:4},children:r.jsx("code",{style:{fontFamily:"monospace",whiteSpace:"pre-wrap"},children:o})})})},xp=({ultrastarText:e,audioUrl:t,audioRef:n,animationConfig:a})=>{const{t:s}=xe(),i=d.useRef(null),o=n??i,[l,c]=d.useState(!1),u=d.useMemo(()=>vp(e),[e]),h=d.useRef(null),p=d.useRef(null),g=d.useRef(0),y=d.useRef(0),[m,x]=d.useState(-1),b=d.useMemo(()=>(e||"").split(/\r?\n/),[e]),f=28,k=b.length*f,v=d.useMemo(()=>({lines:b,notes:u,currentIndex:m,animationConfig:a}),[b,u,m,a]),w=d.useCallback((R,M)=>r.jsx(bp,{index:M,data:v}),[v]);return d.useEffect(()=>{const R=o.current;R&&(l?R.play().catch(()=>c(!1)):R.pause())},[l,o]),d.useEffect(()=>{const R=o.current;if(!R)return;let M=-1;const j=a??null,T=j&&typeof j.scrollSmooth=="number"?j.scrollSmooth:.18;let P=performance.now();const A=()=>{var G,W;const I=performance.now(),L=Math.max(0,Math.min(.2,(I-P)/1e3));P=I;const N=R.currentTime||0;g.current=N;let _=-1;for(let C=0;C<u.length;C++){const $=u[C];if(N>=$.start&&N<$.start+Math.max(.001,$.duration)){_=C;break}}_!==M&&(M=_,x(_));let ee=0;if(M>=0){const C=((G=u[M])==null?void 0:G.lineIndex)??0,$=((W=h.current)==null?void 0:W.clientHeight)??220;ee=C*f-$/2+f/2;const S=Math.max(0,k-$);(isNaN(ee)||!isFinite(ee))&&(ee=0),ee=Math.max(0,Math.min(ee,S))}const Y=1-Math.pow(Math.max(0,1-T),Math.min(4,L*60)),K=(((a==null?void 0:a.scrollEasing)||"easeOutCubic")==="linear"?C=>C:C=>1-Math.pow(1-C,3))(Y);y.current=y.current+(ee-y.current)*K;try{const C=h.current;C&&typeof C.scrollTop=="number"&&(C.scrollTop=Math.round(y.current))}catch{}p.current=requestAnimationFrame(A)};return p.current=requestAnimationFrame(A),()=>{p.current&&cancelAnimationFrame(p.current)}},[o,u,k,a]),r.jsxs("div",{children:[r.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:8},children:[r.jsx("button",{onClick:()=>c(R=>!R),disabled:!t,children:l?s("karaokeEditor.pause","Pause"):s("karaokeEditor.play","Play")}),r.jsxs("div",{style:{fontSize:13,color:"var(--nice-text-secondary, #666)"},children:[(g.current||0).toFixed(2),"s"]}),r.jsx("div",{style:{marginLeft:"auto",fontSize:13,color:"var(--nice-text-secondary, #666)"},children:s("karaokeEditor.notes","Notes: {notes}").replace("{notes}",String(u.length))})]}),r.jsx("div",{style:{border:"1px solid var(--nice-border, #ddd)",height:220,overflow:"hidden",padding:8,position:"relative"},children:e?r.jsx(ie.NiceVirtualScroller,{ref:h,items:b,itemHeight:f,height:220,renderItem:w,style:{border:"none",borderRadius:0,background:"transparent",fontSize:"inherit"}}):r.jsx("div",{style:{color:"var(--nice-text-secondary, #888)"},children:s("karaokeEditor.noText","No text")})}),!n&&r.jsx("audio",{ref:i,src:t||void 0,preload:"metadata",style:{display:"none"}})]})};function Sp(e){const t=(e||"").split(/\r?\n/).map(a=>a.replace(/\s+$/,"")),n=[];for(let a=0;a<t.length;a++){const s=t[a].trim();if(/^[:*F]\s/.test(s)){const i=s.slice(1).trim().split(/\s+/),o=parseInt(i[0]||"0",10)/10||0,l=parseInt(i[1]||"0",10)/10||.1;n.push({lineIndex:a,start:o,duration:l})}}return{lines:t,notes:n}}const kp=new Set;function wp({ultrastarText:e,audioUrl:t,audioRef:n,ytRef:a}){const{lines:s,notes:i}=d.useMemo(()=>Sp(e),[e]),[o,l]=d.useState(kp),c=d.useRef(i);c.current=i;const u=d.useRef(t);return u.current=t,d.useEffect(()=>{let h=null,p=null;if(!(a!=null&&a.current))if(n!=null&&n.current)h=n.current;else{const x=document.querySelector("audio");x instanceof HTMLAudioElement?h=x:u.current&&(p=document.createElement("audio"),p.src=u.current,p.preload="metadata",p.style.display="none",document.body.appendChild(p),h=p)}let g=0,y="";const m=()=>{let x=0;const b=a==null?void 0:a.current;if(b&&typeof b.getCurrentTime=="function")try{x=b.getCurrentTime()||0}catch{x=0}else x=h&&h.currentTime||0;const f=new Set;for(const v of c.current)x>=v.start&&x<v.start+Math.max(.001,v.duration)&&f.add(v.lineIndex);const k=[...f].join(",");k!==y&&(y=k,l(f)),g=requestAnimationFrame(m)};return g=requestAnimationFrame(m),()=>{cancelAnimationFrame(g),p==null||p.remove()}},[]),r.jsx("div",{style:{width:"100%",height:340,overflow:"hidden",background:"#101010",padding:"20px 0",boxSizing:"border-box"},children:s.map((h,p)=>{const g=o.has(p);return r.jsx("div",{"aria-current":g||void 0,style:{font:"18px monospace",lineHeight:"22px",whiteSpace:"pre",padding:"0 10px",color:g?"var(--nice-info, #00aaff)":"var(--nice-overlay-light-90, #e2e8f0)",background:g?"color-mix(in srgb, var(--nice-info, #00aaff) 16%, transparent)":void 0},children:h||" "},p)})})}const Cp=e=>!!e&&/\.m3u8(\?.*)?$/i.test(e),ti=e=>{(!isFinite(e)||e<0)&&(e=0);const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`},ea={border:"1px solid var(--nice-border-color)",borderRadius:8,padding:"6px 10px",background:"var(--nice-bg-secondary)",color:"var(--nice-text-primary)",cursor:"pointer"},jp=({isPlaying:e,index:t,count:n,currentTime:a,duration:s,volume:i,onPrev:o,onNext:l,onToggle:c,onSeek:u,onVolume:h})=>{const{t:p}=xe();return r.jsxs(r.Fragment,{children:[r.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:8,justifyContent:"space-between"},children:[r.jsx("div",{}),r.jsxs("div",{style:{fontSize:12,color:"var(--nice-text-secondary)"},children:[ti(a)," / ",ti(s)]})]}),r.jsxs("div",{className:"gp-controls",style:{display:"grid",gridTemplateColumns:"auto 1fr auto",gap:12,alignItems:"center"},children:[r.jsxs("div",{style:{display:"flex",gap:8},children:[r.jsx("button",{onClick:o,disabled:t<=0,title:p("playerControls.prev","Prev"),"aria-label":p("playerControls.previousTrack","Previous track"),style:ea,children:r.jsx(F.NtdSkipBack,{size:16})}),r.jsx("button",{onClick:c,title:e?p("playerControls.pause","Pause"):p("playerControls.play","Play"),"aria-label":e?p("playerControls.pause","Pause"):p("playerControls.play","Play"),style:ea,children:e?r.jsx(F.NtdPause,{size:16}):r.jsx(F.NtdPlay,{size:16})}),r.jsx("button",{onClick:l,disabled:t>=n-1,title:p("playerControls.next","Next"),"aria-label":p("playerControls.nextTrack","Next track"),style:ea,children:r.jsx(F.NtdSkipForward,{size:16})})]}),r.jsx("input",{type:"range",min:0,max:Math.max(1,s),step:.1,value:a,"aria-label":p("playerControls.seekPosition","Seek position"),onChange:g=>u(parseFloat(g.target.value))}),r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[r.jsx(F.NtdVolume,{size:16}),r.jsx("input",{type:"range",min:0,max:1,step:.01,value:i,"aria-label":p("playerControls.volume","Volume"),onChange:g=>h(parseFloat(g.target.value))})]})]})]})},Mp=d.memo(jp);function Rp(e,t,n,a,s){const o=Math.max(1,Math.floor(a.length/48)),l=t/48;for(let c=0;c<48;c++){const u=a[c*o]/255,h=u*(n-6),p=c*l,g=n-h,y=c/48*240+s;e.fillStyle=`hsl(${y%360}, 80%, ${Math.max(30,40+u*30)}%)`,e.fillRect(p+1,g,l-2,h)}}function Np(e,t,n,a,s,i){if(!i.current){const p=[];for(let y=0;y<24;y++)p.push({ang:y/24*Math.PI*2,phase:Math.random()*Math.PI*2,baseR:Math.min(t,n)*.22+Math.random()*30});i.current={nodes:p}}const o=i.current,l=t/2,c=n/2,u=26+a*80,h=[];for(const p of o.nodes){p.phase+=.02+a*.06;const g=p.baseR+Math.sin(p.phase)*u,y=l+Math.cos(p.ang)*g,m=c+Math.sin(p.ang)*g;h.push([y,m])}e.fillStyle=`hsla(${s}, 70%, 55%, .22)`,e.strokeStyle=`hsla(${(s+40)%360}, 90%, 65%, .9)`,e.lineWidth=2,e.beginPath();for(let p=0;p<h.length;p++){const[g,y]=h[p],[m,x]=h[(p+1)%h.length],b=(g+m)/2,f=(y+x)/2;p===0?e.moveTo(b,f):e.quadraticCurveTo(g,y,b,f)}e.closePath(),e.fill(),e.stroke()}function Tp(e,t,n,a,s,i){i.current||(i.current={items:[]});const o=i.current;Math.random()<.06+a*.25&&o.items.push({x:Math.random()*t,y:Math.random()*n,r:8+Math.random()*24,life:1,hue:(s+Math.random()*120)%360});const l=[];for(const c of o.items){c.r+=2+a*14,c.life*=.975-a*.02,c.life>.04&&l.push(c);const u=e.createRadialGradient(c.x,c.y,1,c.x,c.y,c.r);u.addColorStop(0,`hsla(${c.hue}, 90%, 60%, ${.35*c.life})`),u.addColorStop(.6,`hsla(${(c.hue+40)%360}, 80%, 55%, ${.18*c.life})`),u.addColorStop(1,`hsla(${(c.hue+80)%360}, 70%, 50%, 0)`),e.fillStyle=u,e.beginPath(),e.arc(c.x,c.y,c.r,0,Math.PI*2),e.fill()}o.items=l}const Pp="var(--nice-text-muted, #94a3b8)",Ep=({height:e,coverUrl:t,title:n,subtitle:a,label:s})=>r.jsx("div",{style:{textAlign:"center",color:"var(--nice-text-secondary, #e2e8f0)"},children:t?r.jsx("img",{alt:"cover",src:t,style:{height:e-24,objectFit:"contain"}}):r.jsxs("div",{style:{opacity:.8},children:[r.jsx("div",{style:{fontSize:18,fontWeight:600},children:n??"—"}),r.jsx("div",{style:{marginTop:8,fontSize:12,color:Pp},children:s??a??"—"})]})});function tn(e,t){return e+Math.random()*(t-e)}function $p(e,t,n,a,s,i,o){o.current||(o.current={embers:[],t:0});const l=o.current,c=e.createLinearGradient(0,n,0,n*.4);c.addColorStop(0,`hsla(${(i+30)%360}, 90%, 50%, .35)`),c.addColorStop(1,`hsla(${(i+10)%360}, 90%, 50%, 0)`),e.fillStyle=c,e.fillRect(0,0,t,n);const u=6;for(let p=0;p<u;p++){const g=(p+.5)/u*t,y=(a[Math.floor((p+1)/(u+1)*a.length)]||0)/255,m=n*.18+(.25+s*.6+y*.7)*n*.55,x=e.createLinearGradient(g,n,g,n-m);x.addColorStop(0,`hsla(${(i+40)%360},100%,55%,.9)`),x.addColorStop(.5,`hsla(${(i+10)%360},100%,60%,.75)`),x.addColorStop(1,`hsla(${(i-20)%360},100%,80%,.05)`);const b=Math.sin(l.t*1.2+p*.8)*(15+s*30);e.fillStyle=x,e.beginPath(),e.moveTo(g-20,n),e.bezierCurveTo(g-35,n-m*.45,g-25+b,n-m*.75,g+b,n-m),e.bezierCurveTo(g+25+b*.3,n-m*.65,g+35,n-m*.35,g+20,n),e.closePath(),e.fill()}const h=Math.floor(1+s*6);for(let p=0;p<h;p++)l.embers.push({x:tn(t*.25,t*.75),y:n-tn(4,14),r:tn(1,3),vx:tn(-.15,.15),vy:-tn(.6,1.8)-s*1.2,life:tn(.8,1.6)});e.save(),e.globalCompositeOperation="lighter";for(let p=l.embers.length-1;p>=0;p--){const g=l.embers[p];if(g.x+=g.vx,g.y+=g.vy,g.vy-=.01,g.life-=.015+s*.02,g.life<=0||g.y<-10){l.embers.splice(p,1);continue}const y=e.createRadialGradient(g.x,g.y,0,g.x,g.y,g.r*3);y.addColorStop(0,`hsla(${(i+25)%360},100%,65%,.9)`),y.addColorStop(1,`hsla(${(i+25)%360},100%,65%,0)`),e.fillStyle=y,e.beginPath(),e.arc(g.x,g.y,g.r*3,0,Math.PI*2),e.fill()}e.restore(),e.fillStyle="rgba(60,36,22,.9)",e.fillRect(t*.2,n-10,t*.6,6),l.t+=.02+s*.08}function Ap(e,t,n,a,s){const i=t/2,o=n/2,l=Math.min(t,n)*.28,c=96,u=Math.max(1,Math.floor(a.length/c));for(let h=0;h<c;h++){const p=(a[h*u]??0)/255,g=h/c*Math.PI*2,y=p*(Math.min(t,n)*.22)+6,m=i+Math.cos(g)*l,x=o+Math.sin(g)*l,b=i+Math.cos(g)*(l+y),f=o+Math.sin(g)*(l+y);e.strokeStyle=`hsl(${(s+h*3)%360}, 90%, ${40+p*40}%)`,e.lineWidth=3,e.beginPath(),e.moveTo(m,x),e.lineTo(b,f),e.stroke()}e.fillStyle=`hsla(${(s+180)%360}, 60%, 15%, .4)`,e.beginPath(),e.arc(i,o,l-8,0,Math.PI*2),e.fill()}function Ip(e,t,n,a,s){const l=t/14,c=n/8;for(let u=0;u<8;u++)for(let h=0;h<14;h++){const p=Math.min(a.length-1,u*14+h),g=a[p]/255,y=(s+h/14*210+u/8*90)%360,m=65+g*30,x=20+g*40,b=(1-g)*4;e.fillStyle=`hsl(${y}, ${m}%, ${x}%)`,e.fillRect(h*l+b,u*c+b,Math.max(1,l-2*b),Math.max(1,c-2*b))}}function Lp(e){const n=Array.from(new Set(e.filter(Boolean))).map(a=>new Promise(s=>{const i=new Image;i.crossOrigin="anonymous",i.onload=()=>s(i),i.onerror=()=>s(i),i.src=a}));return Promise.all(n)}async function _p(e,t,n,a,s){e.current||(e.current={sprites:[],loadedUrls:[],ready:!1});const i=e.current,o=t.join("|")!==i.loadedUrls.join("|");if(!i.ready||o){const l=await Lp(t.length?t:[]);i.loadedUrls=t,i.sprites=[],i.ready=!0;const c=u=>l[u%Math.max(1,l.length)]??new Image;for(let u=0;u<n;u++){const h=Math.random()*Math.min(a,s)*.38+40;i.sprites.push({img:c(u),x:(Math.random()-.5)*h*.4,y:(Math.random()-.5)*h*.4,z:Math.random()*600+100,ang:Math.random()*Math.PI*2,spin:(Math.random()*.03+.01)*(Math.random()<.5?-1:1),vz:Math.random()*1.2+.2,size:Math.random()*.35+.65})}}}function zp(e,t,n,a,s,i,o,l){const c=i.current;if(!(c!=null&&c.ready))return;const u=t/2,h=n/2,p=900,g=1+a*2;for(const m of c.sprites){m.ang+=m.spin*g,m.z-=m.vz*(.8+a*2.4),m.z<40&&(m.z=p);const x=Math.min(t,n)*.32+Math.sin(m.ang*.8)*18;m.x=Math.cos(m.ang)*x,m.y=Math.sin(m.ang*1.1)*x*.6}const y=[...c.sprites].sort((m,x)=>x.z-m.z);for(const m of y){const x=p/(p-m.z)*.6*m.size,b=u+m.x*x,f=h+m.y*x,k=64*x,v=64*x;e.save(),e.globalAlpha=.12+(1-m.z/p)*.2,e.fillStyle=`hsl(${(s+(1-m.z/p)*60)%360}, 90%, 60%)`,e.beginPath(),e.ellipse(b,f,k*.7,v*.7,0,0,Math.PI*2),e.fill(),e.restore(),m.img&&m.img.width?e.drawImage(m.img,b-k/2,f-v/2,k,v):(e.save(),e.fillStyle=`hsl(${(s+180)%360}, 40%, 55%)`,e.fillRect(b-k/2,f-v/2,k,v),e.restore())}}function wn(e,t){return e+Math.random()*(t-e)}function Dp(e,t,n,a,s,i){i.current||(i.current={blobs:Array.from({length:7},(u,h)=>({x:wn(t*.2,t*.8),y:wn(n*.2,n*.8),r:wn(Math.min(t,n)*.05,Math.min(t,n)*.12),vx:wn(-.6,.6),vy:wn(-.6,.6),hue:(s+h*10)%360}))});const o=i.current,l=.6+a*2.2;e.save(),e.globalCompositeOperation="lighter";for(const c of o.blobs){c.x+=c.vx*l,c.y+=c.vy*l,c.vy-=.01-a*.015,c.x<c.r&&(c.x=c.r,c.vx=Math.abs(c.vx)),c.x>t-c.r&&(c.x=t-c.r,c.vx=-Math.abs(c.vx)),c.y<c.r&&(c.y=c.r,c.vy=Math.abs(c.vy)),c.y>n-c.r&&(c.y=n-c.r,c.vy=-Math.abs(c.vy));const u=(c.hue+a*120)%360,h=e.createRadialGradient(c.x,c.y,c.r*.2,c.x,c.y,c.r);h.addColorStop(0,`hsla(${u}, 95%, 70%, .8)`),h.addColorStop(1,`hsla(${(u+40)%360}, 90%, 30%, 0)`),e.fillStyle=h,e.shadowBlur=18,e.shadowColor=`hsl(${u}, 100%, 60%)`,e.beginPath(),e.arc(c.x,c.y,c.r,0,Math.PI*2),e.fill()}e.restore(),e.strokeStyle=ke.resolveCssColor("var(--nice-overlay-light-6, rgba(255, 255, 255, 0.06))",e.canvas),e.lineWidth=2,e.strokeRect(1,1,t-2,n-2)}function Fp(e,t,n,a,s,i){i.current||(i.current={tris:[]});const o=i.current,l=6;for(;o.tris.length<l;)o.tris.push({a:Math.random()*Math.PI*2,r:30+Math.random()*Math.min(t,n)*.35,dr:(Math.random()*.6+.2)*(Math.random()<.5?-1:1)});const c=t/2,u=n/2;for(const h of o.tris){h.a+=.002+a*.02*(h.dr>0?1:-1),h.r+=Math.sin(h.a*2)*(.3+a*1.4);const p=Math.max(40,Math.min(h.r,Math.min(t,n)*.48));e.save(),e.translate(c,u),e.rotate(h.a),e.strokeStyle=`hsla(${(s+p*.2)%360}, 90%, 60%, .9)`,e.lineWidth=2.5,e.beginPath(),e.moveTo(p,0);for(let g=1;g<3;g++){const y=g*Math.PI*2/3;e.lineTo(Math.cos(y)*p,Math.sin(y)*p)}e.closePath(),e.shadowBlur=12,e.shadowColor=e.strokeStyle,e.stroke(),e.restore()}}function Op(e,t,n,a,s,i){const o=t/2,l=n/2,c=5,u=Math.min(t,n)*.42;i.current+=.01;for(let h=0;h<c;h++){const p=(h+1)/(c+1),g=p*u;e.strokeStyle=`hsla(${(s+h*30)%360}, 70%, 45%, 0.35)`,e.lineWidth=1,e.beginPath(),e.arc(o,l,g,0,Math.PI*2),e.stroke();const y=Math.floor(a.length*p|0),m=(a[y]??0)/255,x=6+h*2;for(let b=0;b<x;b++){const f=i.current*(1+h*.15)+b/x*Math.PI*2,k=g+Math.sin(f*2)*6*m,v=o+Math.cos(f)*k,w=l+Math.sin(f)*k;e.fillStyle=`hsla(${(s+h*30+b*6)%360}, 90%, ${55+m*30}%, ${.6+m*.3})`,e.beginPath(),e.arc(v,w,2+m*4,0,Math.PI*2),e.fill()}}}function Bp(e,t,n,a,s){const l=t/12,c=n/6;for(let u=0;u<6;u++)for(let h=0;h<12;h++){const p=(u*12+h)%a.length,g=a[p]/255,y=(s+h/12*180+u/6*90)%360,m=70+g*25,x=25+g*35;e.fillStyle=`hsl(${y}, ${m}%, ${x}%)`,e.fillRect(h*l,u*c,Math.ceil(l),Math.ceil(c))}}function Gp(e,t,n,a,s,i){const o=t/2,l=n/2,c=2+Math.floor(a*14);for(let h=0;h<c;h++){const p=Math.random()*Math.PI*2,g=.5+Math.random()*(2.5+a*4);i.current.push({x:o,y:l,vx:Math.cos(p)*g,vy:Math.sin(p)*g,life:0,max:40+Math.random()*60,hue:(s+Math.random()*60)%360})}e.fillStyle="rgba(2,6,23,0.2)",e.fillRect(0,0,t,n);const u=i.current;for(let h=u.length-1;h>=0;h--){const p=u[h];p.x+=p.vx,p.y+=p.vy,p.life+=1;const g=1-p.life/p.max;e.fillStyle=`hsla(${p.hue},85%,60%,${Math.max(0,g)})`,e.beginPath(),e.arc(p.x,p.y,2+g*3,0,Math.PI*2),e.fill(),(p.life>=p.max||p.x<-20||p.y<-20||p.x>t+20||p.y>n+20)&&u.splice(h,1)}u.length>1200&&u.splice(0,u.length-1200)}function Wp(e,t,n,a,s,i){e.fillStyle="rgba(10,16,28,0.25)",e.fillRect(0,0,t,n);const o=t/2,l=n/2,c=Math.min(t,n)*(.38+s*.12),u=e.createRadialGradient(o,l,c*.1,o,l,c);u.addColorStop(0,`hsla(${(i+200)%360},90%,70%,0.95)`),u.addColorStop(.5,`hsla(${(i+260)%360},80%,55%,0.6)`),u.addColorStop(1,"transparent"),e.fillStyle=u,e.beginPath(),e.arc(o,l,c,0,Math.PI*2),e.fill();const h=18+Math.floor(s*50);for(let p=0;p<h;p++){const g=p/h*Math.PI*2+a*(.6+s*1.4),y=(Math.sin(a*2+p*1.7)+Math.cos(a*1.3+p*2.1))*.15,m=c*(.4+.55*Math.abs(Math.sin(a*1.2+p))),x=6;e.save(),e.translate(o,l),e.rotate(g+y),e.beginPath(),e.moveTo(0,0);for(let f=1;f<=x;f++){const k=m/x*f,v=(Math.sin(a*3+p*.8+f)*.6+Math.cos(a*2+p+f*.7))*(8+24*s),w=k,R=v;e.lineTo(R,w)}e.globalCompositeOperation="lighter";const b=(i+p*(240/h))%360;e.strokeStyle=`hsla(${b}, 90%, ${60+s*20}%, ${.35+s*.4})`,e.lineWidth=2+s*2,e.stroke(),e.restore()}e.beginPath(),e.arc(o,l,c*(.98+.02*Math.sin(a*2)),0,Math.PI*2),e.strokeStyle=`hsla(${(i+40)%360},90%,70%,${.25+s*.25})`,e.lineWidth=1.5,e.stroke(),e.globalCompositeOperation="source-over"}function Vp(e,t,n,a,s){const o=Math.max(1,Math.floor(a.length/96)),l=t/2,c=n/2,u=Math.min(t,n)*.22,h=Math.min(t,n)*.48;for(let p=0;p<96;p++){const g=a[p*o]/255,y=p/96*Math.PI*2,m=u,x=u+g*(h-u),b=l+Math.cos(y)*m,f=c+Math.sin(y)*m,k=l+Math.cos(y)*x,v=c+Math.sin(y)*x;e.strokeStyle=`hsl(${p/96*360+s},85%,60%)`,e.lineWidth=3,e.beginPath(),e.moveTo(b,f),e.lineTo(k,v),e.stroke()}e.fillStyle=ke.resolveCssColor("var(--nice-overlay-light-8, rgba(255, 255, 255, 0.08))",e.canvas),e.beginPath(),e.arc(l,c,u*.85,0,Math.PI*2),e.fill()}function Up(e,t,n,a,s,i){const o=t/2,l=n/2,c=Math.min(t,n)*.5,u=ni(a,0,Math.floor(a.length*.1))/255,h=ni(a,Math.floor(a.length*.6),a.length)/255;i.current+=.01+h*.03;const p=24;for(let g=0;g<p;g++){const y=i.current+g/p*Math.PI*2,m=(.35+u*.55)*c,x=o+Math.cos(y)*m,b=l+Math.sin(y)*m,f=e.createRadialGradient(o,l,0,o,l,m),k=g/p*360+s;f.addColorStop(0,`hsla(${k},85%,65%,0.0)`),f.addColorStop(1,`hsla(${k},85%,65%,0.9)`),e.strokeStyle=f,e.lineWidth=6+h*8,e.beginPath(),e.moveTo(o,l),e.lineTo(x,b),e.stroke()}e.fillStyle="rgba(2,6,23,0.25)",e.fillRect(0,0,t,n)}function ni(e,t,n){let a=0,s=0;for(let i=t;i<n;i++)a+=e[i],s++;return s?a/s:0}function qp(e,t,n,a,s,i){e.fillStyle="rgba(10,16,28,0.35)",e.fillRect(0,0,t,n);const o=n/2,l=Math.max(8,18-s*10),c=n*.35*(.6+s*.7),u=a.length,h=t/(u-1);e.beginPath();for(let y=0;y<u;y++){const m=(a[y]-128)/128,x=Math.sin(i*1.5+y*.03)*.12,b=y*h,f=o-l-(m+x)*c;y===0?e.moveTo(b,f):e.lineTo(b,f)}const p=e.createLinearGradient(0,0,0,o-l);p.addColorStop(0,"hsla(260,90%,75%,0.9)"),p.addColorStop(1,"hsla(220,85%,60%,0.4)"),e.strokeStyle=p,e.lineWidth=2,e.stroke(),e.beginPath();for(let y=0;y<u;y++){const m=(a[y]-128)/128,x=Math.cos(i*1.3+y*.035)*.12,b=y*h,f=o+l+(m+x)*c;y===0?e.moveTo(b,f):e.lineTo(b,f)}const g=e.createLinearGradient(0,o+l,0,n);g.addColorStop(0,"hsla(190,90%,65%,0.9)"),g.addColorStop(1,"hsla(160,85%,55%,0.4)"),e.strokeStyle=g,e.lineWidth=2,e.stroke(),e.globalCompositeOperation="lighter",e.strokeStyle=ke.resolveCssColor("var(--nice-overlay-light-8, rgba(255, 255, 255, 0.08))",e.canvas),e.lineWidth=6,e.beginPath(),e.moveTo(0,o-l),e.lineTo(t,o-l),e.stroke(),e.beginPath(),e.moveTo(0,o+l),e.lineTo(t,o+l),e.stroke(),e.globalCompositeOperation="source-over"}function Hp(e,t,n,a,s,i){const o=t/2,l=n/2,c=5,u=Math.min(t,n)*.12;for(let h=0;h<c;h++){const p=Math.floor(h/c*a.length),g=a[p]/255,y=u+h*u*.55+g*u*.5,m=(i+h*40)%360;e.lineWidth=3+g*6,e.strokeStyle=`hsla(${m},80%,60%,${.5+.5*s})`,e.beginPath(),e.arc(o,l,y,0,Math.PI*2),e.stroke()}}function Kp(e,t,n,a,s){const i=Math.min(a.length,256),o=Math.max(1,Math.floor(a.length/i)),l=t/i;for(let c=0;c<i;c++){const u=a[c*o]/255,h=u*(n-6),p=c*l,g=n-h,y=c/i*240+s;e.fillStyle=`hsl(${y%360}, 80%, ${Math.max(30,40+u*30)}%)`,e.fillRect(p+1,g,l-2,h)}}function Yp(e,t,n,a){e.current||(e.current={stars:[],ready:!1});const s=e.current;if(!s.ready||s.stars.length!==t){const i=[];for(let o=0;o<t;o++){const l={x:(Math.random()-.5)*n,y:(Math.random()-.5)*a,z:Math.random()*800+100,pz:0};i.push(l)}s.stars=i,s.ready=!0}}function Zp(e,t,n,a,s,i){const o=i.current,l=t/2,c=n/2,u=4+a*18;e.save(),e.translate(l,c);for(const h of o.stars){h.z-=u,h.z<20&&(h.x=(Math.random()-.5)*t,h.y=(Math.random()-.5)*n,h.z=900,h.pz=h.z);const p=h.x/h.z*600,g=h.y/h.z*600,y=h.x/h.pz*600,m=h.y/h.pz*600;h.pz=h.z,e.strokeStyle=`hsla(${(s+200)%360}, 90%, 70%, 0.7)`,e.lineWidth=Math.max(1,(1-h.z/900)*2),e.beginPath(),e.moveTo(y,m),e.lineTo(p,g),e.stroke()}e.restore()}function Xp(e,t,n,a){e.lineWidth=2,e.strokeStyle=ke.resolveCssColor("var(--nice-primary-light, #c7d2fe)",e.canvas),e.beginPath();const s=t/a.length;for(let i=0;i<a.length;i++){const o=(a[i]-128)/128,l=i*s,c=n/2+o*(n*.45);i===0?e.moveTo(l,c):e.lineTo(l,c)}e.stroke()}const Qp=({active:e,onClick:t,title:n,children:a})=>r.jsx("button",{type:"button",onClick:t,title:n,"aria-pressed":e,style:{padding:"4px 8px",borderRadius:6,fontSize:12,border:`1px solid ${e?"var(--nice-info, #6366f1)":"var(--nice-border-color, #334155)"}`,background:e?"var(--nice-accent-tint-12, rgba(99,102,241,.12))":"var(--nice-overlay-60, rgba(15,23,42,.6))",color:e?"var(--nice-color-white, #e2e8f0)":"var(--nice-color-white, #cbd5e1)",cursor:"pointer",whiteSpace:"nowrap",lineHeight:1.2},children:a}),ml=({modes:e=[],active:t,setActive:n,rows:a=2})=>{const{t:s}=xe(),i=Math.max(1,a);return!e||e.length===0?null:r.jsx("div",{style:{position:"absolute",top:10,right:10,pointerEvents:"auto",zIndex:9999},children:r.jsx("div",{style:{display:"grid",gridAutoFlow:"column",gridTemplateRows:`repeat(${i}, auto)`,gridAutoColumns:"max-content",gap:6,background:"var(--nice-overlay-50, rgba(2, 6, 23, 0.5))",padding:6,borderRadius:10,border:"1px solid var(--nice-border-color, #334155)",backdropFilter:"blur(2px)",justifyItems:"end",alignItems:"start"},children:e.map(o=>r.jsx(Qp,{active:t===o,onClick:()=>n(o),title:`${s("visualizer.mode","Mode")}: ${o}`,children:o},o))})})};function Jp(e,t){const[n,a]=d.useState(()=>{try{const s=localStorage.getItem(e);return s?JSON.parse(s):t}catch{return t}});return d.useEffect(()=>{try{localStorage.setItem(e,JSON.stringify(n))}catch{}},[e,n]),[n,a]}const ef=({vu:e,hide:t})=>{if(t)return null;const n=12,a=Math.round(e*n);return r.jsx("div",{style:{position:"absolute",right:10,bottom:10,display:"flex",gap:2,background:"var(--nice-overlay-50, rgba(2, 6, 23, 0.5))",padding:"6px 8px",borderRadius:8,border:"1px solid var(--nice-border-color, #334155)",backdropFilter:"blur(2px)",pointerEvents:"none",zIndex:9998},children:Array.from({length:n}).map((s,i)=>{const o=120*(i/n);return r.jsx("div",{style:{width:6,height:18,borderRadius:2,background:i<a?`hsl(${o}, 80%, 50%)`:"var(--nice-text, #1f2937)"}},i)})})},tf="var(--player-bg, #0f172a)";function nf(e,t){const n=e.length;for(let a=0;a<n;a++){const s=a/n,i=.55*Math.exp(-Math.pow((s-(.12+.08*Math.sin(t*.7)))*7,2))+.45*Math.exp(-Math.pow((s-(.4+.15*Math.sin(t*1.1+1)))*9,2))+.3*(1-s)*(.55+.45*Math.sin(t*2+a*.06));e[a]=Math.max(0,Math.min(255,Math.floor(i*255)))}}function rf(e,t){const n=e.length;for(let a=0;a<n;a++){const s=a/n*Math.PI*2,i=Math.sin(s*3+t*3)*.5+Math.sin(s*7+t*2)*.28;e[a]=Math.max(0,Math.min(255,Math.floor(128+i*110)))}}const gl=({kind:e,audioRef:t,width:n="100%",height:a=360,coverUrl:s,title:i,subtitle:o,label:l,defaultMode:c="cover",storageKey:u="gp-stage:mode",allowedModes:h,imageUrls:p,imageCount:g=14,autoAnimate:y=!1})=>{const{t:m}=xe(),x=d.useMemo(()=>h!=null&&h.length?h:e==="youtube"?["video","cover"]:["cover","spectrum","bars","waveform","palette","radial","rays","particles","rings","grid","imageTornado","colorRipples","starfield","orbitals","eqcircle","triangles","blob","plasma","lavaLamp","cozyFire","rift"],[e,h]),b=d.useMemo(()=>{const W=x.includes(c)?c:x[0];try{const C=localStorage.getItem(u);if(!C)return W;const $=JSON.parse(C);return x.includes($)?$:W}catch{return W}},[x,c,u]),[f,k]=Jp(u,b),v=d.useRef(null),w=d.useRef(null),R=d.useRef(null),M=d.useRef(null),j=d.useRef(null),T=d.useRef(null),P=d.useRef(0),A=d.useRef(0),I=d.useRef([]),[L,N]=d.useState(0),_=d.useRef(null),ee=d.useRef(null),Y=d.useRef(null),O=d.useRef(null),U=d.useRef(null),V=d.useRef(null),K=d.useRef(null),G=f!=="cover"&&f!=="video";return d.useEffect(()=>{var z;if(e==="youtube"||(w.current&&(cancelAnimationFrame(w.current),w.current=null),!G))return;Yt();const W=qn(),C=t.current;if(!C&&!y)return;if(C&&!R.current)try{R.current=W.createMediaElementSource(C)}catch{}if(C&&!M.current){const Z=W.createAnalyser();Z.fftSize=2048,Z.smoothingTimeConstant=.85,M.current=Z;try{(z=R.current)==null||z.connect(Z)}catch{}try{Z.connect(W.destination)}catch{}}const $=M.current;j.current=new Uint8Array($?$.frequencyBinCount:1024),T.current=new Uint8Array($?$.fftSize:2048);const S=()=>{const Z=v.current,E=Math.max(1,Math.floor(window.devicePixelRatio||1));Z.width=Math.floor(Z.clientWidth*E),Z.height=Math.floor(Z.clientHeight*E);const q=Z.getContext("2d");q==null||q.setTransform(1,0,0,1,0,0),q==null||q.scale(E,E)};S();const B=()=>S();window.addEventListener("resize",B),Yp(Y,220,v.current.width,v.current.height);const H=async()=>{const Z=v.current;if(!Z)return;const E=Z.getContext("2d");if(!E)return;const q=Math.max(1,Math.floor(window.devicePixelRatio||1)),X=Z.width/q,re=Z.height/q,oe=performance.now()*.001,se=f==="waveform"||f==="rift";$&&(se?$.getByteTimeDomainData(T.current):$.getByteFrequencyData(j.current)),y&&(nf(j.current,oe),rf(T.current,oe));let D=0;const J=se?T.current:j.current;for(let ae=0;ae<J.length;ae++){const ce=se?(J[ae]-128)/128:J[ae]/255;D+=ce*ce}if(D=Math.sqrt(D/J.length),N(Math.min(1,D)),E.clearRect(0,0,X,re),f==="spectrum")Kp(E,X,re,j.current,P.current);else if(f==="bars")Rp(E,X,re,j.current,P.current);else if(f==="waveform")Xp(E,X,re,T.current);else if(f==="palette"){const ae=(P.current+D*120)%360;Bp(E,X,re,j.current,ae)}else if(f==="radial")Vp(E,X,re,j.current,P.current);else if(f==="rays")Up(E,X,re,j.current,P.current,A);else if(f==="particles")Gp(E,X,re,D,P.current,I);else if(f==="rings")Hp(E,X,re,j.current,D,P.current);else if(f==="grid"){const ae=(P.current+D*160)%360;Ip(E,X,re,j.current,ae)}else if(f==="imageTornado"){const ae=p!=null&&p.length?p:s?[s]:[];await _p(_,ae,g,X,re);const ce=(P.current+D*100)%360;zp(E,X,re,D,ce,_)}else if(f==="colorRipples"){const ae=(P.current+D*120)%360;Tp(E,X,re,D,ae,ee)}else if(f==="starfield"){const ae=(P.current+60)%360;Zp(E,X,re,D,ae,Y)}else if(f==="orbitals"){const ae=(P.current+D*180)%360;Op(E,X,re,j.current,ae,A)}else if(f==="eqcircle"){const ae=(P.current+120)%360;Ap(E,X,re,j.current,ae)}else if(f==="triangles"){const ae=(P.current+40)%360;Fp(E,X,re,D,ae,O)}else if(f==="blob"){const ae=(P.current+90)%360;Np(E,X,re,D,ae,U)}else if(f==="plasma"){const ae=(P.current+D*200)%360;Wp(E,X,re,oe,D,ae)}else if(f==="rift")qp(E,X,re,T.current,D,oe);else if(f==="lavaLamp"){const ae=(P.current+D*80)%360;Dp(E,X,re,D,ae,V)}else if(f==="cozyFire"){const ae=(P.current+D*140)%360;$p(E,X,re,j.current,D,ae,K)}P.current=(P.current+.4)%360,w.current=requestAnimationFrame(H)};return w.current=requestAnimationFrame(H),()=>{window.removeEventListener("resize",B),w.current&&cancelAnimationFrame(w.current)}},[G,e,t,f,p,g,s,y]),r.jsxs(r.Fragment,{children:[r.jsx("div",{style:{position:"absolute",inset:0,pointerEvents:"none",background:f==="cover"?"transparent":tf},children:f==="cover"?r.jsx("div",{style:{position:"absolute",inset:0,display:"grid",placeItems:"center"},children:r.jsx(Ep,{height:a,coverUrl:s,title:i,subtitle:o,label:l})}):r.jsx("canvas",{ref:v,style:{width:typeof n=="number"?`${n}px`:n,height:a,borderRadius:8},role:"img","aria-label":m("stageVisualizer.stageVisualizerCanvas","Stage visualizer canvas")})}),r.jsxs("div",{style:{position:"absolute",inset:0,pointerEvents:"none"},children:[r.jsx(ml,{modes:x,active:f,setActive:k,rows:2}),r.jsx(ef,{vu:L,hide:e==="youtube"})]})]})},af=({height:e,autoPlay:t,track:n,source:a,ytRef:s,audioRef:i,hlsRef:o,setVol:l,onEnd:c,volume:u,extractVideoId:h})=>{const p=a==null?void 0:a.url,g=a==null?void 0:a.kind,y=a==null?void 0:a.withCredentials,m=JSON.stringify((a==null?void 0:a.headers)??null),x=d.useRef(u);x.current=u,d.useEffect(()=>{i.current&&(i.current.volume=u)},[i,u]),d.useEffect(()=>{const v=i.current;if(v){if(v.volume=x.current,v.crossOrigin=y?"use-credentials":"anonymous",g==="hls"&&Cp(p)){const w=()=>{v.src=p,v.load(),t&&v.play().catch(()=>{})};if(v.canPlayType("application/vnd.apple.mpegurl")){w();return}(async()=>{const M=(await import("hls.js")).default;if(M.isSupported()){const j=JSON.parse(m),T=new M({xhrSetup:P=>{if(y&&(P.withCredentials=!0),j)for(const[A,I]of Object.entries(j))P.setRequestHeader(A,String(I))}});o.current=T,T.loadSource(p),T.attachMedia(v),T.on(M.Events.MANIFEST_PARSED,()=>t&&v.play().catch(()=>{}))}else w()})()}g==="audio"&&p&&(v.src=p,v.load(),t&&v.play().catch(()=>{}))}},[i,o,p,g,y,m,t]);const b=(a==null?void 0:a.kind)==="youtube",f=b?"video":"cover",k=`gp-stage:mode:${(a==null?void 0:a.kind)??"none"}`;return r.jsxs("div",{className:"gp-stage",style:{width:"100%",height:e,background:b?"transparent":"var(--player-bg, #0f172a)",borderRadius:8,overflow:"hidden",position:"relative",display:"grid",placeItems:"center"},children:[(a==null?void 0:a.kind)==="youtube"&&r.jsx(Pa,{videoId:a.videoId??h(a.url),onReady:v=>{s.current=v.target,l(u),t&&v.target.playVideo()},onEnd:c,opts:{width:"100%",height:"100%",playerVars:{autoplay:t?1:0,controls:0,modestbranding:1,rel:0,showinfo:0,fs:0,disablekb:1,iv_load_policy:3}},style:{width:"100%",height:"100%"}}),((a==null?void 0:a.kind)==="audio"||(a==null?void 0:a.kind)==="hls")&&r.jsxs(r.Fragment,{children:[r.jsx("div",{style:{textAlign:"center",color:"var(--nice-overlay-light-90, #e2e8f0)"},children:n!=null&&n.coverUrl?r.jsx("img",{alt:"cover",src:n.coverUrl,style:{height:e-24,objectFit:"contain"}}):r.jsxs("div",{style:{opacity:.8},children:[r.jsxs("div",{style:{fontSize:18,fontWeight:600},children:[n==null?void 0:n.artist," — ",n==null?void 0:n.title]}),r.jsx("div",{style:{marginTop:8,fontSize:12,color:"var(--nice-text-dim, #94a3b8)"},children:(a==null?void 0:a.label)??`${(a==null?void 0:a.codec)??""} ${(a==null?void 0:a.quality)??""}`.trim()})]})}),r.jsx("audio",{ref:i,onEnded:c,onLoadedMetadata:()=>{},crossOrigin:a!=null&&a.withCredentials?"use-credentials":"anonymous",style:{display:"none"}})]}),r.jsx(gl,{kind:(a==null?void 0:a.kind)==="hls"?"hls":(a==null?void 0:a.kind)??"audio",audioRef:i,hlsRef:o,height:e,coverUrl:n==null?void 0:n.coverUrl,title:n==null?void 0:n.title,subtitle:n==null?void 0:n.artist,label:(a==null?void 0:a.label)??`${(a==null?void 0:a.codec)??""} ${(a==null?void 0:a.quality)??""}`.trim(),defaultMode:f,storageKey:k},`vis-${k}`)]})},sf=({artist:e,title:t,hideControls:n=!0,isPlaying:a,onTimeUpdate:s,searchYouTubeByArtistTitle:i})=>{const{t:o}=xe(),[l,c]=d.useState(e||""),[u,h]=d.useState(t||""),[p,g]=d.useState(null),[y,m]=d.useState(null),x=d.useRef(null),[b,f]=d.useState({width:Math.min(560,window.innerWidth-32),height:Math.min(315,(window.innerWidth-32)*9/16)});d.useEffect(()=>{e&&t&&i&&i(e,t).then(g)},[e,t,i]),d.useEffect(()=>{y&&(a?y.playVideo():y.pauseVideo())},[a,y]),d.useEffect(()=>{if(y&&s){const v=setInterval(()=>{const w=y.getCurrentTime();s(w)},100);return()=>clearInterval(v)}},[y,s]),d.useEffect(()=>{const v=()=>{if(x.current){const w=x.current.clientWidth,R=Math.round(w*(9/16));f({width:w,height:R})}};return v(),window.addEventListener("resize",v),()=>window.removeEventListener("resize",v)},[]);const k=async()=>{if(!i)return;const v=await i(l,u);g(v)};return r.jsxs("div",{ref:x,style:{width:"100%",maxWidth:"900px",margin:"0 auto"},children:[(!e||!t||!p)&&r.jsxs("div",{children:[r.jsx("input",{value:l,onChange:v=>c(v.target.value),placeholder:o("youtubePlayer.artist","Artist"),"aria-label":o("youtubePlayer.artist","Artist")}),r.jsx("input",{value:u,onChange:v=>h(v.target.value),placeholder:o("youtubePlayer.title","Title"),"aria-label":o("youtubePlayer.title","Title")}),r.jsx("button",{onClick:k,children:o("youtubePlayer.search","Search")})]}),p&&r.jsxs("div",{children:[r.jsx(Pa,{videoId:p,opts:{width:b.width.toString(),height:b.height.toString(),playerVars:{autoplay:1,controls:0,modestbranding:1,rel:0,showinfo:0,fs:0,disablekb:1,iv_load_policy:3,annotations:0}},onReady:v=>m(v.target)}),!n&&r.jsxs("div",{style:{marginTop:"10px",display:"flex",gap:"10px"},children:[r.jsxs("button",{onClick:()=>y==null?void 0:y.playVideo(),children:[r.jsx(F.NtdPlay,{size:14})," ",o("youtubePlayer.play","Play")]}),r.jsxs("button",{onClick:()=>y==null?void 0:y.pauseVideo(),children:[r.jsx(F.NtdPause,{size:14})," ",o("youtubePlayer.pause","Pause")]})]})]})]})},ri=e=>({name:e,dirs:new Map,files:[]}),of=e=>(e??[]).map(t=>t instanceof File?{file:t}:t),lf=e=>e.replace(/\\/g,"/"),cf=e=>{const t=ri("/");for(const n of e){const a=lf(n.path??n.file.name).split("/").filter(Boolean);if(a.length<=1){t.files.push({file:n.file,path:a[0]??n.file.name});continue}let s=t;for(let i=0;i<a.length-1;i++){const o=a[i];s.dirs.has(o)||s.dirs.set(o,ri(o)),s=s.dirs.get(o)}s.files.push({file:n.file,path:a[a.length-1]??n.file.name})}return t},ya=e=>e.slice().sort((t,n)=>(t.path??t.file.name).localeCompare(n.path??n.file.name)),df={tidal:F.NtdWave,spotify:F.NtdMusic,youtube:F.NtdPlay},va=({q:e,setQ:t,t:n})=>r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[r.jsx("div",{style:{flex:1},children:r.jsx(ie.NiceTextInput,{value:e,onChange:t,placeholder:n("libraryExplorer.searchPlaceholder","Search…"),size:"sm"})}),e&&r.jsx(ie.NiceButton,{variant:"ghost",size:"sm",onClick:()=>t(""),children:r.jsx(F.NtdClose,{size:14})})]}),ba=({files:e,t,onOpenInEditor:n,onPlayFile:a})=>e.length?r.jsx("div",{style:{borderRadius:12,border:"1px solid var(--nice-border, #334155)",overflow:"hidden"},children:r.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13},children:[r.jsx("thead",{children:r.jsxs("tr",{style:{color:"var(--nice-text-muted, #94a3b8)",textAlign:"left"},children:[r.jsx("th",{style:{padding:"8px 12px",fontWeight:600},children:t("libraryExplorer.colFile","File")}),r.jsx("th",{style:{padding:"8px 12px",fontWeight:600},children:t("libraryExplorer.colType","Type")}),r.jsx("th",{style:{padding:"8px 12px",fontWeight:600,width:200},children:t("libraryExplorer.colActions","Actions")})]})}),r.jsx("tbody",{children:e.map(s=>{const i=s.path??s.file.name;return r.jsxs("tr",{style:{borderTop:"1px solid var(--nice-border, #1e293b)"},children:[r.jsx("td",{style:{padding:"6px 12px",maxWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:i}),r.jsx("td",{style:{padding:"6px 12px",color:"var(--nice-text-muted, #94a3b8)"},children:s.file.type||"—"}),r.jsxs("td",{style:{padding:"6px 12px",display:"flex",gap:6},children:[n&&r.jsxs(ie.NiceButton,{variant:"outline",size:"sm",onClick:()=>n(s.file),children:[r.jsx(F.NtdEdit,{size:13})," ",t("libraryExplorer.openInEditor","Edit")]}),a&&r.jsxs(ie.NiceButton,{variant:"primary",size:"sm",onClick:()=>a(s.file),children:[r.jsx(F.NtdPlay,{size:13})," ",t("libraryExplorer.play","Play")]})]})]},i)})})]})}):r.jsx("div",{style:{fontSize:13,color:"var(--nice-text-muted, #94a3b8)",padding:12},children:t("libraryExplorer.noFiles","No files")}),yl=({streams:e,t,onPlayStream:n})=>e.length?r.jsxs("div",{style:{borderRadius:12,border:"1px solid var(--nice-border, #334155)",overflow:"hidden"},children:[r.jsx("div",{style:{padding:"8px 12px",fontSize:13,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)"},children:t("libraryExplorer.streaming","Streaming")}),r.jsx("ul",{style:{listStyle:"none",margin:0,padding:0},children:e.map(a=>r.jsxs("li",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8,borderTop:"1px solid var(--nice-border, #1e293b)",padding:"8px 12px"},children:[r.jsxs("div",{style:{minWidth:0},children:[r.jsx("div",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:a.title}),r.jsxs("div",{style:{fontSize:12,color:"var(--nice-text-muted, #94a3b8)",display:"flex",alignItems:"center",gap:4},children:[d.createElement(df[a.provider],{size:12})," ",a.provider.toUpperCase(),a.artist?` • ${a.artist}`:""]})]}),n&&r.jsxs(ie.NiceButton,{variant:"primary",size:"sm",onClick:()=>n(a),children:[r.jsx(F.NtdPlay,{size:13})," ",t("libraryExplorer.play","Play")]})]},`${a.provider}:${a.id}`))})]}):null,ta=({name:e,enabled:t})=>r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"4px 8px",fontSize:13},children:[r.jsx("span",{style:{width:8,height:8,borderRadius:"50%",background:t?"var(--nice-success, #10b981)":"var(--nice-border, #d1d5db)"}}),r.jsx("span",{style:{color:t?"inherit":"var(--nice-text-muted, #94a3b8)"},children:e})]}),uf=({variant:e="full",files:t=[],streams:n=[],enableProviders:a,onOpenInEditor:s,onPlayFile:i,onPlayStream:o,className:l,t:c,style:u,id:h,accessMode:p,"data-testid":g})=>{const{t:y}=xe(),m=c??y,[x,b]=d.useState(""),f=d.useMemo(()=>of(t),[t]),k=d.useCallback(R=>{const M=x.trim().toLowerCase();return!M||R.toLowerCase().includes(M)},[x]),v=d.useMemo(()=>ya(f).filter(R=>k(`${R.path??R.file.name} ${R.file.type||""}`)),[f,k]),w=d.useMemo(()=>n.filter(R=>k(`${R.title} ${R.artist??""} ${R.provider}`)),[n,k]);return p==="hidden"?null:e==="minimal"?r.jsxs("div",{className:l,style:{display:"flex",flexDirection:"column",gap:12,...u},id:h,"data-testid":g,children:[r.jsx(va,{q:x,setQ:b,t:m}),r.jsx(ba,{files:v,t:m,onOpenInEditor:s,onPlayFile:i}),r.jsx(yl,{streams:w,t:m,onPlayStream:o})]}):e==="onlyFiles"?r.jsxs("div",{className:l,style:{display:"flex",flexDirection:"column",gap:12,...u},id:h,"data-testid":g,children:[r.jsx(va,{q:x,setQ:b,t:m}),r.jsx(ba,{files:v,t:m,onOpenInEditor:s,onPlayFile:i})]}):r.jsx(hf,{q:x,setQ:b,normFiles:f,filteredStreams:w,enableProviders:a,onOpenInEditor:s,onPlayFile:i,onPlayStream:o,className:l,style:u,id:h,"data-testid":g,t:m})},hf=({q:e,setQ:t,normFiles:n,filteredStreams:a,enableProviders:s,onOpenInEditor:i,onPlayFile:o,onPlayStream:l,className:c,style:u,id:h,"data-testid":p,t:g})=>{const y=d.useMemo(()=>cf(n),[n]),[m,x]=d.useState({}),[b,f]=d.useState("/"),k=M=>x(j=>({...j,[M]:!j[M]})),v=(M,j)=>{const T=j==="/"?`/${M.name}`:`${j}${M.name}/`,P=j==="/"&&M.name==="/",A=m[T]??P,I=Array.from(M.dirs.keys()).sort();return r.jsxs("div",{children:[!P&&r.jsxs("button",{type:"button",onClick:()=>{k(T),f(T)},style:{display:"flex",alignItems:"center",gap:8,width:"100%",padding:"4px 8px",border:"none",borderRadius:6,cursor:"pointer",textAlign:"left",background:b===T?"var(--nice-accent-tint-20, rgba(99,102,241,0.2))":"transparent",color:"var(--nice-text, inherit)"},children:[r.jsx("span",{style:{display:"inline-flex"},children:A?r.jsx(F.NtdFolderOpen,{size:14}):r.jsx(F.NtdFolder,{size:14})}),r.jsx("span",{style:{fontSize:13},children:M.name})]}),(P||A)&&r.jsx("div",{style:{paddingLeft:P?0:16},children:I.map(L=>v(M.dirs.get(L),T))})]},T)},w=d.useMemo(()=>{let M;if(b==="/")M=ya(n);else{const j=b.replace(/^\//,"").split("/").filter(Boolean);let T=y;for(const P of j){const A=T.dirs.get(P);if(!A)return[];T=A}M=ya(T.files)}return e?M.filter(j=>(j.path??j.file.name).toLowerCase().includes(e.toLowerCase())):M},[b,y,n,e]),R={tidal:(s==null?void 0:s.tidal)??!0,spotify:(s==null?void 0:s.spotify)??!0,youtube:(s==null?void 0:s.youtube)??!0};return r.jsxs("div",{className:c,style:{display:"flex",gap:12,color:"var(--nice-text, #e2e8f0)",...u},id:h,"data-testid":p,children:[r.jsxs("div",{style:{flex:"0 0 220px",border:"1px solid var(--nice-border, #334155)",borderRadius:12,padding:8},children:[r.jsx("div",{style:{padding:"0 8px 8px",fontSize:12,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)"},children:g("libraryExplorer.library","Library")}),v(y,"/"),r.jsxs("div",{style:{marginTop:16,borderTop:"1px solid var(--nice-border, #1e293b)",paddingTop:8},children:[r.jsx("div",{style:{padding:"0 8px 4px",fontSize:12,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)"},children:g("libraryExplorer.streaming","Streaming")}),r.jsx(ta,{name:"Tidal",enabled:R.tidal}),r.jsx(ta,{name:"Spotify",enabled:R.spotify}),r.jsx(ta,{name:"YouTube",enabled:R.youtube})]})]}),r.jsxs("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:12},children:[r.jsx(va,{q:e,setQ:t,t:g}),r.jsx(ba,{files:w,t:g,onOpenInEditor:i,onPlayFile:o}),(R.tidal||R.spotify||R.youtube)&&r.jsx(yl,{streams:a.filter(M=>R[M.provider]),t:g,onPlayStream:l})]})]})},pf=({kind:e,color:t})=>{const n={width:14,height:14,viewBox:"0 0 24 24",fill:t,"aria-hidden":!0};switch(e){case"youtube":return r.jsx("svg",{...n,children:r.jsx("path",{d:"M23 7.2s-.2-1.6-.9-2.3c-.8-.9-1.7-.9-2.1-1C16.9 3.5 12 3.5 12 3.5s-4.9 0-8 .4c-.4.1-1.3.1-2.1 1C1.2 5.6 1 7.2 1 7.2S.8 9.1.8 11v1.8c0 1.9.2 3.8.2 3.8s.2 1.6.9 2.3c.8.9 1.9.9 2.4 1 1.7.2 7.7.4 7.7.4s4.9 0 8-.4c.4-.1 1.3-.1 2.1-1 .7-.7.9-2.3.9-2.3s.2-1.9.2-3.8V11c0-1.9-.2-3.8-.2-3.8zM9.7 14.6V8.2l6.3 3.2-6.3 3.2z"})});case"spotify":return r.jsx("svg",{...n,children:r.jsx("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4.59 14.42c-.18.3-.57.4-.87.21-2.39-1.46-5.4-1.79-8.95-.98-.34.08-.68-.13-.76-.47-.08-.34.13-.68.47-.76 3.88-.89 7.21-.5 9.89 1.13.31.19.4.58.22.87zm1.23-2.72c-.23.37-.71.49-1.08.26-2.74-1.69-6.92-2.18-10.16-1.19-.41.13-.85-.11-.97-.52-.13-.41.11-.85.52-.97 3.7-1.12 8.31-.58 11.45 1.34.37.23.49.71.24 1.08zm.11-2.84C14.55 8.84 9.5 8.66 6.43 9.6c-.49.15-1.01-.13-1.16-.62-.15-.49.13-1.01.62-1.16 3.52-1.07 9.1-.86 12.69 1.27.43.26.57.82.31 1.25-.26.43-.82.57-1.25.31z"})});case"tidal":return r.jsx("svg",{...n,children:r.jsx("path",{d:"M12 2L8 6l4 4 4-4-4-4zM4 6L0 10l4 4 4-4-4-4zm16 0l-4 4 4 4 4-4-4-4zm-8 8l-4 4 4 4 4-4-4-4z"})});case"hls":return r.jsx("svg",{...n,children:r.jsx("path",{d:"M2 12h2v6H2v-6zm4-4h2v10H6V8zm4-4h2v14h-2V4zm4 4h2v10h-2V8zm4 4h2v6h-2v-6z"})});case"audio":default:return r.jsx("svg",{...n,children:r.jsx("path",{d:"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"})})}},Qa=({data:e,display:t,callbacks:n,state:a})=>{const{id:s,index:i,artist:o,title:l,version:c,lp:u,sourcesAvailable:h=[]}=e,{allowVersion:p=!0,dragHandleProps:g}=t,{onChange:y,onRemove:m,onMoveUp:x,onMoveDown:b,onChangeLp:f,onSelectSource:k}=n,{readOnly:v=!1,canMoveUp:w=!0,canMoveDown:R=!0,activeSource:M}=a,{t:j}=xe(),T=d.useRef(null);d.useEffect(()=>{!o&&T.current&&T.current.focus()},[o]);const P=N=>{if(!v&&N.key==="Enter"){const _=N.target.closest("div.gpi-row"),ee=_==null?void 0:_.querySelectorAll("input[data-role='field']");if(!ee||ee.length===0)return;const Y=Array.from(ee).indexOf(N.target),O=ee[Y+1]??ee[0];O==null||O.focus()}},A=N=>{const _=h.includes(N),ee=M===N,Y={width:30,height:30,display:"grid",placeItems:"center",borderRadius:6,border:"1px solid var(--nice-border, #e5e7eb)",background:ee?"var(--nice-selected-bg, #eef2ff)":"var(--nice-bg, #fff)",opacity:_?1:.35,cursor:_&&k&&!v?"pointer":"default",transition:"transform .05s ease"},O=N==="youtube"?"var(--nice-danger, #ff0000)":N==="spotify"?"var(--nice-success, #1db954)":N==="tidal"?"var(--nice-text, #111827)":N==="hls"?"var(--nice-accent, #7c3aed)":"var(--nice-text, #374151)",U=N==="youtube"?"YouTube":N==="spotify"?"Spotify":N==="tidal"?"TIDAL":N==="hls"?"HLS":j("playlistItem.audio","Audio"),V=j("playlistItem.sourceLabel","Source")+": "+U+(ee?` ${j("playlistItem.sourceSelected","(selected)")}`:""),K=()=>{!_||!k||v||k(N)};return r.jsx("button",{type:"button",title:U,onClick:K,disabled:!_||v,style:Y,"aria-pressed":ee,"aria-label":V,children:r.jsx(pf,{kind:N,color:O})},N)},I=["youtube","tidal","spotify","hls","audio"],L=typeof u=="number"?u:i+1;return r.jsxs("div",{className:"gpi-row",role:"group","aria-label":j("playlistItem.trackNumber","Track")+" "+(i+1),style:{display:"grid",gridTemplateColumns:p?"56px 1fr 1fr 1fr auto auto":"56px 1fr 1fr auto auto",gap:8,alignItems:"center"},children:[r.jsx("input",{type:"number",min:1,value:L,onChange:N=>f==null?void 0:f(Number(N.target.value)),disabled:v||!f,"aria-label":j("playlistItem.lp","Lp"),title:j("playlistItem.positionOnList","Position in the list"),style:ff}),r.jsx("input",{ref:T,"data-role":"field",type:"text",value:o,onChange:N=>y({artist:N.target.value}),placeholder:j("playlistItem.artist","Artist"),onKeyDown:P,disabled:v,"aria-label":j("playlistItem.artist","Artist"),className:"gpi-input",style:na}),r.jsx("input",{"data-role":"field",type:"text",value:l,onChange:N=>y({title:N.target.value}),placeholder:j("playlistItem.title","Title"),onKeyDown:P,disabled:v,"aria-label":j("playlistItem.title","Title"),className:"gpi-input",style:na}),p&&r.jsx("input",{"data-role":"field",type:"text",value:c??"",onChange:N=>y({version:N.target.value||void 0}),placeholder:j("playlistItem.versionOptional","Version (optional)"),onKeyDown:P,disabled:v,"aria-label":j("playlistItem.version","Version"),className:"gpi-input",style:na}),r.jsx("div",{className:"gpi-sources",style:{display:"flex",gap:6,justifyContent:"flex-end",alignItems:"center"},"aria-label":j("playlistItem.availableSources","Available sources"),children:I.map(A)}),r.jsxs("div",{className:"gpi-actions",style:{display:"flex",gap:6,justifyContent:"flex-end"},children:[g&&r.jsx("button",{type:"button",...g,draggable:!0,"aria-label":j("playlistItem.dragReorder","Drag to reorder"),title:j("playlistItem.dragReorder","Drag to reorder"),style:tr,children:r.jsx(F.NtdMenu,{size:14})}),r.jsx("button",{type:"button",onClick:x,disabled:!w||v,"aria-label":j("playlistItem.moveUp","Move up"),title:j("playlistItem.moveUp","Move up"),style:tr,children:r.jsx(F.NtdArrowUp,{size:14})}),r.jsx("button",{type:"button",onClick:b,disabled:!R||v,"aria-label":j("playlistItem.moveDown","Move down"),title:j("playlistItem.moveDown","Move down"),style:tr,children:r.jsx(F.NtdArrowDown,{size:14})}),r.jsx("button",{type:"button",onClick:m,disabled:v,"aria-label":j("common.delete","Delete"),title:j("common.delete","Delete"),style:{...tr,color:"var(--nice-color-danger, #b91c1c)"},children:r.jsx(F.NtdClose,{size:14})})]})]})},ff={width:48,border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:6,padding:"8px 6px",fontSize:14,textAlign:"center"},na={width:"100%",border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:6,padding:"8px 10px",fontSize:14},tr={border:"1px solid var(--nice-border, #d1d5db)",background:"var(--nice-bg, #fff)",padding:"6px 8px",borderRadius:6,cursor:"pointer"},xa=()=>Math.random().toString(36).slice(2,10),nr=e=>(e??[]).map(t=>({id:xa(),...t})),mf=e=>e.map(({id:t,...n})=>n),gf=null,yf=e=>{const t=e.trim();if(!t)return null;const n=t.split(/\s[-–—]\s/);if(n.length<2){const o=t.split(/[;|]/).map(l=>l.trim());return o.length>=2?{artist:o[0],title:o[1],version:o[2]||void 0}:null}const a=n[0].trim(),s=n.slice(1).join(" - ").trim(),i=s.match(/^(.*?)\s*[([](.+?)[)\]]\s*$/);if(i){const o=i[1].trim(),l=i[2].trim();return{artist:a,title:o,version:l||void 0}}return{artist:a,title:s,version:void 0}},vf=({value:e,defaultValue:t,onChange:n,allowVersion:a=!0,maxItems:s,addButtonLabel:i,emptyState:o=gf,readOnly:l=!1,autoFocusNewItem:c=!0,enableBulkPaste:u=!0})=>{const{t:h}=xe(),p=e!==void 0,[g,y]=d.useState(()=>nr(e||t)),[m,x]=d.useState(""),b=d.useRef(null),[f,k]=d.useState(null);d.useEffect(()=>{p&&y(nr(e))},[p,JSON.stringify(e)]);const v=d.useCallback(V=>{n==null||n(mf(V))},[n]),w=d.useCallback(V=>{if(p){const K=V(nr(e));v(K)}else y(K=>{const G=V(K);return v(G),G})},[v,p,e]),R=s?g.length<s:!0,M=d.useCallback(()=>{!R||l||w(V=>[...V,{id:xa(),artist:"",title:"",version:void 0}])},[R,l,w]),j=d.useCallback((V,K)=>{w(G=>G.map(W=>W.id===V?{...W,...K}:W))},[w]),T=d.useCallback(V=>{l||w(K=>K.filter(G=>G.id!==V))},[l,w]),P=d.useCallback((V,K)=>{w(G=>{const W=G.findIndex(B=>B.id===V);if(W<0)return G;const C=W+K;if(C<0||C>=G.length)return G;const $=[...G],[S]=$.splice(W,1);return $.splice(C,0,S),$})},[w]),A=d.useCallback((V,K)=>{w(G=>{const W=G.findIndex(B=>B.id===V);if(W<0)return G;const C=Math.max(0,Math.min(G.length-1,K-1));if(W===C)return G;const $=[...G],[S]=$.splice(W,1);return $.splice(C,0,S),$})},[w]),I=V=>K=>{l||(b.current=V,K.dataTransfer.effectAllowed="move",K.dataTransfer.setData("text/plain",V))},L=V=>K=>{l||(K.preventDefault(),K.dataTransfer.dropEffect="move",k(V))},N=V=>()=>k(K=>K===V?null:K),_=V=>K=>{if(l)return;K.preventDefault();const G=b.current??K.dataTransfer.getData("text/plain");k(null),b.current=null,!(!G||G===V)&&w(W=>{const C=W.findIndex(H=>H.id===G),$=W.findIndex(H=>H.id===V);if(C<0||$<0||C===$)return W;const S=[...W],[B]=S.splice(C,1);return S.splice($,0,B),S})},ee=()=>{b.current=null,k(null)},Y=d.useCallback(()=>{if(!u||l)return;const K=m.split(/\r?\n/).map(G=>G.trim()).filter(Boolean).map(yf).filter(G=>!!G);K.length!==0&&(w(G=>{const W=(s??1/0)-G.length,C=K.slice(0,Math.max(0,W)).map($=>({id:xa(),...$}));return[...G,...C]}),x(""))},[u,l,m,s,w]);d.useEffect(()=>{},[g.length,c]);const O=o??r.jsx("div",{style:{padding:"0.75rem",color:"var(--nice-text-secondary, #777)",fontStyle:"italic"},children:h("genericPlaylist.emptyState","No songs. Add the first one below.")}),U=i??h("genericPlaylist.addSong","Add song");return r.jsxs("div",{className:"gp-container",style:{border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:8,padding:12},children:[r.jsxs("div",{className:"gp-header",style:{display:"flex",alignItems:"center",gap:8,marginBottom:8},children:[r.jsx("h3",{style:{margin:0,fontSize:16},children:h("genericPlaylist.playlist","Playlist")}),r.jsx("div",{style:{marginLeft:"auto",display:"flex",gap:8},children:r.jsxs("button",{type:"button",onClick:M,disabled:!R||l,className:"gp-add",style:{padding:"6px 10px",borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)",background:"var(--nice-bg-secondary, #f9fafb)"},"aria-label":U,children:["+ ",U]})})]}),g.length===0?r.jsx("div",{className:"gp-empty",children:O}):r.jsx("ol",{className:"gp-list",style:{listStyle:"none",padding:0,margin:0,display:"grid",gap:8},children:g.map((V,K)=>{const G=f===V.id;return r.jsx("li",{draggable:!l,onDragStart:I(V.id),onDragOver:L(V.id),onDragLeave:N(V.id),onDrop:_(V.id),onDragEnd:ee,style:{border:G?"2px dashed var(--nice-info, #6366f1)":"2px solid transparent",borderRadius:8,padding:G?4:0},children:r.jsx(Qa,{data:{id:V.id,index:K,lp:K+1,artist:V.artist,title:V.title,version:a?V.version??void 0:void 0,sourcesAvailable:void 0},display:{allowVersion:a,dragHandleProps:{onDragStart:I(V.id)}},callbacks:{onChange:W=>j(V.id,W),onRemove:()=>T(V.id),onMoveUp:()=>P(V.id,-1),onMoveDown:()=>P(V.id,1),onChangeLp:W=>A(V.id,W)},state:{readOnly:l,canMoveUp:K>0,canMoveDown:K<g.length-1}})},V.id)})}),u&&!l&&r.jsx("div",{style:{marginTop:12},children:r.jsxs("details",{children:[r.jsx("summary",{style:{cursor:"pointer",color:"var(--nice-text, #374151)"},children:h("genericPlaylist.bulkPasteSummary","Paste multiple items at once")}),r.jsxs("div",{style:{marginTop:6},children:[r.jsx("textarea",{value:m,onChange:V=>x(V.target.value),placeholder:h("genericPlaylist.bulkPastePlaceholder",`Paste lines in format:
65
+ `}),r.jsxs("div",{ref:j,style:Q.container,children:[r.jsxs("div",{style:Q.header,children:[r.jsxs("h1",{style:{...Q.title,display:"inline-flex",alignItems:"center",gap:8},children:[r.jsx(B.NtdBarChart,{size:26})," ",f("vocalReport.title","Vocal Performance Report")]}),r.jsxs("p",{style:Q.subtitle,children:[T.songArtist," — ",T.songTitle,"  | ",f("vocalReport.difficulty","Difficulty"),": ",r.jsx("strong",{children:T.difficulty})," "," | ",new Date(T.timestamp).toLocaleString()]}),r.jsxs("div",{style:{marginTop:16,display:"flex",justifyContent:"center",alignItems:"center",gap:16},children:[r.jsx("div",{style:{width:72,height:72,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:`linear-gradient(135deg, ${mt(I)}44, ${mt(I)})`,border:`3px solid ${mt(I)}`,boxShadow:`0 0 20px ${mt(I)}44`},children:r.jsx("span",{style:{fontSize:28,fontWeight:900,color:"#fff"},children:L})}),r.jsxs("div",{style:{textAlign:"left"},children:[r.jsxs("div",{style:{fontSize:14,fontWeight:700,color:mt(I)},children:[f("vocalReport.overallGrade","Overall grade"),": ",I.toFixed(1),"%"]}),r.jsx("div",{style:{fontSize:12,color:"var(--nice-text-muted, #94a3b8)",maxWidth:360},children:P[L]??""})]})]})]}),r.jsxs("div",{style:{display:"flex",gap:10,justifyContent:"flex-end",marginBottom:16,flexWrap:"wrap"},children:[r.jsxs("button",{style:Q.btnPrimary,onClick:N,children:[r.jsx(B.NtdDownload,{size:14})," ",f("vocalReport.downloadHtml","Download HTML")]}),r.jsxs("button",{style:Q.btnSecondary,onClick:M,children:[r.jsx(B.NtdPrint,{size:14})," ",f("vocalReport.printPdf","Print / PDF")]}),r.jsxs("button",{style:Q.btnSecondary,onClick:k,children:[r.jsx(B.NtdCode,{size:14})," ",f("vocalReport.exportJson","Export JSON")]}),r.jsxs("button",{style:Q.btnSecondary,onClick:u,children:[r.jsx(B.NtdClose,{size:14})," ",f("vocalReport.close","Close")]})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.scoreOverview","Score overview")]}),r.jsxs("div",{style:Q.kpiGrid,children:[r.jsxs("div",{style:Q.kpiCard,children:[r.jsx("div",{style:Q.kpiValue,children:T.totalScore.toLocaleString()}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.totalScore","Total score")})]}),r.jsxs("div",{style:Q.kpiCard,children:[r.jsx("div",{style:Q.kpiValue,children:T.classicScore.toLocaleString()}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.classicScore","Classic score")})]}),r.jsxs("div",{style:Q.kpiCard,children:[r.jsx("div",{style:Q.kpiValue,children:T.bonusScore.toLocaleString()}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.bonusScore","Bonus score")})]}),r.jsxs("div",{style:Q.kpiCard,children:[r.jsxs("div",{style:Q.kpiValue,children:[T.maxCombo,"×"]}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.maxCombo","Max combo")})]}),r.jsxs("div",{style:Q.kpiCard,children:[r.jsxs("div",{style:{...Q.kpiValue,color:mt(T.intonationAccuracyPct)},children:[T.intonationAccuracyPct,"%"]}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.intonationAccuracy","Intonation accuracy")})]}),r.jsxs("div",{style:Q.kpiCard,children:[r.jsxs("div",{style:{...Q.kpiValue,color:mt(T.perfectHitPct)},children:[T.perfectHitPct,"%"]}),r.jsx("div",{style:Q.kpiLabel,children:f("vocalReport.perfectHits","Perfect hits")})]})]}),C.length>1&&r.jsxs(r.Fragment,{children:[r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.playerComparison","Player comparison")]}),r.jsxs("table",{style:Q.table,children:[r.jsx("thead",{children:r.jsxs("tr",{children:[r.jsx("th",{style:Q.th,children:"#"}),r.jsx("th",{style:Q.th,children:f("vocalReport.player","Player")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.classic","Classic")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.bonus","Bonus")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.total","Total")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.intonation","Intonation")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.perfect","Perfect")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.range","Range")})]})}),r.jsx("tbody",{children:C.map((S,F)=>r.jsxs("tr",{children:[r.jsx("td",{style:Q.td,children:F+1}),r.jsx("td",{style:{...Q.tdBold,color:S.playerColor},children:S.playerName}),r.jsx("td",{style:Q.tdRight,children:S.classicScore.toLocaleString()}),r.jsx("td",{style:Q.tdRight,children:S.bonusScore.toLocaleString()}),r.jsx("td",{style:{...Q.tdRight,fontWeight:700,color:"var(--nice-warning, #fbbf24)"},children:S.totalScore.toLocaleString()}),r.jsx("td",{style:Q.tdRight,children:r.jsxs("span",{style:Q.badge(mt(S.intonationAccuracyPct)),children:[S.intonationAccuracyPct,"%"]})}),r.jsx("td",{style:Q.tdRight,children:r.jsxs("span",{style:Q.badge(mt(S.perfectHitPct)),children:[S.perfectHitPct,"%"]})}),r.jsxs("td",{style:Q.tdRight,children:[S.lowestNote,"–",S.highestNote]})]},F))})]})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.pitchAccuracy","Pitch accuracy")]}),r.jsxs("table",{style:Q.table,children:[r.jsx("thead",{children:r.jsxs("tr",{children:[r.jsx("th",{style:Q.th,children:f("vocalReport.metric","Metric")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.value","Value")}),r.jsx("th",{style:Q.th,children:f("vocalReport.description","Description")})]})}),r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.meanAbsDev","Mean abs. deviation")}),r.jsxs("td",{style:Q.tdRight,children:[T.avgCentDeviation,r.jsxs("span",{style:Q.kpiUnit,children:[" ",R]})]}),r.jsx("td",{style:Q.td,children:f("vocalReport.meanAbsDevDesc","Average distance from the target pitch.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.medianDev","Median deviation")}),r.jsxs("td",{style:Q.tdRight,children:[T.medianCentDeviation,r.jsxs("span",{style:Q.kpiUnit,children:[" ",R]})]}),r.jsx("td",{style:Q.td,children:f("vocalReport.medianDevDesc","Typical deviation, robust to outliers.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.stdDev","Std. deviation")}),r.jsxs("td",{style:Q.tdRight,children:[T.stdDevCents,r.jsxs("span",{style:Q.kpiUnit,children:[" ",R]})]}),r.jsx("td",{style:Q.td,children:f("vocalReport.stdDevDesc","Consistency of pitch (lower = steadier).")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.intonationAccuracyLabel","Intonation accuracy")}),r.jsxs("td",{style:{...Q.tdRight,color:mt(T.intonationAccuracyPct)},children:[T.intonationAccuracyPct,"%"]}),r.jsx("td",{style:Q.td,children:f("vocalReport.intonationAccuracyDesc","Share of frames within tolerance.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.perfectHitRate","Perfect-hit rate")}),r.jsxs("td",{style:{...Q.tdRight,color:mt(T.perfectHitPct)},children:[T.perfectHitPct,"%"]}),r.jsx("td",{style:Q.td,children:f("vocalReport.perfectHitRateDesc","Notes hit dead-on.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.totalPitchSamples","Total pitch samples")}),r.jsx("td",{style:Q.tdRight,children:T.totalPitchPoints.toLocaleString()}),r.jsx("td",{style:Q.td,children:f("vocalReport.totalPitchSamplesDesc","Number of analysed pitch frames.")})]})]})]}),r.jsxs("div",{style:Q.chartWrap,children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.deviationDistribution","Deviation distribution")}),r.jsx("div",{style:{height:220},children:r.jsx(ie.NiceChart,{width:860,height:220,stacked:!0,showLegend:!1,categories:G.map(S=>S.centRange),series:Ks(G.map(S=>`${Z} (${S.centRange})`),G.map(S=>S.count),G.map(S=>Xh(S.centRange)))})})]}),r.jsxs("div",{style:Q.row,children:[r.jsxs("div",{style:{...Q.chartWrap,...Q.half},children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.hitClassification","Hit classification")}),r.jsx("div",{style:{height:220},children:r.jsx(ie.NicePieChart,{width:400,height:260,data:K.map(S=>({label:S.name,value:Vt(S.value),color:S.fill}))})})]}),r.jsxs("div",{style:{...Q.chartWrap,...Q.half},children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.performanceProfile","Performance profile")}),r.jsx("div",{style:{height:220},children:r.jsx(ie.NiceChart,{width:400,height:220,showLegend:!1,categories:ee.map(S=>S.metric),series:[{name:f("vocalReport.performanceProfile","Performance profile"),type:"radar",color:"var(--nice-info, #3b82f6)",data:ee.map(S=>Vt(S.value))},{name:"100%",type:"radar",color:"transparent",data:ee.map(S=>S.max)}]})})]})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.pitchTracking","Pitch tracking")]}),r.jsxs("div",{style:Q.chartWrap,children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.sungVsExpected","Sung vs expected")}),r.jsx("div",{style:{height:260},children:r.jsx(ie.NiceChart,{width:860,height:230,categories:Zs(W.map(S=>S.t)),series:[{name:f("vocalReport.expected","Expected"),type:"line",color:"var(--nice-success, #22c55e)",data:W.map(S=>Vt(S.expected))},{name:f("vocalReport.sung","Sung"),type:"line",color:"var(--nice-info, #3b82f6)",data:W.map(S=>Vt(S.sung))}]})})]}),r.jsxs("div",{style:Q.chartWrap,children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.rollingAccuracy","Rolling accuracy")}),r.jsx("div",{style:{height:180},children:r.jsx(ie.NiceChart,{width:860,height:180,showLegend:!1,categories:Zs(H.map(S=>S.t)),series:[{name:f("vocalReport.rollingAccuracy","Rolling accuracy"),type:"area",color:"var(--nice-accent, #8b5cf6)",data:H.map(S=>Vt(S.accuracy))}]})})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.vocalRange","Vocal range")]}),r.jsxs("div",{style:Q.row,children:[r.jsx("div",{style:Q.half,children:r.jsx("table",{style:Q.table,children:r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.lowestNote","Lowest note")}),r.jsx("td",{style:Q.tdRight,children:f("vocalReport.hz","{lowestNote} ({lowestHz} Hz)").replace("{lowestNote}",String(T.lowestNote)).replace("{lowestHz}",String(T.lowestHz))})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.highestNote","Highest note")}),r.jsx("td",{style:Q.tdRight,children:f("vocalReport.hz2","{highestNote} ({highestHz} Hz)").replace("{highestNote}",String(T.highestNote)).replace("{highestHz}",String(T.highestHz))})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.rangeLabel","Range")}),r.jsxs("td",{style:Q.tdRight,children:[T.rangeInSemitones," ",f("vocalReport.semitones","semitones")]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.tessitura","Tessitura")}),r.jsxs("td",{style:Q.tdRight,children:[T.tessituraLow," — ",T.tessituraHigh]})]})]})})}),r.jsxs("div",{style:{...Q.chartWrap,...Q.half},children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.chromagram","Chromagram")}),r.jsx("div",{style:{height:180},children:r.jsx(ie.NiceChart,{width:400,height:180,showLegend:!1,categories:z.map(S=>S.note),series:[{name:f("vocalReport.usagePct","Usage %"),type:"bar",color:"var(--nice-primary, #6366f1)",data:z.map(S=>Vt(S.pct))}]})})]})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.vibratoStability","Vibrato & stability")]}),r.jsxs("div",{style:Q.row,children:[r.jsx("div",{style:Q.half,children:r.jsx("table",{style:Q.table,children:r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.vibratoDetected","Vibrato detected")}),r.jsx("td",{style:Q.tdRight,children:r.jsx("span",{style:Q.badge(T.vibrato.detected?"var(--nice-success, #22c55e)":"var(--nice-text-muted, #64748b)"),children:T.vibrato.detected?f("vocalReport.yes","Yes"):f("vocalReport.no","No")})})]}),T.vibrato.detected&&r.jsxs(r.Fragment,{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.avgRate","Avg. rate")}),r.jsxs("td",{style:Q.tdRight,children:[T.vibrato.avgRateHz," Hz"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.avgExtent","Avg. extent")}),r.jsxs("td",{style:Q.tdRight,children:["±",T.vibrato.avgExtentCents," ",R]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.regularity","Regularity")}),r.jsxs("td",{style:Q.tdRight,children:[T.vibrato.regularityPct,"%"]})]})]})]})})}),r.jsx("div",{style:Q.half,children:r.jsx("table",{style:Q.table,children:r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.jitter","Jitter")}),r.jsxs("td",{style:Q.tdRight,children:[T.jitterPct,"%"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.vocalPresence","Vocal presence")}),r.jsxs("td",{style:Q.tdRight,children:[T.shimmerProxy,"%"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.avgOnsetDev","Avg. onset deviation")}),r.jsxs("td",{style:Q.tdRight,children:[T.avgOnsetDeviationMs," ms"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.rhythmStability","Rhythm stability")}),r.jsx("td",{style:Q.tdRight,children:r.jsxs("span",{style:Q.badge(mt(T.rhythmStabilityPct)),children:[T.rhythmStabilityPct,"%"]})})]})]})})})]}),T.verseMetrics.length>0&&r.jsxs(r.Fragment,{children:[r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.verseBreakdown","Per-verse breakdown")]}),r.jsxs("div",{style:Q.chartWrap,children:[r.jsx("div",{style:Q.chartTitle,children:f("vocalReport.accuracyByVerse","Accuracy by verse")}),r.jsx("div",{style:{height:200},children:r.jsx(ie.NiceChart,{width:860,height:200,stacked:!0,showLegend:!1,categories:V.map(S=>S.verse),series:Ks(V.map(S=>`${w} (${S.verse})`),V.map(S=>S.accuracy),V.map(S=>Hs(S.label)))})})]}),r.jsxs("table",{style:Q.table,children:[r.jsx("thead",{children:r.jsxs("tr",{children:[r.jsx("th",{style:Q.th,children:f("vocalReport.verse","Verse")}),r.jsx("th",{style:Q.th,children:f("vocalReport.rating","Rating")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.hitPct","Hit %")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.avgDeviation","Avg. dev.")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.notes","Notes")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.notesHit","Hit")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.comboBonus","Combo bonus")})]})}),r.jsx("tbody",{children:T.verseMetrics.map((S,F)=>r.jsxs("tr",{children:[r.jsxs("td",{style:Q.td,children:[f("vocalReport.verse","Verse")," ",S.verseIndex+1]}),r.jsx("td",{style:Q.td,children:r.jsx("span",{style:Q.badge(Hs(S.label)),children:S.label})}),r.jsxs("td",{style:Q.tdRight,children:[(S.hitFraction*100).toFixed(1),"%"]}),r.jsxs("td",{style:Q.tdRight,children:[S.avgCentDeviation," ¢"]}),r.jsx("td",{style:Q.tdRight,children:S.noteCount}),r.jsx("td",{style:Q.tdRight,children:S.notesHit}),r.jsxs("td",{style:Q.tdRight,children:["+",S.comboBonus]})]},F))})]})]}),r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.scoringConfig","Scoring configuration")]}),r.jsxs("table",{style:Q.table,children:[r.jsx("thead",{children:r.jsxs("tr",{children:[r.jsx("th",{style:Q.th,children:f("vocalReport.parameter","Parameter")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.value","Value")}),r.jsx("th",{style:Q.th,children:f("vocalReport.description","Description")})]})}),r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.difficultyLevel","Difficulty level")}),r.jsx("td",{style:Q.tdRight,children:T.difficulty}),r.jsx("td",{style:Q.td,children:f("vocalReport.difficultyLevelDesc","Affects tolerance and multiplier.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.semitoneTolerance","Semitone tolerance")}),r.jsx("td",{style:Q.tdRight,children:A.semitoneTolerance}),r.jsx("td",{style:Q.td,children:f("vocalReport.semitoneToleranceDesc","Pitch window counted as a hit.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.preWindow","Pre window")}),r.jsxs("td",{style:Q.tdRight,children:[A.preWindow," s"]}),r.jsx("td",{style:Q.td,children:f("vocalReport.preWindowDesc","Lead-in time before a note.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.postExtra","Post extra")}),r.jsxs("td",{style:Q.tdRight,children:[A.postExtra," s"]}),r.jsx("td",{style:Q.td,children:f("vocalReport.postExtraDesc","Grace time after a note.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.difficultyMultiplier","Difficulty multiplier")}),r.jsxs("td",{style:Q.tdRight,children:[A.difficultyMult,"×"]}),r.jsx("td",{style:Q.td,children:f("vocalReport.difficultyMultiplierDesc","Score scaling for difficulty.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.songBpm","Song BPM")}),r.jsx("td",{style:Q.tdRight,children:T.songBpm}),r.jsx("td",{style:Q.td,children:f("vocalReport.songBpmDesc","Tempo used for note timing.")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.totalNotes","Total notes")}),r.jsx("td",{style:Q.tdRight,children:E}),r.jsx("td",{style:Q.td,children:f("vocalReport.totalNotesDesc","Number of scored notes in the song.")})]})]})]}),C.some(S=>S.micSettings)&&r.jsxs(r.Fragment,{children:[r.jsxs("h2",{style:Q.sectionTitle,children:[++_,". ",f("vocalReport.micConfig","Microphone configuration")]}),C.map((S,F)=>S.micSettings&&r.jsxs("div",{style:{marginBottom:16},children:[C.length>1&&r.jsx("h4",{style:{color:S.playerColor,margin:"0 0 8px",fontSize:14},children:S.playerName}),r.jsxs("table",{style:Q.table,children:[r.jsx("thead",{children:r.jsxs("tr",{children:[r.jsx("th",{style:Q.th,children:f("vocalReport.setting","Setting")}),r.jsx("th",{style:Q.thRight,children:f("vocalReport.value","Value")})]})}),r.jsxs("tbody",{children:[r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.device","Device")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.deviceLabel||S.micSettings.deviceId})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.pitchAlgorithm","Pitch algorithm")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.algorithm})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.inputGain","Input gain")}),r.jsxs("td",{style:Q.tdRight,children:[S.micSettings.gain,"×"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.rmsThreshold","RMS threshold")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.rmsThreshold})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.pitchThreshold","Pitch threshold")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.pitchThreshold})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.smoothingWindow","Smoothing window")}),r.jsxs("td",{style:Q.tdRight,children:[S.micSettings.smoothingWindow," ",f("vocalReport.frames","frames")]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.hysteresisFrames","Hysteresis frames")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.hysteresisFrames})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.hanningWindow","Hanning window")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.useHanning?f("vocalReport.enabled","Enabled"):f("vocalReport.disabled","Disabled")})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.latencyOffset","Latency offset")}),r.jsxs("td",{style:Q.tdRight,children:[S.micSettings.latencyOffsetMs," ms"]})]}),r.jsxs("tr",{children:[r.jsx("td",{style:Q.tdBold,children:f("vocalReport.monitor","Monitor")}),r.jsx("td",{style:Q.tdRight,children:S.micSettings.monitorEnabled?`${f("vocalReport.on","On")} (${Math.round(S.micSettings.monitorVolume*100)}%)`:f("vocalReport.off","Off")})]})]})]})]},F))]}),r.jsx("div",{style:Q.footer,children:r.jsxs("p",{children:[f("vocalReport.footerGenerated","Report generated")," ·"," ",T.timestamp.replace(/[-:T.Z]/g,"").slice(0,14)]})})]})]})},Jh="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100'%3E%3Crect width='100' height='100' fill='%23334155'/%3E%3Ccircle cx='42' cy='64' r='8' fill='%2394a3b8'/%3E%3Crect x='48' y='34' width='3' height='32' fill='%2394a3b8'/%3E%3C/svg%3E";function ep(e){if(!e)return"";const t=Math.floor(e/60),n=Math.round(e%60);return`${t}:${n.toString().padStart(2,"0")}`}function Qs(e){return Array.from(new Set(e.filter(t=>!!t))).sort((t,n)=>t.localeCompare(n))}const tp=Object.assign(d.memo(({song:e,index:t,active:n,coverUrl:a,topScore:s,selected:i,multiSelect:o,disabled:l,t:c,onPlay:u,onToggleSelect:h,onFocusRow:p})=>{const g=()=>{o?h(e.id):l||u==null||u(e)};return r.jsxs("div",{className:`nice-ksb-row${i?" nice-ksb-row--selected":""}${n?" nice-ksb-row--active":""}`,role:"option","aria-selected":i,"data-ksb-index":t,tabIndex:n?0:-1,onClick:g,onFocus:()=>p(t),onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.preventDefault(),g())},children:[o&&r.jsx("input",{type:"checkbox",className:"nice-ksb-row__check",checked:i,onChange:()=>h(e.id),onClick:y=>y.stopPropagation(),"aria-label":e.title}),r.jsx("img",{className:"nice-ksb-row__cover",src:a,alt:"",loading:"lazy"}),r.jsxs("div",{className:"nice-ksb-row__main",children:[r.jsx("div",{className:"nice-ksb-row__title",children:e.title}),r.jsx("div",{className:"nice-ksb-row__artist",children:e.artist||"—"})]}),r.jsxs("div",{className:"nice-ksb-row__meta",children:[e.genre&&r.jsx("span",{className:"nice-ksb-badge",children:e.genre}),e.year&&r.jsx("span",{className:"nice-ksb-badge",children:e.year}),e.durationSec?r.jsx("span",{className:"nice-ksb-badge",children:ep(e.durationSec)}):null,e.externalSource&&r.jsx("span",{className:"nice-ksb-badge nice-ksb-badge--src",children:e.externalSource}),s&&r.jsxs("span",{className:"nice-ksb-badge nice-ksb-badge--score",title:s.playerName,children:[r.jsx(B.NtdTrophy,{size:11})," ",s.score.toLocaleString()]})]}),!o&&r.jsxs("button",{type:"button",className:"nice-ksb-row__play",disabled:l,onClick:y=>{y.stopPropagation(),u==null||u(e)},children:[r.jsx(B.NtdPlay,{size:13})," ",c("karaokeBrowser.play","Play")]})]})}),{displayName:"NiceKaraokeSongRow"}),np={artist:"Artist",title:"Title",year:"Year",genre:"Genre"},rp=({songs:e,fetchSongs:t,loading:n=!1,getCover:a,getTopScore:s,onPlay:i,onSelect:o,multiSelect:l=!1,maxSelections:c=0,showSidebar:u=!0,enableGamepad:h=!0,disabled:p=!1,disabledReason:g,t:y,className:m,style:x,id:b,accessMode:f,"data-testid":j})=>{const{t:v}=xe(),C=y??v,[N,M]=d.useState(""),[k,T]=d.useState(""),[E,A]=d.useState(""),[I,L]=d.useState(""),[P,_]=d.useState("artist"),[ee,K]=d.useState("asc"),[z,V]=d.useState({type:"all"}),[W,H]=d.useState(new Set),[G,Z]=d.useState([]),[w,R]=d.useState(!1);d.useEffect(()=>{const he=setTimeout(()=>T(N),300);return()=>clearTimeout(he)},[N]),d.useEffect(()=>{if(e||!t)return;let he=!1;return R(!0),Promise.resolve(t({searchQuery:k.trim()||void 0,genres:E?[E]:void 0,languages:I?[I]:void 0})).then(we=>!he&&Z(we)).catch(()=>!he&&Z([])).finally(()=>!he&&R(!1)),()=>{he=!0}},[e,t,k,E,I]);const S=e??G,F=d.useMemo(()=>Qs(S.map(he=>he.genre)),[S]),Y=d.useMemo(()=>Qs(S.map(he=>he.language)),[S]),O=d.useMemo(()=>{let he=S;const we=k.trim().toLowerCase();we&&(he=he.filter(Pe=>`${Pe.title} ${Pe.artist}`.toLowerCase().includes(we))),E&&(he=he.filter(Pe=>Pe.genre===E)),I&&(he=he.filter(Pe=>Pe.language===I)),z.type==="genre"&&(he=he.filter(Pe=>Pe.genre===z.value)),z.type==="language"&&(he=he.filter(Pe=>Pe.language===z.value));const je=ee==="asc"?1:-1;return[...he].sort((Pe,$e)=>{const Ye=Pe[P]??"",ue=$e[P]??"";return typeof Ye=="number"&&typeof ue=="number"?(Ye-ue)*je:String(Ye).localeCompare(String(ue))*je})},[S,k,E,I,z,P,ee]),U=he=>{H(we=>{const je=new Set(we);return je.has(he)?je.delete(he):(c===0||je.size<c)&&je.add(he),je})},$=()=>{const he=S.filter(we=>W.has(we.id));o==null||o({songs:he})},q=n||w,X=he=>{he===P?K(we=>we==="asc"?"desc":"asc"):(_(he),K("asc"))},re=d.useRef(null),[oe,se]=d.useState(0),D=d.useRef(0),J=d.useRef(O);J.current=O,d.useEffect(()=>{se(he=>{const we=Math.min(Math.max(0,he),Math.max(0,O.length-1));return D.current=we,we})},[O.length]);const ae=d.useCallback(he=>{var je;const we=(je=re.current)==null?void 0:je.querySelector(`[data-ksb-index="${he}"]`);we==null||we.focus(),we==null||we.scrollIntoView({block:"nearest"})},[]),ce=d.useCallback(he=>{D.current=he,se(he)},[]),le=d.useCallback((he,we=!0)=>{const je=J.current.length;if(je===0)return;const Pe=Math.min(je-1,Math.max(0,he));D.current=Pe,se(Pe),we&&requestAnimationFrame(()=>ae(Pe))},[ae]),ne=d.useCallback(he=>le(D.current+he),[le]),pe=he=>{const we=J.current[he];we&&(l?U(we.id):p||i==null||i(we))},fe=he=>{switch(he.key){case"ArrowDown":he.preventDefault(),ne(1);break;case"ArrowUp":he.preventDefault(),ne(-1);break;case"Home":he.preventDefault(),le(0);break;case"End":he.preventDefault(),le(J.current.length-1);break;case"PageDown":he.preventDefault(),ne(5);break;case"PageUp":he.preventDefault(),ne(-5);break}},ge=ve.useGamepad({enabled:h,actions:{navUp:{button:"DpadUp",onPress:()=>ne(-1),repeatDelay:350,repeatRate:110},navDown:{button:"DpadDown",onPress:()=>ne(1),repeatDelay:350,repeatRate:110},stickUp:{axis:"LeftY",axisDirection:"negative",onPress:()=>ne(-1),repeatDelay:350,repeatRate:130},stickDown:{axis:"LeftY",axisDirection:"positive",onPress:()=>ne(1),repeatDelay:350,repeatRate:130},select:{button:"A",onPress:()=>pe(D.current)},confirm:{button:"Start",onPress:()=>{l&&$()}}}});return f==="hidden"?null:r.jsxs("div",{className:`nice-ksb${m?` ${m}`:""}`,style:x,id:b,"data-testid":j,children:[u&&r.jsxs("aside",{className:"nice-ksb__sidebar",children:[r.jsxs("button",{type:"button",className:`nice-ksb__node${z.type==="all"?" nice-ksb__node--active":""}`,onClick:()=>V({type:"all"}),children:[r.jsx(B.NtdMusic,{size:14})," ",C("karaokeBrowser.allSongs","All songs")," (",S.length,")"]}),F.length>0&&r.jsxs("div",{className:"nice-ksb__facet",children:[r.jsx("div",{className:"nice-ksb__facet-title",children:C("karaokeBrowser.genres","Genres")}),F.map(he=>r.jsx("button",{type:"button",className:`nice-ksb__node${z.type==="genre"&&z.value===he?" nice-ksb__node--active":""}`,onClick:()=>V({type:"genre",value:he}),children:he},he))]}),Y.length>0&&r.jsxs("div",{className:"nice-ksb__facet",children:[r.jsx("div",{className:"nice-ksb__facet-title",children:C("karaokeBrowser.languages","Languages")}),Y.map(he=>r.jsx("button",{type:"button",className:`nice-ksb__node${z.type==="language"&&z.value===he?" nice-ksb__node--active":""}`,onClick:()=>V({type:"language",value:he}),children:he},he))]})]}),r.jsxs("div",{className:"nice-ksb__main",children:[r.jsxs("div",{className:"nice-ksb__toolbar",children:[r.jsx("input",{className:"nice-ksb__search",type:"search",value:N,placeholder:C("karaokeBrowser.search","Search title or artist…"),onChange:he=>M(he.target.value)}),r.jsx("div",{className:"nice-ksb__sort",children:["artist","title","year","genre"].map(he=>r.jsxs("button",{type:"button",className:`nice-ksb__sort-btn${P===he?" nice-ksb__sort-btn--active":""}`,onClick:()=>X(he),children:[C(`karaokeBrowser.sort.${he}`,np[he]??he),P===he&&(ee==="asc"?r.jsx(B.NtdChevronUp,{size:12}):r.jsx(B.NtdChevronDown,{size:12}))]},he))}),r.jsxs("span",{className:`nice-ksb__navhint${ge.connected?" nice-ksb__navhint--pad":""}`,title:C("karaokeBrowser.navHint","Navigate with ↑ ↓ or the D-pad · Enter / A to play"),children:[ge.connected?r.jsx(B.NtdGamepad,{size:14}):r.jsx(B.NtdMove,{size:14}),r.jsx("span",{className:"nice-ksb__navhint-keys",children:ge.connected?"D-pad · A":"↑ ↓ · Enter"})]})]}),p&&g&&r.jsx("div",{className:"nice-ksb__disabled",children:g}),r.jsx("div",{className:"nice-ksb__list",role:"listbox","aria-multiselectable":l,"aria-label":C("karaokeBrowser.songs","Songs"),ref:re,onKeyDown:fe,children:q?r.jsx("div",{className:"nice-ksb__empty",children:C("karaokeBrowser.loading","Loading…")}):O.length===0?r.jsx("div",{className:"nice-ksb__empty",children:C("karaokeBrowser.noResults","No songs found")}):O.map((he,we)=>r.jsx(tp,{song:he,index:we,active:we===oe,coverUrl:(a==null?void 0:a(he))||he.coverImage||he.externalCoverUrl||he.coverPath||Jh,topScore:s==null?void 0:s(he),selected:W.has(he.id),multiSelect:l,disabled:p,t:C,onPlay:i,onToggleSelect:U,onFocusRow:ce},he.id))}),l&&r.jsxs("div",{className:"nice-ksb__footer",children:[r.jsxs("span",{children:[W.size,c>0?` / ${c}`:""," ",C("karaokeBrowser.selected","selected")]}),r.jsx("button",{type:"button",className:"nice-ksb__confirm",disabled:W.size===0,onClick:$,children:C("karaokeBrowser.confirm","Add selected")})]})]})]})};function ll(e,t,n=50,a=30){const s=Math.round(e/1e3*t),i=Math.round(n/1e3*t),o=Math.max(1,Math.round(a/1e3*t)),l=new Float32Array(s);for(let c=0;c<o;c++){const u=.5*(1-Math.cos(2*Math.PI*c/(o-1))),h=i+c-Math.floor(o/2);h>=0&&h<s&&(l[h]=u)}return l}function Js(e,t,n=1e3){const a=Math.max(1,Math.round(t/n)),s=Math.ceil(e.length/a),i=new Float32Array(s);for(let l=0;l<s;l++){const c=l*a,u=Math.min(e.length,c+a);let h=0;for(let p=c;p<u;p++)h+=Math.abs(e[p]);i[l]=h/(u-c||1)}let o=0;for(let l=0;l<i.length;l++)i[l]>o&&(o=i[l]);if(o>0)for(let l=0;l<i.length;l++)i[l]=i[l]/o;return{env:i,factor:a}}function ap(e,t){const n=e.length,a=t.length;if(n===0||a===0)return 0;let s={lag:0,score:-1/0};const i=Math.min(2e3,a);for(let o=-i;o<=i;o++){let l=0,c=0,u=0;for(let g=0;g<n;g++){const y=g+o+Math.floor((a-n)/2);if(y<0||y>=a)continue;const m=e[g],x=t[y];l+=m*x,c+=m*m,u+=x*x}const h=Math.sqrt(Math.max(1e-9,c*u)),p=l/h;p>s.score&&(s={lag:o,score:p})}return s.lag}function cl(e,t,n=50,a=30){try{const s=Math.max(300,Math.round(e.length/t*1e3)),i=ll(s,t,n,a),o=Js(e,t,1e3),l=Js(i,t,1e3),u=ap(l.env,o.env)*1e3/1e3;return Math.round(u)}catch{return null}}const sp=({deviceId:e,initialOffsetMs:t=null,onSave:n,onClose:a,rounds:s=3,t:i,className:o,style:l,id:c,accessMode:u,"data-testid":h})=>{const{t:p}=xe(),g=i??p,[y,m]=d.useState(null),[x,b]=d.useState(t),[f,j]=d.useState(!1),[v,C]=d.useState([]),[N,M]=d.useState(0),[k,T]=d.useState(!1),E=d.useRef(!1);d.useEffect(()=>{b(t??null)},[t,e]);const A=async()=>{const _=await navigator.mediaDevices.getUserMedia({audio:{deviceId:e?{exact:e}:void 0,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}}),ee=new AudioContext,K=ee.sampleRate,z=ee.createMediaStreamSource(_),V=ee.createScriptProcessor(2048,1,1);z.connect(V),V.connect(ee.destination);const W=1200,H=Math.round(W/1e3*K),G=new Float32Array(H);let Z=0,w=!1;V.onaudioprocess=U=>{if(w)return;const $=U.inputBuffer.getChannelData(0),q=Math.min($.length,H-Z);q>0&&(G.set($.subarray(0,q),Z),Z+=q),Z>=H&&(w=!0)},await new Promise(U=>setTimeout(U,80));const R=new AudioContext,S=R.createOscillator(),F=R.createGain();S.type="sine",S.frequency.value=1e3,F.gain.value=1e-4,S.connect(F),F.connect(R.destination);const Y=R.currentTime+.05;F.gain.setValueAtTime(1e-4,Y-.01),F.gain.linearRampToValueAtTime(1,Y),F.gain.linearRampToValueAtTime(1e-4,Y+.06),S.start(Y-.02),S.stop(Y+.1),await new Promise(U=>{const $=()=>{if(w||Z>=H){U();return}setTimeout($,50)};setTimeout(()=>{w=!0,U()},W+500),$()}),V.onaudioprocess=null;try{V.disconnect()}catch{}try{z.disconnect()}catch{}try{await R.close()}catch{}try{await ee.close()}catch{}_.getTracks().forEach(U=>U.stop());const O=G.subarray(0,Z);return cl(O,K,130,30)},I=async()=>{if(!E.current){E.current=!0,T(!0),m(g("latencyCalibrator.requestingMic","Requesting microphone — click allow if prompted")),b(null),C([]),M(0);try{const _=[];for(let K=0;K<s;K++){m(`${g("latencyCalibrator.playingTone","Playing test tone and recording…")} (${K+1}/${s})`),M(Math.round(K/s*100));const z=await A();z!==null&&(_.push(Math.max(-500,Math.min(2e3,Math.round(z)))),C([..._])),K<s-1&&await new Promise(V=>setTimeout(V,400))}if(M(100),_.length===0){m(g("latencyCalibrator.noSignal","No signal detected — try louder or check the microphone"));return}let ee;if(_.length>=3){const z=[..._].sort((V,W)=>V-W).slice(1,-1);ee=Math.round(z.reduce((V,W)=>V+W,0)/z.length)}else ee=Math.round(_.reduce((K,z)=>K+z,0)/_.length);b(ee),m(`${g("latencyCalibrator.measured","Measured")} ~${ee} ms (${_.length}: ${_.join(", ")} ms)`)}catch(_){m(`${g("latencyCalibrator.calibrationError","Calibration error: ")}${_ instanceof Error?_.message:String(_)}`)}finally{E.current=!1,T(!1)}}},L=async()=>{if(!(x===null||!n)){j(!0);try{await n(Math.round(x)),m(g("latencyCalibrator.saved","Saved"))}catch(_){m(`${g("latencyCalibrator.saveError","Save error: ")}${String(_)}`)}finally{j(!1)}}},P={padding:"7px 16px",border:"none",borderRadius:8,cursor:"pointer",fontWeight:600};return u==="hidden"?null:r.jsxs("div",{className:`nice-latency-calibrator${o?` ${o}`:""}`,style:{padding:12,color:"var(--nice-text, inherit)",...l},id:c,"data-testid":h,children:[r.jsxs("h5",{style:{margin:"0 0 8px",display:"flex",alignItems:"center",gap:6},children:[r.jsx(B.NtdSettings,{size:16})," ",g("latencyCalibrator.title","Latency calibrator — microphone")]}),r.jsxs("div",{style:{fontSize:12,color:"var(--nice-text-muted, #94a3b8)"},children:[g("latencyCalibrator.device","Device"),": ",r.jsx("small",{children:e||"—"})]}),r.jsxs("div",{style:{marginTop:8,display:"flex",gap:8},children:[r.jsx("button",{type:"button",onClick:I,disabled:k,style:{...P,background:"var(--nice-accent, #3b82f6)",color:"var(--nice-text-on-primary, #fff)"},children:g("latencyCalibrator.calibrate","Calibrate")}),r.jsx("button",{type:"button",onClick:()=>{b(null),m(null),C([]),M(0)},style:{...P,background:"var(--nice-bg-tertiary)",color:"var(--nice-text, #e2e8f0)"},children:g("latencyCalibrator.clear","Clear")})]}),k&&r.jsx("div",{style:{marginTop:8,height:6,borderRadius:3,background:"var(--nice-bg-tertiary)",overflow:"hidden"},children:r.jsx("div",{style:{height:"100%",width:`${N}%`,background:"var(--nice-accent, #3b82f6)",transition:"width 0.2s"}})}),v.length>0&&r.jsxs("div",{style:{marginTop:6,fontSize:12,color:"var(--nice-text-muted, #94a3b8)"},children:[g("latencyCalibrator.rounds","Rounds"),": ",v.join(", ")," ms"]}),r.jsxs("div",{style:{marginTop:8,fontSize:13},children:[r.jsxs("div",{children:[g("latencyCalibrator.status","Status"),": ",y??g("latencyCalibrator.none","none")]}),r.jsxs("div",{children:[g("latencyCalibrator.measuredOffset","Measured offset"),":"," ",x!==null?r.jsxs("strong",{children:[x," ms"]}):"—"]})]}),r.jsxs("div",{style:{marginTop:12,display:"flex",gap:8},children:[n&&r.jsx("button",{type:"button",onClick:L,disabled:x===null||f,style:{...P,background:"var(--nice-success, #22c55e)",color:"var(--nice-text-on-primary, #fff)",opacity:x===null||f?.5:1},children:g("latencyCalibrator.save","Save")}),a&&r.jsx("button",{type:"button",onClick:a,style:{...P,background:"transparent",border:"1px solid var(--nice-border, #334155)",color:"var(--nice-text, #e2e8f0)"},children:g("latencyCalibrator.close","Close")})]})]})},ip=e=>[{value:"normal",label:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(B.NtdMicrophone,{size:14})," ",e("karaokeSetup.modeMic","Mic")]})},{value:"pad",label:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(B.NtdGamepad,{size:14})," ",e("karaokeSetup.modePad","Pad")]})},{value:"demo",label:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(B.NtdStopwatch,{size:14})," ",e("karaokeSetup.modeDemo","Demo")]})}],dl=({players:e,defaultPlayers:t,onPlayersChange:n,gameMode:a="normal",onGameModeChange:s,gameModes:i,difficulty:o="normal",onDifficultyChange:l,audioInputs:c,maxPlayers:u=4,onCalibrate:h,t:p,className:g,style:y,id:m,accessMode:x,"data-testid":b})=>{const{t:f}=xe(),j=p??f,v=d.useMemo(()=>i??ip(j),[i,j]),[C,N]=ve.useControllableState({value:e,defaultValue:t,fallbackValue:[],onChange:n,componentName:"NiceKaraokeSetupPanel"}),[M,k]=d.useState([]);d.useEffect(()=>{var ee,K,z;if(c||!((ee=navigator.mediaDevices)!=null&&ee.enumerateDevices))return;let P=!1;const _=()=>navigator.mediaDevices.enumerateDevices().then(V=>!P&&k(V.filter(W=>W.kind==="audioinput"))).catch(()=>{});return _(),(z=(K=navigator.mediaDevices).addEventListener)==null||z.call(K,"devicechange",_),()=>{var V,W;P=!0,(W=(V=navigator.mediaDevices).removeEventListener)==null||W.call(V,"devicechange",_)}},[c]);const T=c??M,E=d.useMemo(()=>[{value:"",label:j("karaokeSetup.noMic","No microphone")},...T.map((P,_)=>({value:P.deviceId,label:P.label||`${j("karaokeSetup.microphone","Microphone")} ${_+1}`}))],[T,j]),A=(P,_)=>N(C.map(ee=>ee.id===P?{...ee,..._}:ee)),I=()=>{if(C.length>=u)return;const P=C.reduce((_,ee)=>Math.max(_,ee.id),0)+1;N([...C,{id:P,name:`${j("karaokeSetup.player","Player")} ${C.length+1}`,color:Xe[C.length%Xe.length],micId:null}])},L=P=>N(C.filter(_=>_.id!==P));return x==="hidden"?null:r.jsxs("div",{className:`nice-karaoke-setup${g?` ${g}`:""}`,style:{display:"flex",flexDirection:"column",gap:16,...y},id:m,"data-testid":b,children:[r.jsxs("div",{style:{display:"flex",gap:24,flexWrap:"wrap"},children:[r.jsxs("div",{children:[r.jsx("div",{style:{fontSize:12,fontWeight:600,marginBottom:6,color:"var(--nice-text-muted, #94a3b8)"},children:j("karaokeSetup.mode","Game mode")}),r.jsx(ie.NiceSegmentedControl,{options:v,value:a,onChange:P=>s==null?void 0:s(P)})]}),r.jsxs("div",{children:[r.jsx("div",{style:{fontSize:12,fontWeight:600,marginBottom:6,color:"var(--nice-text-muted, #94a3b8)"},children:j("karaokeSetup.difficulty","Difficulty")}),r.jsx(ie.NiceSegmentedControl,{options:[{value:"easy",label:j("karaokeSetup.easy","Easy")},{value:"normal",label:j("karaokeSetup.normal","Normal")},{value:"hard",label:j("karaokeSetup.hard","Hard")}],value:o,onChange:P=>l==null?void 0:l(P)})]})]}),r.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:10},children:[r.jsxs("div",{style:{fontSize:12,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)"},children:[j("karaokeSetup.players","Players")," (",C.length,"/",u,")"]}),C.map(P=>r.jsx(ie.NiceCard,{children:r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"},children:[r.jsx(ie.NiceColorPicker,{value:P.color||Xe[0],onChange:_=>A(P.id,{color:_})}),r.jsx("div",{style:{flex:"1 1 160px",minWidth:140},children:r.jsx(ie.NiceTextInput,{value:P.name,onChange:_=>A(P.id,{name:_}),placeholder:j("karaokeSetup.playerName","Player name"),size:"sm"})}),r.jsx("div",{style:{flex:"1 1 180px",minWidth:150},children:r.jsx(ie.NiceSelect,{options:E,value:P.micId??"",onChange:_=>A(P.id,{micId:(typeof _=="string"?_:_[0])||null}),placeholder:j("karaokeSetup.selectMic","Microphone"),size:"sm"})}),h&&P.micId&&r.jsxs(ie.NiceButton,{variant:"ghost",size:"sm",onClick:()=>h(P.micId),children:[r.jsx(B.NtdSettings,{size:14})," ",j("karaokeSetup.calibrate","Calibrate")]}),r.jsx(ie.NiceButton,{variant:"danger",size:"sm",onClick:()=>L(P.id),"aria-label":j("karaokeSetup.remove","Remove"),children:r.jsx(B.NtdClose,{size:14})})]})},P.id)),r.jsx("div",{children:r.jsxs(ie.NiceButton,{variant:"primary",onClick:I,disabled:C.length>=u,children:[r.jsx(B.NtdPlus,{size:14})," ",j("karaokeSetup.addPlayer","Add player")]})})]})]})},op=[],lp=["freeForAll","roundRobin","hostOnly","firstCome"],cp={freeForAll:B.NtdDice,roundRobin:B.NtdRepeat,hostOnly:B.NtdCrown,firstCome:B.NtdLightning},dp={freeForAll:"success",roundRobin:"warning",hostOnly:"info",firstCome:"danger"},ul=({players:e=op,mode:t,defaultMode:n,onModeChange:a,turnTimeSec:s=30,hostIndex:i=0,onActivePlayerChange:o,myPlayerIndex:l,t:c,className:u,style:h,id:p,accessMode:g,"data-testid":y})=>{const{t:m}=xe(),x=c??m,[b,f]=ve.useControllableState({value:t,defaultValue:n,fallbackValue:"freeForAll",onChange:a,componentName:"NiceKaraokeSelectionMode"}),j={freeForAll:x("songSelection.freeForAll","Free for all"),roundRobin:x("songSelection.roundRobin","Round robin"),hostOnly:x("songSelection.hostOnly","Host only"),firstCome:x("songSelection.firstCome","First come")},[v,C]=d.useState(0),[N,M]=d.useState(s),k=d.useRef(null),[T,E]=d.useState(null),[A,I]=d.useState(!1),[L,P]=d.useState(null),_=d.useRef(null),ee=d.useMemo(()=>b==="hostOnly"?i:b==="roundRobin"?v%Math.max(1,e.length):b==="firstCome"?A?-1:L??-1:-1,[b,v,e.length,i,A,L]);d.useEffect(()=>{o==null||o(ee)},[ee,o]),d.useEffect(()=>{if(b!=="roundRobin"||s<=0){k.current&&clearInterval(k.current);return}return M(s),k.current=setInterval(()=>{M(H=>H<=1?(C(G=>G+1),s):H-1)},1e3),()=>{k.current&&clearInterval(k.current)}},[b,s,v]);const K=d.useCallback(()=>{P(null),I(!1),E(3),_.current&&clearInterval(_.current),_.current=setInterval(()=>{E(H=>H===null||H<=1?(_.current&&clearInterval(_.current),I(!0),null):H-1)},1e3)},[]);d.useEffect(()=>()=>{_.current&&clearInterval(_.current)},[]),d.useEffect(()=>{b!=="firstCome"&&(E(null),I(!1),P(null))},[b]);const z=d.useCallback(()=>{C(H=>H+1),M(s)},[s]),V=H=>{var G;return((G=e[H])==null?void 0:G.name)||`${x("songSelection.player","Player")} ${H+1}`},W=ee>=0&&ee<e.length?e[ee]:null;return g==="hidden"?null:r.jsxs("div",{className:`nice-karaoke-selection-mode${u?` ${u}`:""}`,style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:10,padding:"8px 12px",background:"var(--nice-bg-secondary)",borderRadius:10,border:"1px solid var(--nice-border, #333)",...h},id:p,"data-testid":y,children:[r.jsx("div",{style:{display:"flex",gap:4,flexWrap:"wrap"},children:lp.map(H=>r.jsxs(ie.NiceButton,{size:"sm",variant:b===H?dp[H]:"outline",onClick:()=>f(H),children:[d.createElement(cp[H],{size:14})," ",j[H]]},H))}),b!=="freeForAll"&&b!=="firstCome"&&W&&r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[r.jsxs(ie.NiceBadge,{variant:ee===l?"success":"secondary",children:[r.jsx(B.NtdMicrophone,{size:12})," ",V(ee)]}),ee===l&&r.jsx("span",{style:{color:"var(--nice-success, #4caf50)",fontSize:12,fontWeight:600},children:x("songSelection.yourTurn","Your turn!")})]}),b==="roundRobin"&&s>0&&r.jsx("div",{style:{flex:1,minWidth:120,maxWidth:200},children:r.jsx(ie.NiceProgress,{value:N,max:s,variant:N<=5?"error":N<=10?"warning":"info",showValue:!0,formatValue:H=>`${H}s`})}),b==="roundRobin"&&r.jsxs(ie.NiceButton,{size:"sm",variant:"ghost",onClick:z,children:[x("songSelection.next","Next")," ",r.jsx(B.NtdPlay,{size:12})]}),b==="firstCome"&&r.jsxs(r.Fragment,{children:[T!==null&&r.jsx("div",{style:{fontSize:32,fontWeight:900,color:"var(--nice-error, #f44336)",minWidth:60,textAlign:"center"},children:T}),A&&L===null&&r.jsxs(ie.NiceBadge,{variant:"danger",children:[r.jsx(B.NtdLightning,{size:12})," ",x("songSelection.raceGo","GO! Pick a song!")]}),L!==null&&L<e.length&&r.jsxs(ie.NiceBadge,{variant:"success",children:[r.jsx(B.NtdTrophy,{size:12})," ",V(L)," ",x("songSelection.raceWon","picks!")]}),r.jsx(ie.NiceButton,{size:"sm",variant:T!==null?"secondary":"danger",onClick:K,disabled:T!==null,children:L!==null?r.jsxs(r.Fragment,{children:[r.jsx(B.NtdRepeat,{size:12})," ",x("songSelection.raceAgain","New race")]}):r.jsxs(r.Fragment,{children:[r.jsx(B.NtdLightning,{size:12})," ",x("songSelection.raceStart","Start race")]})})]})]})};function up(e,t,n,a){return d.useMemo(()=>e==="freeForAll"?!0:e==="firstCome"?t===-1:e==="hostOnly"?a===n:e==="roundRobin"?a===t:!1,[e,t,n,a])}const hp=({players:e,defaultPlayers:t,onPlayersChange:n,gameMode:a,onGameModeChange:s,gameModes:i,difficulty:o,onDifficultyChange:l,audioInputs:c,maxPlayers:u=4,onCalibrate:h,initialSelectionMode:p="freeForAll",turnTimeSec:g=30,hostIndex:y=0,myPlayerIndex:m,onChange:x,variant:b="bar",t:f,className:j,style:v,id:C,accessMode:N,"data-testid":M})=>{const{t:k}=xe(),T=f??k,[E,A]=ve.useControllableState({value:e,defaultValue:t,fallbackValue:[],onChange:n,componentName:"NiceKaraokeSessionJoin"}),[I,L]=d.useState([]);d.useEffect(()=>{var Y,O,U;if(c||!((Y=navigator.mediaDevices)!=null&&Y.enumerateDevices))return;let S=!1;const F=()=>navigator.mediaDevices.enumerateDevices().then($=>!S&&L($.filter(q=>q.kind==="audioinput"))).catch(()=>{});return F(),(U=(O=navigator.mediaDevices).addEventListener)==null||U.call(O,"devicechange",F),()=>{var $,q;S=!0,(q=($=navigator.mediaDevices).removeEventListener)==null||q.call($,"devicechange",F)}},[c]);const P=c??I,_=P.length===0,ee=E.some(S=>!S.micId),K=!ee,[z,V]=d.useState(p),[W,H]=d.useState(-1),G=d.useCallback((S,F)=>{x==null||x({selectionMode:S,activePickerIndex:F,allMicsAssigned:K,noInputDevices:_})},[x,K,_]),Z=d.useCallback(S=>{V(S),G(S,W)},[G,W]),w=d.useCallback(S=>{H(S),G(z,S)},[G,z]),R=d.useMemo(()=>({padding:10,borderRadius:8,fontWeight:700,marginTop:8,textAlign:"center"}),[]);return N==="hidden"?null:r.jsxs("div",{className:`nice-karaoke-session-join${j?` ${j}`:""}`,style:b==="card"?{background:"var(--nice-bg-secondary)",borderRadius:12,padding:16,...v}:v,id:C,"data-testid":M,children:[r.jsx(dl,{players:E,onPlayersChange:A,gameMode:a,onGameModeChange:s,gameModes:i,difficulty:o,onDifficultyChange:l,audioInputs:P,maxPlayers:u,onCalibrate:h,t:T}),_&&r.jsxs("div",{style:{...R,background:"var(--nice-error, #ef4444)",color:"#fff"},children:[T("karaokeSessionJoin.noInputDevices","No microphone detected"),r.jsx("br",{}),r.jsx("span",{style:{fontWeight:400,fontSize:13},children:T("karaokeSessionJoin.noInputDevicesHint","Connect a microphone to sing.")})]}),!_&&ee&&r.jsx("div",{style:{...R,background:"var(--nice-warning, #f59e0b)",color:"var(--nice-text-on-primary, #222)",fontSize:14},children:T("karaokeSessionJoin.assignMicWarning","Assign a microphone to each player.")}),E.length>1&&r.jsx("div",{style:{marginTop:12},children:r.jsx(ul,{players:E,mode:z,onModeChange:Z,onActivePlayerChange:w,turnTimeSec:g,hostIndex:y,myPlayerIndex:m,t:T})})]})};function Ue(e,t){var s;const n=((s=t.split(".").pop())==null?void 0:s.toLowerCase())??"",a=n==="otf"?"opentype":n==="woff2"?"woff2":n==="woff"?"woff":"truetype";return{family:e,url:`/fonts/${t}`,format:a}}const pp=[Ue("Belagak","BelagakRegular-dr1zE.otf"),Ue("Big Scratch Brush","BigScratchBrush-PVY9g.ttf"),Ue("Gerhaus","Gerhaus-PK69E.ttf"),Ue("Gerhaus Italic","GerhausItalic-d96l7.ttf"),Ue("Handone Medium","HandoneMedium-nAevO.otf"),Ue("Handson Bold","HandsonBold-9MnrL.otf"),Ue("Kineks Round Bold","KineksRoundBold-7OR34.ttf"),Ue("Kineks Round Light","KineksRoundLight-m2r35.ttf"),Ue("Kineks Round Medium","KineksRoundMedium-drejZ.ttf"),Ue("Kineks Round","KineksRoundRegular-PVRl7.ttf"),Ue("Kineks Round SemiBold","KineksRoundSemiBold-LVWG3.ttf"),Ue("Lemon Jelly","LemonJellyPersonalUse-dEqR.ttf"),Ue("Lemon Milk Bold","LemonMilkBold-gx2B3.otf"),Ue("Lemon Milk Bold Italic","LemonMilkBoldItalic-PKZ3P.otf"),Ue("Lemon Milk Light","LemonMilkLight-owxMq.otf"),Ue("Lemon Milk Light Italic","LemonMilkLightItalic-7BjPE.otf"),Ue("Lemon Milk Medium","LemonMilkMedium-mLZYV.otf"),Ue("Lemon Milk Medium Italic","LemonMilkMediumItalic-d95nl.otf"),Ue("Lemon Milk","LemonMilkRegular-X3XE2.otf"),Ue("Lemon Milk Italic","LemonMilkRegularItalic-L3AEy.otf"),Ue("Pemage","PemageRegular-YqrdO.otf"),Ue("Rosmatika","RosmatikaRegular-BWA45.ttf"),Ue("Scabber","Scabber-q2Mn0.ttf"),Ue("Stylish Calligraphy","StylishCalligraphyDemo-XPZZ.ttf"),Ue("Super Adorable","SuperAdorable-MAvyp.ttf"),Ue("Super Chiby","SuperChiby-BL62V.ttf"),Ue("Super Joyful","SuperJoyful-lxwPq.ttf"),Ue("Super Kindly","SuperKindly-drE8E.ttf"),Ue("Super Meatball","SuperMeatball-Yq1Gy.ttf")],Za="nice2dev-karaoke-display",fp=(function(){return[{value:"Arial",label:"Arial (default)"},{value:"Georgia, serif",label:"Georgia"},{value:"'Courier New', monospace",label:"Courier New"},{value:"'Trebuchet MS', sans-serif",label:"Trebuchet MS"},{value:"Impact, sans-serif",label:"Impact"},...pp.map(e=>({value:e.family,label:e.family}))]})(),hl=[{id:"default",name:"Cyan ? Yellow ? Amber",sungGradient:["#00e5ff","#ffe600","#ffab00"],goldGradient:["var(--nice-warning, #FFD700)","#FFA000","var(--nice-warning, #FFD700)"],glowColor:"rgba(0,229,255,0.6)"},{id:"neon-pink",name:"Neon Pink ? Violet ? Blue",sungGradient:["#ff1493","#9b59b6","var(--nice-primary, #3498db)"],goldGradient:["var(--nice-warning, #FFD700)","#FF69B4","var(--nice-warning, #FFD700)"],glowColor:"rgba(255,20,147,0.6)"},{id:"fire",name:"Red ? Orange ? Yellow",sungGradient:["#ff1744","#ff9100","#ffea00"],goldGradient:["var(--nice-warning, #FFD700)","#FF6D00","var(--nice-warning, #FFD700)"],glowColor:"rgba(255,23,68,0.6)"},{id:"ocean",name:"Deep Blue ? Teal ? Aqua",sungGradient:["#1a237e","#00897b","#00e5ff"],goldGradient:["var(--nice-warning, #FFD700)","#00BCD4","var(--nice-warning, #FFD700)"],glowColor:"rgba(0,137,123,0.6)"},{id:"forest",name:"Green ? Lime ? Yellow",sungGradient:["#1b5e20","#76ff03","#ffea00"],goldGradient:["var(--nice-warning, #FFD700)","#76ff03","var(--nice-warning, #FFD700)"],glowColor:"rgba(118,255,3,0.6)"},{id:"retro",name:"Orange ? Pink ? Purple",sungGradient:["#ff6d00","var(--nice-color-accent-pink, #e91e63)","#7b1fa2"],goldGradient:["var(--nice-warning, #FFD700)","var(--nice-color-accent-pink, #e91e63)","var(--nice-warning, #FFD700)"],glowColor:"rgba(233,30,99,0.6)"}],gn={presetId:"default",customSungGradient:["#00e5ff","#ffe600","#ffab00"],customGoldGradient:["var(--nice-warning, #FFD700)","#FFA000","var(--nice-warning, #FFD700)"],customGlowColor:"rgba(0,229,255,0.6)",animationMode:"ball",fontFamily:"Arial",transitionEffect:"none",curtainPrimaryColor:"#8b0000",curtainSecondaryColor:"#1a0000",curtainDurationMs:900,immersiveMode:!1};let ei=!1;function pl(){try{const e=localStorage.getItem(Za);if(e){const t=JSON.parse(e);return{...gn,...t}}}catch{}return{...gn}}async function mp(e){if(ei||(ei=!0,!e))return;const t=await e();if(t)try{const n=JSON.parse(t),a={...gn,...n};localStorage.setItem(Za,JSON.stringify(a))}catch{}}function gp(e){const t=JSON.stringify(e);localStorage.setItem(Za,t),Xa(e)}function fl(e){if(e.presetId==="custom")return{sungGradient:e.customSungGradient,goldGradient:e.customGoldGradient,glowColor:e.customGlowColor};const t=hl.find(n=>n.id===e.presetId);return t?{sungGradient:t.sungGradient,goldGradient:t.goldGradient,glowColor:t.glowColor}:{sungGradient:gn.customSungGradient,goldGradient:gn.customGoldGradient,glowColor:gn.customGlowColor}}function Xa(e){const{sungGradient:t,goldGradient:n,glowColor:a}=fl(e),s=document.documentElement;s.style.setProperty("--karaoke-sung-gradient",`linear-gradient(90deg, ${t[0]} 0%, ${t[1]} 60%, ${t[2]} 100%)`),s.style.setProperty("--karaoke-gold-gradient",`linear-gradient(90deg, ${n[0]}, ${n[1]}, ${n[2]})`),s.style.setProperty("--karaoke-gold-glow-first",`0 0 12px ${n[0]}`),s.style.setProperty("--karaoke-active-glow",`0 0 10px ${a}, 0 0 4px ${t[1]}80`),s.style.setProperty("--karaoke-active-drop-first",`0 0 6px ${a}`),s.style.setProperty("--karaoke-active-bg",`linear-gradient(90deg, transparent 0%, ${t[0]}14 20%, ${t[1]}10 80%, transparent 100%)`),s.style.setProperty("--karaoke-font-family",e.fontFamily||"Arial")}function yp(){const e=pl();Xa(e)}function vp(e){const t=(e||"").split(/\r?\n/),n=[];for(let a=0;a<t.length;a++){const s=t[a].trim();if(s&&/^[:*F]\s/.test(s)){const i=s.slice(1).trim().split(/\s+/),o=parseInt(i[0]||"0",10),l=parseInt(i[1]||"0",10),c=isNaN(o)?0:o/10,u=isNaN(l)?0:l/10;n.push({lineIndex:a,start:c,duration:u,raw:t[a]})}}return n}const bp=({index:e,data:t})=>{const{lines:n,notes:a,currentIndex:s,animationConfig:i}=t,o=n[e]??"",l=a.findIndex(f=>f.lineIndex===e),c=l>=0&&l===s,u=(i==null?void 0:i.enabled)??!0,h=(i==null?void 0:i.durationMs)??300,p=(i==null?void 0:i.translateX)??8,g=(i==null?void 0:i.scale)??1.01,y=(i==null?void 0:i.easing)??"cubic-bezier(.22,1,.36,1)",m=(i==null?void 0:i.opacityInactive)??.9,x=(i==null?void 0:i.boxShadow)??"0 6px 18px var(--nice-primary-tint-8, rgba(3,102,214,0.08))",b={transition:u?`transform ${h}ms ${y}, opacity ${h}ms ${y}`:"none",transform:c?`translateX(${p}px) scale(${g})`:"translateX(0px) scale(1)",opacity:c?1:m,boxShadow:c?x:"none"};return r.jsx("div",{style:{height:"100%",padding:"4px 6px",borderRadius:4},"data-note-idx":l>=0?l:void 0,children:r.jsx("div",{style:{...b,background:c?"var(--nice-primary-tint-12, rgba(0,130,200,0.12))":"transparent",padding:"4px 6px",borderRadius:4},children:r.jsx("code",{style:{fontFamily:"monospace",whiteSpace:"pre-wrap"},children:o})})})},xp=({ultrastarText:e,audioUrl:t,audioRef:n,animationConfig:a})=>{const{t:s}=xe(),i=d.useRef(null),o=n??i,[l,c]=d.useState(!1),u=d.useMemo(()=>vp(e),[e]),h=d.useRef(null),p=d.useRef(null),g=d.useRef(0),y=d.useRef(0),[m,x]=d.useState(-1),b=d.useMemo(()=>(e||"").split(/\r?\n/),[e]),f=28,j=b.length*f,v=d.useMemo(()=>({lines:b,notes:u,currentIndex:m,animationConfig:a}),[b,u,m,a]),C=d.useCallback((N,M)=>r.jsx(bp,{index:M,data:v}),[v]);return d.useEffect(()=>{const N=o.current;N&&(l?N.play().catch(()=>c(!1)):N.pause())},[l,o]),d.useEffect(()=>{const N=o.current;if(!N)return;let M=-1;const k=a??null,T=k&&typeof k.scrollSmooth=="number"?k.scrollSmooth:.18;let E=performance.now();const A=()=>{var G,Z;const I=performance.now(),L=Math.max(0,Math.min(.2,(I-E)/1e3));E=I;const P=N.currentTime||0;g.current=P;let _=-1;for(let w=0;w<u.length;w++){const R=u[w];if(P>=R.start&&P<R.start+Math.max(.001,R.duration)){_=w;break}}_!==M&&(M=_,x(_));let ee=0;if(M>=0){const w=((G=u[M])==null?void 0:G.lineIndex)??0,R=((Z=h.current)==null?void 0:Z.clientHeight)??220;ee=w*f-R/2+f/2;const S=Math.max(0,j-R);(isNaN(ee)||!isFinite(ee))&&(ee=0),ee=Math.max(0,Math.min(ee,S))}const K=1-Math.pow(Math.max(0,1-T),Math.min(4,L*60)),H=(((a==null?void 0:a.scrollEasing)||"easeOutCubic")==="linear"?w=>w:w=>1-Math.pow(1-w,3))(K);y.current=y.current+(ee-y.current)*H;try{const w=h.current;w&&typeof w.scrollTop=="number"&&(w.scrollTop=Math.round(y.current))}catch{}p.current=requestAnimationFrame(A)};return p.current=requestAnimationFrame(A),()=>{p.current&&cancelAnimationFrame(p.current)}},[o,u,j,a]),r.jsxs("div",{children:[r.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:8},children:[r.jsx("button",{onClick:()=>c(N=>!N),disabled:!t,children:l?s("karaokeEditor.pause","Pause"):s("karaokeEditor.play","Play")}),r.jsxs("div",{style:{fontSize:13,color:"var(--nice-text-secondary, #666)"},children:[(g.current||0).toFixed(2),"s"]}),r.jsx("div",{style:{marginLeft:"auto",fontSize:13,color:"var(--nice-text-secondary, #666)"},children:s("karaokeEditor.notes","Notes: {notes}").replace("{notes}",String(u.length))})]}),r.jsx("div",{style:{border:"1px solid var(--nice-border, #ddd)",height:220,overflow:"hidden",padding:8,position:"relative"},children:e?r.jsx(ie.NiceVirtualScroller,{ref:h,items:b,itemHeight:f,height:220,renderItem:C,style:{border:"none",borderRadius:0,background:"transparent",fontSize:"inherit"}}):r.jsx("div",{style:{color:"var(--nice-text-secondary, #888)"},children:s("karaokeEditor.noText","No text")})}),!n&&r.jsx("audio",{ref:i,src:t||void 0,preload:"metadata",style:{display:"none"}})]})};function Sp(e){const t=(e||"").split(/\r?\n/).map(a=>a.replace(/\s+$/,"")),n=[];for(let a=0;a<t.length;a++){const s=t[a].trim();if(/^[:*F]\s/.test(s)){const i=s.slice(1).trim().split(/\s+/),o=parseInt(i[0]||"0",10)/10||0,l=parseInt(i[1]||"0",10)/10||.1;n.push({lineIndex:a,start:o,duration:l})}}return{lines:t,notes:n}}const kp=new Set;function wp({ultrastarText:e,audioUrl:t,audioRef:n,ytRef:a}){const{lines:s,notes:i}=d.useMemo(()=>Sp(e),[e]),[o,l]=d.useState(kp),c=d.useRef(i);c.current=i;const u=d.useRef(t);return u.current=t,d.useEffect(()=>{let h=null,p=null;if(!(a!=null&&a.current))if(n!=null&&n.current)h=n.current;else{const x=document.querySelector("audio");x instanceof HTMLAudioElement?h=x:u.current&&(p=document.createElement("audio"),p.src=u.current,p.preload="metadata",p.style.display="none",document.body.appendChild(p),h=p)}let g=0,y="";const m=()=>{let x=0;const b=a==null?void 0:a.current;if(b&&typeof b.getCurrentTime=="function")try{x=b.getCurrentTime()||0}catch{x=0}else x=h&&h.currentTime||0;const f=new Set;for(const v of c.current)x>=v.start&&x<v.start+Math.max(.001,v.duration)&&f.add(v.lineIndex);const j=[...f].join(",");j!==y&&(y=j,l(f)),g=requestAnimationFrame(m)};return g=requestAnimationFrame(m),()=>{cancelAnimationFrame(g),p==null||p.remove()}},[]),r.jsx("div",{style:{width:"100%",height:340,overflow:"hidden",background:"#101010",padding:"20px 0",boxSizing:"border-box"},children:s.map((h,p)=>{const g=o.has(p);return r.jsx("div",{"aria-current":g||void 0,style:{font:"18px monospace",lineHeight:"22px",whiteSpace:"pre",padding:"0 10px",color:g?"var(--nice-info, #00aaff)":"var(--nice-overlay-light-90, #e2e8f0)",background:g?"color-mix(in srgb, var(--nice-info, #00aaff) 16%, transparent)":void 0},children:h||" "},p)})})}const Cp=e=>!!e&&/\.m3u8(\?.*)?$/i.test(e),ti=e=>{(!isFinite(e)||e<0)&&(e=0);const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`},ea={border:"1px solid var(--nice-border-color)",borderRadius:8,padding:"6px 10px",background:"var(--nice-bg-secondary)",color:"var(--nice-text-primary)",cursor:"pointer"},jp=({isPlaying:e,index:t,count:n,currentTime:a,duration:s,volume:i,onPrev:o,onNext:l,onToggle:c,onSeek:u,onVolume:h})=>{const{t:p}=xe();return r.jsxs(r.Fragment,{children:[r.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:8,justifyContent:"space-between"},children:[r.jsx("div",{}),r.jsxs("div",{style:{fontSize:12,color:"var(--nice-text-secondary)"},children:[ti(a)," / ",ti(s)]})]}),r.jsxs("div",{className:"gp-controls",style:{display:"grid",gridTemplateColumns:"auto 1fr auto",gap:12,alignItems:"center"},children:[r.jsxs("div",{style:{display:"flex",gap:8},children:[r.jsx("button",{onClick:o,disabled:t<=0,title:p("playerControls.prev","Prev"),"aria-label":p("playerControls.previousTrack","Previous track"),style:ea,children:r.jsx(B.NtdSkipBack,{size:16})}),r.jsx("button",{onClick:c,title:e?p("playerControls.pause","Pause"):p("playerControls.play","Play"),"aria-label":e?p("playerControls.pause","Pause"):p("playerControls.play","Play"),style:ea,children:e?r.jsx(B.NtdPause,{size:16}):r.jsx(B.NtdPlay,{size:16})}),r.jsx("button",{onClick:l,disabled:t>=n-1,title:p("playerControls.next","Next"),"aria-label":p("playerControls.nextTrack","Next track"),style:ea,children:r.jsx(B.NtdSkipForward,{size:16})})]}),r.jsx("input",{type:"range",min:0,max:Math.max(1,s),step:.1,value:a,"aria-label":p("playerControls.seekPosition","Seek position"),onChange:g=>u(parseFloat(g.target.value))}),r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[r.jsx(B.NtdVolume,{size:16}),r.jsx("input",{type:"range",min:0,max:1,step:.01,value:i,"aria-label":p("playerControls.volume","Volume"),onChange:g=>h(parseFloat(g.target.value))})]})]})]})},Mp=d.memo(jp);function Rp(e,t,n,a,s){const o=Math.max(1,Math.floor(a.length/48)),l=t/48;for(let c=0;c<48;c++){const u=a[c*o]/255,h=u*(n-6),p=c*l,g=n-h,y=c/48*240+s;e.fillStyle=`hsl(${y%360}, 80%, ${Math.max(30,40+u*30)}%)`,e.fillRect(p+1,g,l-2,h)}}function Np(e,t,n,a,s,i){if(!i.current){const p=[];for(let y=0;y<24;y++)p.push({ang:y/24*Math.PI*2,phase:Math.random()*Math.PI*2,baseR:Math.min(t,n)*.22+Math.random()*30});i.current={nodes:p}}const o=i.current,l=t/2,c=n/2,u=26+a*80,h=[];for(const p of o.nodes){p.phase+=.02+a*.06;const g=p.baseR+Math.sin(p.phase)*u,y=l+Math.cos(p.ang)*g,m=c+Math.sin(p.ang)*g;h.push([y,m])}e.fillStyle=`hsla(${s}, 70%, 55%, .22)`,e.strokeStyle=`hsla(${(s+40)%360}, 90%, 65%, .9)`,e.lineWidth=2,e.beginPath();for(let p=0;p<h.length;p++){const[g,y]=h[p],[m,x]=h[(p+1)%h.length],b=(g+m)/2,f=(y+x)/2;p===0?e.moveTo(b,f):e.quadraticCurveTo(g,y,b,f)}e.closePath(),e.fill(),e.stroke()}function Tp(e,t,n,a,s,i){i.current||(i.current={items:[]});const o=i.current;Math.random()<.06+a*.25&&o.items.push({x:Math.random()*t,y:Math.random()*n,r:8+Math.random()*24,life:1,hue:(s+Math.random()*120)%360});const l=[];for(const c of o.items){c.r+=2+a*14,c.life*=.975-a*.02,c.life>.04&&l.push(c);const u=e.createRadialGradient(c.x,c.y,1,c.x,c.y,c.r);u.addColorStop(0,`hsla(${c.hue}, 90%, 60%, ${.35*c.life})`),u.addColorStop(.6,`hsla(${(c.hue+40)%360}, 80%, 55%, ${.18*c.life})`),u.addColorStop(1,`hsla(${(c.hue+80)%360}, 70%, 50%, 0)`),e.fillStyle=u,e.beginPath(),e.arc(c.x,c.y,c.r,0,Math.PI*2),e.fill()}o.items=l}const Pp="var(--nice-text-muted, #94a3b8)",Ep=({height:e,coverUrl:t,title:n,subtitle:a,label:s})=>r.jsx("div",{style:{textAlign:"center",color:"var(--nice-text-secondary, #e2e8f0)"},children:t?r.jsx("img",{alt:"cover",src:t,style:{height:e-24,objectFit:"contain"}}):r.jsxs("div",{style:{opacity:.8},children:[r.jsx("div",{style:{fontSize:18,fontWeight:600},children:n??"—"}),r.jsx("div",{style:{marginTop:8,fontSize:12,color:Pp},children:s??a??"—"})]})});function tn(e,t){return e+Math.random()*(t-e)}function $p(e,t,n,a,s,i,o){o.current||(o.current={embers:[],t:0});const l=o.current,c=e.createLinearGradient(0,n,0,n*.4);c.addColorStop(0,`hsla(${(i+30)%360}, 90%, 50%, .35)`),c.addColorStop(1,`hsla(${(i+10)%360}, 90%, 50%, 0)`),e.fillStyle=c,e.fillRect(0,0,t,n);const u=6;for(let p=0;p<u;p++){const g=(p+.5)/u*t,y=(a[Math.floor((p+1)/(u+1)*a.length)]||0)/255,m=n*.18+(.25+s*.6+y*.7)*n*.55,x=e.createLinearGradient(g,n,g,n-m);x.addColorStop(0,`hsla(${(i+40)%360},100%,55%,.9)`),x.addColorStop(.5,`hsla(${(i+10)%360},100%,60%,.75)`),x.addColorStop(1,`hsla(${(i-20)%360},100%,80%,.05)`);const b=Math.sin(l.t*1.2+p*.8)*(15+s*30);e.fillStyle=x,e.beginPath(),e.moveTo(g-20,n),e.bezierCurveTo(g-35,n-m*.45,g-25+b,n-m*.75,g+b,n-m),e.bezierCurveTo(g+25+b*.3,n-m*.65,g+35,n-m*.35,g+20,n),e.closePath(),e.fill()}const h=Math.floor(1+s*6);for(let p=0;p<h;p++)l.embers.push({x:tn(t*.25,t*.75),y:n-tn(4,14),r:tn(1,3),vx:tn(-.15,.15),vy:-tn(.6,1.8)-s*1.2,life:tn(.8,1.6)});e.save(),e.globalCompositeOperation="lighter";for(let p=l.embers.length-1;p>=0;p--){const g=l.embers[p];if(g.x+=g.vx,g.y+=g.vy,g.vy-=.01,g.life-=.015+s*.02,g.life<=0||g.y<-10){l.embers.splice(p,1);continue}const y=e.createRadialGradient(g.x,g.y,0,g.x,g.y,g.r*3);y.addColorStop(0,`hsla(${(i+25)%360},100%,65%,.9)`),y.addColorStop(1,`hsla(${(i+25)%360},100%,65%,0)`),e.fillStyle=y,e.beginPath(),e.arc(g.x,g.y,g.r*3,0,Math.PI*2),e.fill()}e.restore(),e.fillStyle="rgba(60,36,22,.9)",e.fillRect(t*.2,n-10,t*.6,6),l.t+=.02+s*.08}function Ap(e,t,n,a,s){const i=t/2,o=n/2,l=Math.min(t,n)*.28,c=96,u=Math.max(1,Math.floor(a.length/c));for(let h=0;h<c;h++){const p=(a[h*u]??0)/255,g=h/c*Math.PI*2,y=p*(Math.min(t,n)*.22)+6,m=i+Math.cos(g)*l,x=o+Math.sin(g)*l,b=i+Math.cos(g)*(l+y),f=o+Math.sin(g)*(l+y);e.strokeStyle=`hsl(${(s+h*3)%360}, 90%, ${40+p*40}%)`,e.lineWidth=3,e.beginPath(),e.moveTo(m,x),e.lineTo(b,f),e.stroke()}e.fillStyle=`hsla(${(s+180)%360}, 60%, 15%, .4)`,e.beginPath(),e.arc(i,o,l-8,0,Math.PI*2),e.fill()}function Ip(e,t,n,a,s){const l=t/14,c=n/8;for(let u=0;u<8;u++)for(let h=0;h<14;h++){const p=Math.min(a.length-1,u*14+h),g=a[p]/255,y=(s+h/14*210+u/8*90)%360,m=65+g*30,x=20+g*40,b=(1-g)*4;e.fillStyle=`hsl(${y}, ${m}%, ${x}%)`,e.fillRect(h*l+b,u*c+b,Math.max(1,l-2*b),Math.max(1,c-2*b))}}function Lp(e){const n=Array.from(new Set(e.filter(Boolean))).map(a=>new Promise(s=>{const i=new Image;i.crossOrigin="anonymous",i.onload=()=>s(i),i.onerror=()=>s(i),i.src=a}));return Promise.all(n)}async function _p(e,t,n,a,s){e.current||(e.current={sprites:[],loadedUrls:[],ready:!1});const i=e.current,o=t.join("|")!==i.loadedUrls.join("|");if(!i.ready||o){const l=await Lp(t.length?t:[]);i.loadedUrls=t,i.sprites=[],i.ready=!0;const c=u=>l[u%Math.max(1,l.length)]??new Image;for(let u=0;u<n;u++){const h=Math.random()*Math.min(a,s)*.38+40;i.sprites.push({img:c(u),x:(Math.random()-.5)*h*.4,y:(Math.random()-.5)*h*.4,z:Math.random()*600+100,ang:Math.random()*Math.PI*2,spin:(Math.random()*.03+.01)*(Math.random()<.5?-1:1),vz:Math.random()*1.2+.2,size:Math.random()*.35+.65})}}}function Dp(e,t,n,a,s,i,o,l){const c=i.current;if(!(c!=null&&c.ready))return;const u=t/2,h=n/2,p=900,g=1+a*2;for(const m of c.sprites){m.ang+=m.spin*g,m.z-=m.vz*(.8+a*2.4),m.z<40&&(m.z=p);const x=Math.min(t,n)*.32+Math.sin(m.ang*.8)*18;m.x=Math.cos(m.ang)*x,m.y=Math.sin(m.ang*1.1)*x*.6}const y=[...c.sprites].sort((m,x)=>x.z-m.z);for(const m of y){const x=p/(p-m.z)*.6*m.size,b=u+m.x*x,f=h+m.y*x,j=64*x,v=64*x;e.save(),e.globalAlpha=.12+(1-m.z/p)*.2,e.fillStyle=`hsl(${(s+(1-m.z/p)*60)%360}, 90%, 60%)`,e.beginPath(),e.ellipse(b,f,j*.7,v*.7,0,0,Math.PI*2),e.fill(),e.restore(),m.img&&m.img.width?e.drawImage(m.img,b-j/2,f-v/2,j,v):(e.save(),e.fillStyle=`hsl(${(s+180)%360}, 40%, 55%)`,e.fillRect(b-j/2,f-v/2,j,v),e.restore())}}function wn(e,t){return e+Math.random()*(t-e)}function zp(e,t,n,a,s,i){i.current||(i.current={blobs:Array.from({length:7},(u,h)=>({x:wn(t*.2,t*.8),y:wn(n*.2,n*.8),r:wn(Math.min(t,n)*.05,Math.min(t,n)*.12),vx:wn(-.6,.6),vy:wn(-.6,.6),hue:(s+h*10)%360}))});const o=i.current,l=.6+a*2.2;e.save(),e.globalCompositeOperation="lighter";for(const c of o.blobs){c.x+=c.vx*l,c.y+=c.vy*l,c.vy-=.01-a*.015,c.x<c.r&&(c.x=c.r,c.vx=Math.abs(c.vx)),c.x>t-c.r&&(c.x=t-c.r,c.vx=-Math.abs(c.vx)),c.y<c.r&&(c.y=c.r,c.vy=Math.abs(c.vy)),c.y>n-c.r&&(c.y=n-c.r,c.vy=-Math.abs(c.vy));const u=(c.hue+a*120)%360,h=e.createRadialGradient(c.x,c.y,c.r*.2,c.x,c.y,c.r);h.addColorStop(0,`hsla(${u}, 95%, 70%, .8)`),h.addColorStop(1,`hsla(${(u+40)%360}, 90%, 30%, 0)`),e.fillStyle=h,e.shadowBlur=18,e.shadowColor=`hsl(${u}, 100%, 60%)`,e.beginPath(),e.arc(c.x,c.y,c.r,0,Math.PI*2),e.fill()}e.restore(),e.strokeStyle=ve.resolveCssColor("var(--nice-overlay-light-6, rgba(255, 255, 255, 0.06))",e.canvas),e.lineWidth=2,e.strokeRect(1,1,t-2,n-2)}function Fp(e,t,n,a,s,i){i.current||(i.current={tris:[]});const o=i.current,l=6;for(;o.tris.length<l;)o.tris.push({a:Math.random()*Math.PI*2,r:30+Math.random()*Math.min(t,n)*.35,dr:(Math.random()*.6+.2)*(Math.random()<.5?-1:1)});const c=t/2,u=n/2;for(const h of o.tris){h.a+=.002+a*.02*(h.dr>0?1:-1),h.r+=Math.sin(h.a*2)*(.3+a*1.4);const p=Math.max(40,Math.min(h.r,Math.min(t,n)*.48));e.save(),e.translate(c,u),e.rotate(h.a),e.strokeStyle=`hsla(${(s+p*.2)%360}, 90%, 60%, .9)`,e.lineWidth=2.5,e.beginPath(),e.moveTo(p,0);for(let g=1;g<3;g++){const y=g*Math.PI*2/3;e.lineTo(Math.cos(y)*p,Math.sin(y)*p)}e.closePath(),e.shadowBlur=12,e.shadowColor=e.strokeStyle,e.stroke(),e.restore()}}function Op(e,t,n,a,s,i){const o=t/2,l=n/2,c=5,u=Math.min(t,n)*.42;i.current+=.01;for(let h=0;h<c;h++){const p=(h+1)/(c+1),g=p*u;e.strokeStyle=`hsla(${(s+h*30)%360}, 70%, 45%, 0.35)`,e.lineWidth=1,e.beginPath(),e.arc(o,l,g,0,Math.PI*2),e.stroke();const y=Math.floor(a.length*p|0),m=(a[y]??0)/255,x=6+h*2;for(let b=0;b<x;b++){const f=i.current*(1+h*.15)+b/x*Math.PI*2,j=g+Math.sin(f*2)*6*m,v=o+Math.cos(f)*j,C=l+Math.sin(f)*j;e.fillStyle=`hsla(${(s+h*30+b*6)%360}, 90%, ${55+m*30}%, ${.6+m*.3})`,e.beginPath(),e.arc(v,C,2+m*4,0,Math.PI*2),e.fill()}}}function Bp(e,t,n,a,s){const l=t/12,c=n/6;for(let u=0;u<6;u++)for(let h=0;h<12;h++){const p=(u*12+h)%a.length,g=a[p]/255,y=(s+h/12*180+u/6*90)%360,m=70+g*25,x=25+g*35;e.fillStyle=`hsl(${y}, ${m}%, ${x}%)`,e.fillRect(h*l,u*c,Math.ceil(l),Math.ceil(c))}}function Gp(e,t,n,a,s,i){const o=t/2,l=n/2,c=2+Math.floor(a*14);for(let h=0;h<c;h++){const p=Math.random()*Math.PI*2,g=.5+Math.random()*(2.5+a*4);i.current.push({x:o,y:l,vx:Math.cos(p)*g,vy:Math.sin(p)*g,life:0,max:40+Math.random()*60,hue:(s+Math.random()*60)%360})}e.fillStyle="rgba(2,6,23,0.2)",e.fillRect(0,0,t,n);const u=i.current;for(let h=u.length-1;h>=0;h--){const p=u[h];p.x+=p.vx,p.y+=p.vy,p.life+=1;const g=1-p.life/p.max;e.fillStyle=`hsla(${p.hue},85%,60%,${Math.max(0,g)})`,e.beginPath(),e.arc(p.x,p.y,2+g*3,0,Math.PI*2),e.fill(),(p.life>=p.max||p.x<-20||p.y<-20||p.x>t+20||p.y>n+20)&&u.splice(h,1)}u.length>1200&&u.splice(0,u.length-1200)}function Wp(e,t,n,a,s,i){e.fillStyle="rgba(10,16,28,0.25)",e.fillRect(0,0,t,n);const o=t/2,l=n/2,c=Math.min(t,n)*(.38+s*.12),u=e.createRadialGradient(o,l,c*.1,o,l,c);u.addColorStop(0,`hsla(${(i+200)%360},90%,70%,0.95)`),u.addColorStop(.5,`hsla(${(i+260)%360},80%,55%,0.6)`),u.addColorStop(1,"transparent"),e.fillStyle=u,e.beginPath(),e.arc(o,l,c,0,Math.PI*2),e.fill();const h=18+Math.floor(s*50);for(let p=0;p<h;p++){const g=p/h*Math.PI*2+a*(.6+s*1.4),y=(Math.sin(a*2+p*1.7)+Math.cos(a*1.3+p*2.1))*.15,m=c*(.4+.55*Math.abs(Math.sin(a*1.2+p))),x=6;e.save(),e.translate(o,l),e.rotate(g+y),e.beginPath(),e.moveTo(0,0);for(let f=1;f<=x;f++){const j=m/x*f,v=(Math.sin(a*3+p*.8+f)*.6+Math.cos(a*2+p+f*.7))*(8+24*s),C=j,N=v;e.lineTo(N,C)}e.globalCompositeOperation="lighter";const b=(i+p*(240/h))%360;e.strokeStyle=`hsla(${b}, 90%, ${60+s*20}%, ${.35+s*.4})`,e.lineWidth=2+s*2,e.stroke(),e.restore()}e.beginPath(),e.arc(o,l,c*(.98+.02*Math.sin(a*2)),0,Math.PI*2),e.strokeStyle=`hsla(${(i+40)%360},90%,70%,${.25+s*.25})`,e.lineWidth=1.5,e.stroke(),e.globalCompositeOperation="source-over"}function Up(e,t,n,a,s){const o=Math.max(1,Math.floor(a.length/96)),l=t/2,c=n/2,u=Math.min(t,n)*.22,h=Math.min(t,n)*.48;for(let p=0;p<96;p++){const g=a[p*o]/255,y=p/96*Math.PI*2,m=u,x=u+g*(h-u),b=l+Math.cos(y)*m,f=c+Math.sin(y)*m,j=l+Math.cos(y)*x,v=c+Math.sin(y)*x;e.strokeStyle=`hsl(${p/96*360+s},85%,60%)`,e.lineWidth=3,e.beginPath(),e.moveTo(b,f),e.lineTo(j,v),e.stroke()}e.fillStyle=ve.resolveCssColor("var(--nice-overlay-light-8, rgba(255, 255, 255, 0.08))",e.canvas),e.beginPath(),e.arc(l,c,u*.85,0,Math.PI*2),e.fill()}function Vp(e,t,n,a,s,i){const o=t/2,l=n/2,c=Math.min(t,n)*.5,u=ni(a,0,Math.floor(a.length*.1))/255,h=ni(a,Math.floor(a.length*.6),a.length)/255;i.current+=.01+h*.03;const p=24;for(let g=0;g<p;g++){const y=i.current+g/p*Math.PI*2,m=(.35+u*.55)*c,x=o+Math.cos(y)*m,b=l+Math.sin(y)*m,f=e.createRadialGradient(o,l,0,o,l,m),j=g/p*360+s;f.addColorStop(0,`hsla(${j},85%,65%,0.0)`),f.addColorStop(1,`hsla(${j},85%,65%,0.9)`),e.strokeStyle=f,e.lineWidth=6+h*8,e.beginPath(),e.moveTo(o,l),e.lineTo(x,b),e.stroke()}e.fillStyle="rgba(2,6,23,0.25)",e.fillRect(0,0,t,n)}function ni(e,t,n){let a=0,s=0;for(let i=t;i<n;i++)a+=e[i],s++;return s?a/s:0}function qp(e,t,n,a,s,i){e.fillStyle="rgba(10,16,28,0.35)",e.fillRect(0,0,t,n);const o=n/2,l=Math.max(8,18-s*10),c=n*.35*(.6+s*.7),u=a.length,h=t/(u-1);e.beginPath();for(let y=0;y<u;y++){const m=(a[y]-128)/128,x=Math.sin(i*1.5+y*.03)*.12,b=y*h,f=o-l-(m+x)*c;y===0?e.moveTo(b,f):e.lineTo(b,f)}const p=e.createLinearGradient(0,0,0,o-l);p.addColorStop(0,"hsla(260,90%,75%,0.9)"),p.addColorStop(1,"hsla(220,85%,60%,0.4)"),e.strokeStyle=p,e.lineWidth=2,e.stroke(),e.beginPath();for(let y=0;y<u;y++){const m=(a[y]-128)/128,x=Math.cos(i*1.3+y*.035)*.12,b=y*h,f=o+l+(m+x)*c;y===0?e.moveTo(b,f):e.lineTo(b,f)}const g=e.createLinearGradient(0,o+l,0,n);g.addColorStop(0,"hsla(190,90%,65%,0.9)"),g.addColorStop(1,"hsla(160,85%,55%,0.4)"),e.strokeStyle=g,e.lineWidth=2,e.stroke(),e.globalCompositeOperation="lighter",e.strokeStyle=ve.resolveCssColor("var(--nice-overlay-light-8, rgba(255, 255, 255, 0.08))",e.canvas),e.lineWidth=6,e.beginPath(),e.moveTo(0,o-l),e.lineTo(t,o-l),e.stroke(),e.beginPath(),e.moveTo(0,o+l),e.lineTo(t,o+l),e.stroke(),e.globalCompositeOperation="source-over"}function Hp(e,t,n,a,s,i){const o=t/2,l=n/2,c=5,u=Math.min(t,n)*.12;for(let h=0;h<c;h++){const p=Math.floor(h/c*a.length),g=a[p]/255,y=u+h*u*.55+g*u*.5,m=(i+h*40)%360;e.lineWidth=3+g*6,e.strokeStyle=`hsla(${m},80%,60%,${.5+.5*s})`,e.beginPath(),e.arc(o,l,y,0,Math.PI*2),e.stroke()}}function Kp(e,t,n,a,s){const i=Math.min(a.length,256),o=Math.max(1,Math.floor(a.length/i)),l=t/i;for(let c=0;c<i;c++){const u=a[c*o]/255,h=u*(n-6),p=c*l,g=n-h,y=c/i*240+s;e.fillStyle=`hsl(${y%360}, 80%, ${Math.max(30,40+u*30)}%)`,e.fillRect(p+1,g,l-2,h)}}function Yp(e,t,n,a){e.current||(e.current={stars:[],ready:!1});const s=e.current;if(!s.ready||s.stars.length!==t){const i=[];for(let o=0;o<t;o++){const l={x:(Math.random()-.5)*n,y:(Math.random()-.5)*a,z:Math.random()*800+100,pz:0};i.push(l)}s.stars=i,s.ready=!0}}function Zp(e,t,n,a,s,i){const o=i.current,l=t/2,c=n/2,u=4+a*18;e.save(),e.translate(l,c);for(const h of o.stars){h.z-=u,h.z<20&&(h.x=(Math.random()-.5)*t,h.y=(Math.random()-.5)*n,h.z=900,h.pz=h.z);const p=h.x/h.z*600,g=h.y/h.z*600,y=h.x/h.pz*600,m=h.y/h.pz*600;h.pz=h.z,e.strokeStyle=`hsla(${(s+200)%360}, 90%, 70%, 0.7)`,e.lineWidth=Math.max(1,(1-h.z/900)*2),e.beginPath(),e.moveTo(y,m),e.lineTo(p,g),e.stroke()}e.restore()}function Xp(e,t,n,a){e.lineWidth=2,e.strokeStyle=ve.resolveCssColor("var(--nice-primary-light, #c7d2fe)",e.canvas),e.beginPath();const s=t/a.length;for(let i=0;i<a.length;i++){const o=(a[i]-128)/128,l=i*s,c=n/2+o*(n*.45);i===0?e.moveTo(l,c):e.lineTo(l,c)}e.stroke()}const Qp=({active:e,onClick:t,title:n,children:a})=>r.jsx("button",{type:"button",onClick:t,title:n,"aria-pressed":e,style:{padding:"4px 8px",borderRadius:6,fontSize:12,border:`1px solid ${e?"var(--nice-info, #6366f1)":"var(--nice-border-color, #334155)"}`,background:e?"var(--nice-accent-tint-12, rgba(99,102,241,.12))":"var(--nice-overlay-60, rgba(15,23,42,.6))",color:e?"var(--nice-color-white, #e2e8f0)":"var(--nice-color-white, #cbd5e1)",cursor:"pointer",whiteSpace:"nowrap",lineHeight:1.2},children:a}),ml=({modes:e=[],active:t,setActive:n,rows:a=2})=>{const{t:s}=xe(),i=Math.max(1,a);return!e||e.length===0?null:r.jsx("div",{style:{position:"absolute",top:10,right:10,pointerEvents:"auto",zIndex:9999},children:r.jsx("div",{style:{display:"grid",gridAutoFlow:"column",gridTemplateRows:`repeat(${i}, auto)`,gridAutoColumns:"max-content",gap:6,background:"var(--nice-overlay-50, rgba(2, 6, 23, 0.5))",padding:6,borderRadius:10,border:"1px solid var(--nice-border-color, #334155)",backdropFilter:"blur(2px)",justifyItems:"end",alignItems:"start"},children:e.map(o=>r.jsx(Qp,{active:t===o,onClick:()=>n(o),title:`${s("visualizer.mode","Mode")}: ${o}`,children:o},o))})})};function Jp(e,t){const[n,a]=d.useState(()=>{try{const s=localStorage.getItem(e);return s?JSON.parse(s):t}catch{return t}});return d.useEffect(()=>{try{localStorage.setItem(e,JSON.stringify(n))}catch{}},[e,n]),[n,a]}const ef=({vu:e,hide:t})=>{if(t)return null;const n=12,a=Math.round(e*n);return r.jsx("div",{style:{position:"absolute",right:10,bottom:10,display:"flex",gap:2,background:"var(--nice-overlay-50, rgba(2, 6, 23, 0.5))",padding:"6px 8px",borderRadius:8,border:"1px solid var(--nice-border-color, #334155)",backdropFilter:"blur(2px)",pointerEvents:"none",zIndex:9998},children:Array.from({length:n}).map((s,i)=>{const o=120*(i/n);return r.jsx("div",{style:{width:6,height:18,borderRadius:2,background:i<a?`hsl(${o}, 80%, 50%)`:"var(--nice-text, #1f2937)"}},i)})})},tf="var(--player-bg, #0f172a)";function nf(e,t){const n=e.length;for(let a=0;a<n;a++){const s=a/n,i=.55*Math.exp(-Math.pow((s-(.12+.08*Math.sin(t*.7)))*7,2))+.45*Math.exp(-Math.pow((s-(.4+.15*Math.sin(t*1.1+1)))*9,2))+.3*(1-s)*(.55+.45*Math.sin(t*2+a*.06));e[a]=Math.max(0,Math.min(255,Math.floor(i*255)))}}function rf(e,t){const n=e.length;for(let a=0;a<n;a++){const s=a/n*Math.PI*2,i=Math.sin(s*3+t*3)*.5+Math.sin(s*7+t*2)*.28;e[a]=Math.max(0,Math.min(255,Math.floor(128+i*110)))}}const gl=({kind:e,audioRef:t,width:n="100%",height:a=360,coverUrl:s,title:i,subtitle:o,label:l,defaultMode:c="cover",storageKey:u="gp-stage:mode",allowedModes:h,imageUrls:p,imageCount:g=14,autoAnimate:y=!1})=>{const{t:m}=xe(),x=d.useMemo(()=>h!=null&&h.length?h:e==="youtube"?["video","cover"]:["cover","spectrum","bars","waveform","palette","radial","rays","particles","rings","grid","imageTornado","colorRipples","starfield","orbitals","eqcircle","triangles","blob","plasma","lavaLamp","cozyFire","rift"],[e,h]),b=d.useMemo(()=>{const Z=x.includes(c)?c:x[0];try{const w=localStorage.getItem(u);if(!w)return Z;const R=JSON.parse(w);return x.includes(R)?R:Z}catch{return Z}},[x,c,u]),[f,j]=Jp(u,b),v=d.useRef(null),C=d.useRef(null),N=d.useRef(null),M=d.useRef(null),k=d.useRef(null),T=d.useRef(null),E=d.useRef(0),A=d.useRef(0),I=d.useRef([]),[L,P]=d.useState(0),_=d.useRef(null),ee=d.useRef(null),K=d.useRef(null),z=d.useRef(null),V=d.useRef(null),W=d.useRef(null),H=d.useRef(null),G=f!=="cover"&&f!=="video";return d.useEffect(()=>{var O;if(e==="youtube"||(C.current&&(cancelAnimationFrame(C.current),C.current=null),!G))return;Yt();const Z=qn(),w=t.current;if(!w&&!y)return;if(w&&!N.current)try{N.current=Z.createMediaElementSource(w)}catch{}if(w&&!M.current){const U=Z.createAnalyser();U.fftSize=2048,U.smoothingTimeConstant=.85,M.current=U;try{(O=N.current)==null||O.connect(U)}catch{}try{U.connect(Z.destination)}catch{}}const R=M.current;k.current=new Uint8Array(R?R.frequencyBinCount:1024),T.current=new Uint8Array(R?R.fftSize:2048);const S=()=>{const U=v.current,$=Math.max(1,Math.floor(window.devicePixelRatio||1));U.width=Math.floor(U.clientWidth*$),U.height=Math.floor(U.clientHeight*$);const q=U.getContext("2d");q==null||q.setTransform(1,0,0,1,0,0),q==null||q.scale($,$)};S();const F=()=>S();window.addEventListener("resize",F),Yp(K,220,v.current.width,v.current.height);const Y=async()=>{const U=v.current;if(!U)return;const $=U.getContext("2d");if(!$)return;const q=Math.max(1,Math.floor(window.devicePixelRatio||1)),X=U.width/q,re=U.height/q,oe=performance.now()*.001,se=f==="waveform"||f==="rift";R&&(se?R.getByteTimeDomainData(T.current):R.getByteFrequencyData(k.current)),y&&(nf(k.current,oe),rf(T.current,oe));let D=0;const J=se?T.current:k.current;for(let ae=0;ae<J.length;ae++){const ce=se?(J[ae]-128)/128:J[ae]/255;D+=ce*ce}if(D=Math.sqrt(D/J.length),P(Math.min(1,D)),$.clearRect(0,0,X,re),f==="spectrum")Kp($,X,re,k.current,E.current);else if(f==="bars")Rp($,X,re,k.current,E.current);else if(f==="waveform")Xp($,X,re,T.current);else if(f==="palette"){const ae=(E.current+D*120)%360;Bp($,X,re,k.current,ae)}else if(f==="radial")Up($,X,re,k.current,E.current);else if(f==="rays")Vp($,X,re,k.current,E.current,A);else if(f==="particles")Gp($,X,re,D,E.current,I);else if(f==="rings")Hp($,X,re,k.current,D,E.current);else if(f==="grid"){const ae=(E.current+D*160)%360;Ip($,X,re,k.current,ae)}else if(f==="imageTornado"){const ae=p!=null&&p.length?p:s?[s]:[];await _p(_,ae,g,X,re);const ce=(E.current+D*100)%360;Dp($,X,re,D,ce,_)}else if(f==="colorRipples"){const ae=(E.current+D*120)%360;Tp($,X,re,D,ae,ee)}else if(f==="starfield"){const ae=(E.current+60)%360;Zp($,X,re,D,ae,K)}else if(f==="orbitals"){const ae=(E.current+D*180)%360;Op($,X,re,k.current,ae,A)}else if(f==="eqcircle"){const ae=(E.current+120)%360;Ap($,X,re,k.current,ae)}else if(f==="triangles"){const ae=(E.current+40)%360;Fp($,X,re,D,ae,z)}else if(f==="blob"){const ae=(E.current+90)%360;Np($,X,re,D,ae,V)}else if(f==="plasma"){const ae=(E.current+D*200)%360;Wp($,X,re,oe,D,ae)}else if(f==="rift")qp($,X,re,T.current,D,oe);else if(f==="lavaLamp"){const ae=(E.current+D*80)%360;zp($,X,re,D,ae,W)}else if(f==="cozyFire"){const ae=(E.current+D*140)%360;$p($,X,re,k.current,D,ae,H)}E.current=(E.current+.4)%360,C.current=requestAnimationFrame(Y)};return C.current=requestAnimationFrame(Y),()=>{window.removeEventListener("resize",F),C.current&&cancelAnimationFrame(C.current)}},[G,e,t,f,p,g,s,y]),r.jsxs(r.Fragment,{children:[r.jsx("div",{style:{position:"absolute",inset:0,pointerEvents:"none",background:f==="cover"?"transparent":tf},children:f==="cover"?r.jsx("div",{style:{position:"absolute",inset:0,display:"grid",placeItems:"center"},children:r.jsx(Ep,{height:a,coverUrl:s,title:i,subtitle:o,label:l})}):r.jsx("canvas",{ref:v,style:{width:typeof n=="number"?`${n}px`:n,height:a,borderRadius:8},role:"img","aria-label":m("stageVisualizer.stageVisualizerCanvas","Stage visualizer canvas")})}),r.jsxs("div",{style:{position:"absolute",inset:0,pointerEvents:"none"},children:[r.jsx(ml,{modes:x,active:f,setActive:j,rows:2}),r.jsx(ef,{vu:L,hide:e==="youtube"})]})]})},af=({height:e,autoPlay:t,track:n,source:a,ytRef:s,audioRef:i,hlsRef:o,setVol:l,onEnd:c,volume:u,extractVideoId:h})=>{const p=a==null?void 0:a.url,g=a==null?void 0:a.kind,y=a==null?void 0:a.withCredentials,m=JSON.stringify((a==null?void 0:a.headers)??null),x=d.useRef(u);x.current=u,d.useEffect(()=>{i.current&&(i.current.volume=u)},[i,u]),d.useEffect(()=>{const v=i.current;if(v){if(v.volume=x.current,v.crossOrigin=y?"use-credentials":"anonymous",g==="hls"&&Cp(p)){const C=()=>{v.src=p,v.load(),t&&v.play().catch(()=>{})};if(v.canPlayType("application/vnd.apple.mpegurl")){C();return}(async()=>{const M=(await import("hls.js")).default;if(M.isSupported()){const k=JSON.parse(m),T=new M({xhrSetup:E=>{if(y&&(E.withCredentials=!0),k)for(const[A,I]of Object.entries(k))E.setRequestHeader(A,String(I))}});o.current=T,T.loadSource(p),T.attachMedia(v),T.on(M.Events.MANIFEST_PARSED,()=>t&&v.play().catch(()=>{}))}else C()})()}g==="audio"&&p&&(v.src=p,v.load(),t&&v.play().catch(()=>{}))}},[i,o,p,g,y,m,t]);const b=(a==null?void 0:a.kind)==="youtube",f=b?"video":"cover",j=`gp-stage:mode:${(a==null?void 0:a.kind)??"none"}`;return r.jsxs("div",{className:"gp-stage",style:{width:"100%",height:e,background:b?"transparent":"var(--player-bg, #0f172a)",borderRadius:8,overflow:"hidden",position:"relative",display:"grid",placeItems:"center"},children:[(a==null?void 0:a.kind)==="youtube"&&r.jsx(Pa,{videoId:a.videoId??h(a.url),onReady:v=>{s.current=v.target,l(u),t&&v.target.playVideo()},onEnd:c,opts:{width:"100%",height:"100%",playerVars:{autoplay:t?1:0,controls:0,modestbranding:1,rel:0,showinfo:0,fs:0,disablekb:1,iv_load_policy:3}},style:{width:"100%",height:"100%"}}),((a==null?void 0:a.kind)==="audio"||(a==null?void 0:a.kind)==="hls")&&r.jsxs(r.Fragment,{children:[r.jsx("div",{style:{textAlign:"center",color:"var(--nice-overlay-light-90, #e2e8f0)"},children:n!=null&&n.coverUrl?r.jsx("img",{alt:"cover",src:n.coverUrl,style:{height:e-24,objectFit:"contain"}}):r.jsxs("div",{style:{opacity:.8},children:[r.jsxs("div",{style:{fontSize:18,fontWeight:600},children:[n==null?void 0:n.artist," — ",n==null?void 0:n.title]}),r.jsx("div",{style:{marginTop:8,fontSize:12,color:"var(--nice-text-dim, #94a3b8)"},children:(a==null?void 0:a.label)??`${(a==null?void 0:a.codec)??""} ${(a==null?void 0:a.quality)??""}`.trim()})]})}),r.jsx("audio",{ref:i,onEnded:c,onLoadedMetadata:()=>{},crossOrigin:a!=null&&a.withCredentials?"use-credentials":"anonymous",style:{display:"none"}})]}),r.jsx(gl,{kind:(a==null?void 0:a.kind)==="hls"?"hls":(a==null?void 0:a.kind)??"audio",audioRef:i,hlsRef:o,height:e,coverUrl:n==null?void 0:n.coverUrl,title:n==null?void 0:n.title,subtitle:n==null?void 0:n.artist,label:(a==null?void 0:a.label)??`${(a==null?void 0:a.codec)??""} ${(a==null?void 0:a.quality)??""}`.trim(),defaultMode:f,storageKey:j},`vis-${j}`)]})},sf=({artist:e,title:t,hideControls:n=!0,isPlaying:a,onTimeUpdate:s,searchYouTubeByArtistTitle:i})=>{const{t:o}=xe(),[l,c]=d.useState(e||""),[u,h]=d.useState(t||""),[p,g]=d.useState(null),[y,m]=d.useState(null),x=d.useRef(null),[b,f]=d.useState({width:Math.min(560,window.innerWidth-32),height:Math.min(315,(window.innerWidth-32)*9/16)});d.useEffect(()=>{e&&t&&i&&i(e,t).then(g)},[e,t,i]),d.useEffect(()=>{y&&(a?y.playVideo():y.pauseVideo())},[a,y]),d.useEffect(()=>{if(y&&s){const v=setInterval(()=>{const C=y.getCurrentTime();s(C)},100);return()=>clearInterval(v)}},[y,s]),d.useEffect(()=>{const v=()=>{if(x.current){const C=x.current.clientWidth,N=Math.round(C*(9/16));f({width:C,height:N})}};return v(),window.addEventListener("resize",v),()=>window.removeEventListener("resize",v)},[]);const j=async()=>{if(!i)return;const v=await i(l,u);g(v)};return r.jsxs("div",{ref:x,style:{width:"100%",maxWidth:"900px",margin:"0 auto"},children:[(!e||!t||!p)&&r.jsxs("div",{children:[r.jsx("input",{value:l,onChange:v=>c(v.target.value),placeholder:o("youtubePlayer.artist","Artist"),"aria-label":o("youtubePlayer.artist","Artist")}),r.jsx("input",{value:u,onChange:v=>h(v.target.value),placeholder:o("youtubePlayer.title","Title"),"aria-label":o("youtubePlayer.title","Title")}),r.jsx("button",{onClick:j,children:o("youtubePlayer.search","Search")})]}),p&&r.jsxs("div",{children:[r.jsx(Pa,{videoId:p,opts:{width:b.width.toString(),height:b.height.toString(),playerVars:{autoplay:1,controls:0,modestbranding:1,rel:0,showinfo:0,fs:0,disablekb:1,iv_load_policy:3,annotations:0}},onReady:v=>m(v.target)}),!n&&r.jsxs("div",{style:{marginTop:"10px",display:"flex",gap:"10px"},children:[r.jsxs("button",{onClick:()=>y==null?void 0:y.playVideo(),children:[r.jsx(B.NtdPlay,{size:14})," ",o("youtubePlayer.play","Play")]}),r.jsxs("button",{onClick:()=>y==null?void 0:y.pauseVideo(),children:[r.jsx(B.NtdPause,{size:14})," ",o("youtubePlayer.pause","Pause")]})]})]})]})},ri=e=>({name:e,dirs:new Map,files:[]}),of=e=>(e??[]).map(t=>t instanceof File?{file:t}:t),lf=e=>e.replace(/\\/g,"/"),cf=e=>{const t=ri("/");for(const n of e){const a=lf(n.path??n.file.name).split("/").filter(Boolean);if(a.length<=1){t.files.push({file:n.file,path:a[0]??n.file.name});continue}let s=t;for(let i=0;i<a.length-1;i++){const o=a[i];s.dirs.has(o)||s.dirs.set(o,ri(o)),s=s.dirs.get(o)}s.files.push({file:n.file,path:a[a.length-1]??n.file.name})}return t},ya=e=>e.slice().sort((t,n)=>(t.path??t.file.name).localeCompare(n.path??n.file.name)),df={tidal:B.NtdWave,spotify:B.NtdMusic,youtube:B.NtdPlay},va=({q:e,setQ:t,t:n})=>r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[r.jsx("div",{style:{flex:1},children:r.jsx(ie.NiceTextInput,{value:e,onChange:t,placeholder:n("libraryExplorer.searchPlaceholder","Search…"),size:"sm"})}),e&&r.jsx(ie.NiceButton,{variant:"ghost",size:"sm",onClick:()=>t(""),children:r.jsx(B.NtdClose,{size:14})})]}),ba=({files:e,t,onOpenInEditor:n,onPlayFile:a})=>e.length?r.jsx("div",{style:{borderRadius:12,border:"1px solid var(--nice-border, #334155)",overflow:"hidden"},children:r.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13},children:[r.jsx("thead",{children:r.jsxs("tr",{style:{color:"var(--nice-text-muted, #94a3b8)",textAlign:"left"},children:[r.jsx("th",{style:{padding:"8px 12px",fontWeight:600},children:t("libraryExplorer.colFile","File")}),r.jsx("th",{style:{padding:"8px 12px",fontWeight:600},children:t("libraryExplorer.colType","Type")}),r.jsx("th",{style:{padding:"8px 12px",fontWeight:600,width:200},children:t("libraryExplorer.colActions","Actions")})]})}),r.jsx("tbody",{children:e.map(s=>{const i=s.path??s.file.name;return r.jsxs("tr",{style:{borderTop:"1px solid var(--nice-border, #1e293b)"},children:[r.jsx("td",{style:{padding:"6px 12px",maxWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:i}),r.jsx("td",{style:{padding:"6px 12px",color:"var(--nice-text-muted, #94a3b8)"},children:s.file.type||"—"}),r.jsxs("td",{style:{padding:"6px 12px",display:"flex",gap:6},children:[n&&r.jsxs(ie.NiceButton,{variant:"outline",size:"sm",onClick:()=>n(s.file),children:[r.jsx(B.NtdEdit,{size:13})," ",t("libraryExplorer.openInEditor","Edit")]}),a&&r.jsxs(ie.NiceButton,{variant:"primary",size:"sm",onClick:()=>a(s.file),children:[r.jsx(B.NtdPlay,{size:13})," ",t("libraryExplorer.play","Play")]})]})]},i)})})]})}):r.jsx("div",{style:{fontSize:13,color:"var(--nice-text-muted, #94a3b8)",padding:12},children:t("libraryExplorer.noFiles","No files")}),yl=({streams:e,t,onPlayStream:n})=>e.length?r.jsxs("div",{style:{borderRadius:12,border:"1px solid var(--nice-border, #334155)",overflow:"hidden"},children:[r.jsx("div",{style:{padding:"8px 12px",fontSize:13,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)"},children:t("libraryExplorer.streaming","Streaming")}),r.jsx("ul",{style:{listStyle:"none",margin:0,padding:0},children:e.map(a=>r.jsxs("li",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8,borderTop:"1px solid var(--nice-border, #1e293b)",padding:"8px 12px"},children:[r.jsxs("div",{style:{minWidth:0},children:[r.jsx("div",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:a.title}),r.jsxs("div",{style:{fontSize:12,color:"var(--nice-text-muted, #94a3b8)",display:"flex",alignItems:"center",gap:4},children:[d.createElement(df[a.provider],{size:12})," ",a.provider.toUpperCase(),a.artist?` • ${a.artist}`:""]})]}),n&&r.jsxs(ie.NiceButton,{variant:"primary",size:"sm",onClick:()=>n(a),children:[r.jsx(B.NtdPlay,{size:13})," ",t("libraryExplorer.play","Play")]})]},`${a.provider}:${a.id}`))})]}):null,ta=({name:e,enabled:t})=>r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"4px 8px",fontSize:13},children:[r.jsx("span",{style:{width:8,height:8,borderRadius:"50%",background:t?"var(--nice-success, #10b981)":"var(--nice-border, #d1d5db)"}}),r.jsx("span",{style:{color:t?"inherit":"var(--nice-text-muted, #94a3b8)"},children:e})]}),uf=({variant:e="full",files:t=[],streams:n=[],enableProviders:a,onOpenInEditor:s,onPlayFile:i,onPlayStream:o,className:l,t:c,style:u,id:h,accessMode:p,"data-testid":g})=>{const{t:y}=xe(),m=c??y,[x,b]=d.useState(""),f=d.useMemo(()=>of(t),[t]),j=d.useCallback(N=>{const M=x.trim().toLowerCase();return!M||N.toLowerCase().includes(M)},[x]),v=d.useMemo(()=>ya(f).filter(N=>j(`${N.path??N.file.name} ${N.file.type||""}`)),[f,j]),C=d.useMemo(()=>n.filter(N=>j(`${N.title} ${N.artist??""} ${N.provider}`)),[n,j]);return p==="hidden"?null:e==="minimal"?r.jsxs("div",{className:l,style:{display:"flex",flexDirection:"column",gap:12,...u},id:h,"data-testid":g,children:[r.jsx(va,{q:x,setQ:b,t:m}),r.jsx(ba,{files:v,t:m,onOpenInEditor:s,onPlayFile:i}),r.jsx(yl,{streams:C,t:m,onPlayStream:o})]}):e==="onlyFiles"?r.jsxs("div",{className:l,style:{display:"flex",flexDirection:"column",gap:12,...u},id:h,"data-testid":g,children:[r.jsx(va,{q:x,setQ:b,t:m}),r.jsx(ba,{files:v,t:m,onOpenInEditor:s,onPlayFile:i})]}):r.jsx(hf,{q:x,setQ:b,normFiles:f,filteredStreams:C,enableProviders:a,onOpenInEditor:s,onPlayFile:i,onPlayStream:o,className:l,style:u,id:h,"data-testid":g,t:m})},hf=({q:e,setQ:t,normFiles:n,filteredStreams:a,enableProviders:s,onOpenInEditor:i,onPlayFile:o,onPlayStream:l,className:c,style:u,id:h,"data-testid":p,t:g})=>{const y=d.useMemo(()=>cf(n),[n]),[m,x]=d.useState({}),[b,f]=d.useState("/"),j=M=>x(k=>({...k,[M]:!k[M]})),v=(M,k)=>{const T=k==="/"?`/${M.name}`:`${k}${M.name}/`,E=k==="/"&&M.name==="/",A=m[T]??E,I=Array.from(M.dirs.keys()).sort();return r.jsxs("div",{children:[!E&&r.jsxs("button",{type:"button",onClick:()=>{j(T),f(T)},style:{display:"flex",alignItems:"center",gap:8,width:"100%",padding:"4px 8px",border:"none",borderRadius:6,cursor:"pointer",textAlign:"left",background:b===T?"var(--nice-accent-tint-20, rgba(99,102,241,0.2))":"transparent",color:"var(--nice-text, inherit)"},children:[r.jsx("span",{style:{display:"inline-flex"},children:A?r.jsx(B.NtdFolderOpen,{size:14}):r.jsx(B.NtdFolder,{size:14})}),r.jsx("span",{style:{fontSize:13},children:M.name})]}),(E||A)&&r.jsx("div",{style:{paddingLeft:E?0:16},children:I.map(L=>v(M.dirs.get(L),T))})]},T)},C=d.useMemo(()=>{let M;if(b==="/")M=ya(n);else{const k=b.replace(/^\//,"").split("/").filter(Boolean);let T=y;for(const E of k){const A=T.dirs.get(E);if(!A)return[];T=A}M=ya(T.files)}return e?M.filter(k=>(k.path??k.file.name).toLowerCase().includes(e.toLowerCase())):M},[b,y,n,e]),N={tidal:(s==null?void 0:s.tidal)??!0,spotify:(s==null?void 0:s.spotify)??!0,youtube:(s==null?void 0:s.youtube)??!0};return r.jsxs("div",{className:c,style:{display:"flex",gap:12,color:"var(--nice-text, #e2e8f0)",...u},id:h,"data-testid":p,children:[r.jsxs("div",{style:{flex:"0 0 220px",border:"1px solid var(--nice-border, #334155)",borderRadius:12,padding:8},children:[r.jsx("div",{style:{padding:"0 8px 8px",fontSize:12,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)"},children:g("libraryExplorer.library","Library")}),v(y,"/"),r.jsxs("div",{style:{marginTop:16,borderTop:"1px solid var(--nice-border, #1e293b)",paddingTop:8},children:[r.jsx("div",{style:{padding:"0 8px 4px",fontSize:12,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)"},children:g("libraryExplorer.streaming","Streaming")}),r.jsx(ta,{name:"Tidal",enabled:N.tidal}),r.jsx(ta,{name:"Spotify",enabled:N.spotify}),r.jsx(ta,{name:"YouTube",enabled:N.youtube})]})]}),r.jsxs("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:12},children:[r.jsx(va,{q:e,setQ:t,t:g}),r.jsx(ba,{files:C,t:g,onOpenInEditor:i,onPlayFile:o}),(N.tidal||N.spotify||N.youtube)&&r.jsx(yl,{streams:a.filter(M=>N[M.provider]),t:g,onPlayStream:l})]})]})},pf=({kind:e,color:t})=>{const n={width:14,height:14,viewBox:"0 0 24 24",fill:t,"aria-hidden":!0};switch(e){case"youtube":return r.jsx("svg",{...n,children:r.jsx("path",{d:"M23 7.2s-.2-1.6-.9-2.3c-.8-.9-1.7-.9-2.1-1C16.9 3.5 12 3.5 12 3.5s-4.9 0-8 .4c-.4.1-1.3.1-2.1 1C1.2 5.6 1 7.2 1 7.2S.8 9.1.8 11v1.8c0 1.9.2 3.8.2 3.8s.2 1.6.9 2.3c.8.9 1.9.9 2.4 1 1.7.2 7.7.4 7.7.4s4.9 0 8-.4c.4-.1 1.3-.1 2.1-1 .7-.7.9-2.3.9-2.3s.2-1.9.2-3.8V11c0-1.9-.2-3.8-.2-3.8zM9.7 14.6V8.2l6.3 3.2-6.3 3.2z"})});case"spotify":return r.jsx("svg",{...n,children:r.jsx("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4.59 14.42c-.18.3-.57.4-.87.21-2.39-1.46-5.4-1.79-8.95-.98-.34.08-.68-.13-.76-.47-.08-.34.13-.68.47-.76 3.88-.89 7.21-.5 9.89 1.13.31.19.4.58.22.87zm1.23-2.72c-.23.37-.71.49-1.08.26-2.74-1.69-6.92-2.18-10.16-1.19-.41.13-.85-.11-.97-.52-.13-.41.11-.85.52-.97 3.7-1.12 8.31-.58 11.45 1.34.37.23.49.71.24 1.08zm.11-2.84C14.55 8.84 9.5 8.66 6.43 9.6c-.49.15-1.01-.13-1.16-.62-.15-.49.13-1.01.62-1.16 3.52-1.07 9.1-.86 12.69 1.27.43.26.57.82.31 1.25-.26.43-.82.57-1.25.31z"})});case"tidal":return r.jsx("svg",{...n,children:r.jsx("path",{d:"M12 2L8 6l4 4 4-4-4-4zM4 6L0 10l4 4 4-4-4-4zm16 0l-4 4 4 4 4-4-4-4zm-8 8l-4 4 4 4 4-4-4-4z"})});case"hls":return r.jsx("svg",{...n,children:r.jsx("path",{d:"M2 12h2v6H2v-6zm4-4h2v10H6V8zm4-4h2v14h-2V4zm4 4h2v10h-2V8zm4 4h2v6h-2v-6z"})});case"audio":default:return r.jsx("svg",{...n,children:r.jsx("path",{d:"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"})})}},Qa=({data:e,display:t,callbacks:n,state:a})=>{const{id:s,index:i,artist:o,title:l,version:c,lp:u,sourcesAvailable:h=[]}=e,{allowVersion:p=!0,dragHandleProps:g}=t,{onChange:y,onRemove:m,onMoveUp:x,onMoveDown:b,onChangeLp:f,onSelectSource:j}=n,{readOnly:v=!1,canMoveUp:C=!0,canMoveDown:N=!0,activeSource:M}=a,{t:k}=xe(),T=d.useRef(null);d.useEffect(()=>{!o&&T.current&&T.current.focus()},[o]);const E=P=>{if(!v&&P.key==="Enter"){const _=P.target.closest("div.gpi-row"),ee=_==null?void 0:_.querySelectorAll("input[data-role='field']");if(!ee||ee.length===0)return;const K=Array.from(ee).indexOf(P.target),z=ee[K+1]??ee[0];z==null||z.focus()}},A=P=>{const _=h.includes(P),ee=M===P,K={width:30,height:30,display:"grid",placeItems:"center",borderRadius:6,border:"1px solid var(--nice-border, #e5e7eb)",background:ee?"var(--nice-selected-bg, #eef2ff)":"var(--nice-bg, #fff)",opacity:_?1:.35,cursor:_&&j&&!v?"pointer":"default",transition:"transform .05s ease"},z=P==="youtube"?"var(--nice-danger, #ff0000)":P==="spotify"?"var(--nice-success, #1db954)":P==="tidal"?"var(--nice-text, #111827)":P==="hls"?"var(--nice-accent, #7c3aed)":"var(--nice-text, #374151)",V=P==="youtube"?"YouTube":P==="spotify"?"Spotify":P==="tidal"?"TIDAL":P==="hls"?"HLS":k("playlistItem.audio","Audio"),W=k("playlistItem.sourceLabel","Source")+": "+V+(ee?` ${k("playlistItem.sourceSelected","(selected)")}`:""),H=()=>{!_||!j||v||j(P)};return r.jsx("button",{type:"button",title:V,onClick:H,disabled:!_||v,style:K,"aria-pressed":ee,"aria-label":W,children:r.jsx(pf,{kind:P,color:z})},P)},I=["youtube","tidal","spotify","hls","audio"],L=typeof u=="number"?u:i+1;return r.jsxs("div",{className:"gpi-row",role:"group","aria-label":k("playlistItem.trackNumber","Track")+" "+(i+1),style:{display:"grid",gridTemplateColumns:p?"56px 1fr 1fr 1fr auto auto":"56px 1fr 1fr auto auto",gap:8,alignItems:"center"},children:[r.jsx("input",{type:"number",min:1,value:L,onChange:P=>f==null?void 0:f(Number(P.target.value)),disabled:v||!f,"aria-label":k("playlistItem.lp","Lp"),title:k("playlistItem.positionOnList","Position in the list"),style:ff}),r.jsx("input",{ref:T,"data-role":"field",type:"text",value:o,onChange:P=>y({artist:P.target.value}),placeholder:k("playlistItem.artist","Artist"),onKeyDown:E,disabled:v,"aria-label":k("playlistItem.artist","Artist"),className:"gpi-input",style:na}),r.jsx("input",{"data-role":"field",type:"text",value:l,onChange:P=>y({title:P.target.value}),placeholder:k("playlistItem.title","Title"),onKeyDown:E,disabled:v,"aria-label":k("playlistItem.title","Title"),className:"gpi-input",style:na}),p&&r.jsx("input",{"data-role":"field",type:"text",value:c??"",onChange:P=>y({version:P.target.value||void 0}),placeholder:k("playlistItem.versionOptional","Version (optional)"),onKeyDown:E,disabled:v,"aria-label":k("playlistItem.version","Version"),className:"gpi-input",style:na}),r.jsx("div",{className:"gpi-sources",style:{display:"flex",gap:6,justifyContent:"flex-end",alignItems:"center"},"aria-label":k("playlistItem.availableSources","Available sources"),children:I.map(A)}),r.jsxs("div",{className:"gpi-actions",style:{display:"flex",gap:6,justifyContent:"flex-end"},children:[g&&r.jsx("button",{type:"button",...g,draggable:!0,"aria-label":k("playlistItem.dragReorder","Drag to reorder"),title:k("playlistItem.dragReorder","Drag to reorder"),style:tr,children:r.jsx(B.NtdMenu,{size:14})}),r.jsx("button",{type:"button",onClick:x,disabled:!C||v,"aria-label":k("playlistItem.moveUp","Move up"),title:k("playlistItem.moveUp","Move up"),style:tr,children:r.jsx(B.NtdArrowUp,{size:14})}),r.jsx("button",{type:"button",onClick:b,disabled:!N||v,"aria-label":k("playlistItem.moveDown","Move down"),title:k("playlistItem.moveDown","Move down"),style:tr,children:r.jsx(B.NtdArrowDown,{size:14})}),r.jsx("button",{type:"button",onClick:m,disabled:v,"aria-label":k("common.delete","Delete"),title:k("common.delete","Delete"),style:{...tr,color:"var(--nice-color-danger, #b91c1c)"},children:r.jsx(B.NtdClose,{size:14})})]})]})},ff={width:48,border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:6,padding:"8px 6px",fontSize:14,textAlign:"center"},na={width:"100%",border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:6,padding:"8px 10px",fontSize:14},tr={border:"1px solid var(--nice-border, #d1d5db)",background:"var(--nice-bg, #fff)",padding:"6px 8px",borderRadius:6,cursor:"pointer"},xa=()=>Math.random().toString(36).slice(2,10),nr=e=>(e??[]).map(t=>({id:xa(),...t})),mf=e=>e.map(({id:t,...n})=>n),gf=null,yf=e=>{const t=e.trim();if(!t)return null;const n=t.split(/\s[-–—]\s/);if(n.length<2){const o=t.split(/[;|]/).map(l=>l.trim());return o.length>=2?{artist:o[0],title:o[1],version:o[2]||void 0}:null}const a=n[0].trim(),s=n.slice(1).join(" - ").trim(),i=s.match(/^(.*?)\s*[([](.+?)[)\]]\s*$/);if(i){const o=i[1].trim(),l=i[2].trim();return{artist:a,title:o,version:l||void 0}}return{artist:a,title:s,version:void 0}},vf=({value:e,defaultValue:t,onChange:n,allowVersion:a=!0,maxItems:s,addButtonLabel:i,emptyState:o=gf,readOnly:l=!1,autoFocusNewItem:c=!0,enableBulkPaste:u=!0})=>{const{t:h}=xe(),p=e!==void 0,[g,y]=d.useState(()=>nr(e||t)),[m,x]=d.useState(""),b=d.useRef(null),[f,j]=d.useState(null);d.useEffect(()=>{p&&y(nr(e))},[p,JSON.stringify(e)]);const v=d.useCallback(W=>{n==null||n(mf(W))},[n]),C=d.useCallback(W=>{if(p){const H=W(nr(e));v(H)}else y(H=>{const G=W(H);return v(G),G})},[v,p,e]),N=s?g.length<s:!0,M=d.useCallback(()=>{!N||l||C(W=>[...W,{id:xa(),artist:"",title:"",version:void 0}])},[N,l,C]),k=d.useCallback((W,H)=>{C(G=>G.map(Z=>Z.id===W?{...Z,...H}:Z))},[C]),T=d.useCallback(W=>{l||C(H=>H.filter(G=>G.id!==W))},[l,C]),E=d.useCallback((W,H)=>{C(G=>{const Z=G.findIndex(F=>F.id===W);if(Z<0)return G;const w=Z+H;if(w<0||w>=G.length)return G;const R=[...G],[S]=R.splice(Z,1);return R.splice(w,0,S),R})},[C]),A=d.useCallback((W,H)=>{C(G=>{const Z=G.findIndex(F=>F.id===W);if(Z<0)return G;const w=Math.max(0,Math.min(G.length-1,H-1));if(Z===w)return G;const R=[...G],[S]=R.splice(Z,1);return R.splice(w,0,S),R})},[C]),I=W=>H=>{l||(b.current=W,H.dataTransfer.effectAllowed="move",H.dataTransfer.setData("text/plain",W))},L=W=>H=>{l||(H.preventDefault(),H.dataTransfer.dropEffect="move",j(W))},P=W=>()=>j(H=>H===W?null:H),_=W=>H=>{if(l)return;H.preventDefault();const G=b.current??H.dataTransfer.getData("text/plain");j(null),b.current=null,!(!G||G===W)&&C(Z=>{const w=Z.findIndex(Y=>Y.id===G),R=Z.findIndex(Y=>Y.id===W);if(w<0||R<0||w===R)return Z;const S=[...Z],[F]=S.splice(w,1);return S.splice(R,0,F),S})},ee=()=>{b.current=null,j(null)},K=d.useCallback(()=>{if(!u||l)return;const H=m.split(/\r?\n/).map(G=>G.trim()).filter(Boolean).map(yf).filter(G=>!!G);H.length!==0&&(C(G=>{const Z=(s??1/0)-G.length,w=H.slice(0,Math.max(0,Z)).map(R=>({id:xa(),...R}));return[...G,...w]}),x(""))},[u,l,m,s,C]);d.useEffect(()=>{},[g.length,c]);const z=o??r.jsx("div",{style:{padding:"0.75rem",color:"var(--nice-text-secondary, #777)",fontStyle:"italic"},children:h("genericPlaylist.emptyState","No songs. Add the first one below.")}),V=i??h("genericPlaylist.addSong","Add song");return r.jsxs("div",{className:"gp-container",style:{border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:8,padding:12},children:[r.jsxs("div",{className:"gp-header",style:{display:"flex",alignItems:"center",gap:8,marginBottom:8},children:[r.jsx("h3",{style:{margin:0,fontSize:16},children:h("genericPlaylist.playlist","Playlist")}),r.jsx("div",{style:{marginLeft:"auto",display:"flex",gap:8},children:r.jsxs("button",{type:"button",onClick:M,disabled:!N||l,className:"gp-add",style:{padding:"6px 10px",borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)",background:"var(--nice-bg-secondary, #f9fafb)"},"aria-label":V,children:["+ ",V]})})]}),g.length===0?r.jsx("div",{className:"gp-empty",children:z}):r.jsx("ol",{className:"gp-list",style:{listStyle:"none",padding:0,margin:0,display:"grid",gap:8},children:g.map((W,H)=>{const G=f===W.id;return r.jsx("li",{draggable:!l,onDragStart:I(W.id),onDragOver:L(W.id),onDragLeave:P(W.id),onDrop:_(W.id),onDragEnd:ee,style:{border:G?"2px dashed var(--nice-info, #6366f1)":"2px solid transparent",borderRadius:8,padding:G?4:0},children:r.jsx(Qa,{data:{id:W.id,index:H,lp:H+1,artist:W.artist,title:W.title,version:a?W.version??void 0:void 0,sourcesAvailable:void 0},display:{allowVersion:a,dragHandleProps:{onDragStart:I(W.id)}},callbacks:{onChange:Z=>k(W.id,Z),onRemove:()=>T(W.id),onMoveUp:()=>E(W.id,-1),onMoveDown:()=>E(W.id,1),onChangeLp:Z=>A(W.id,Z)},state:{readOnly:l,canMoveUp:H>0,canMoveDown:H<g.length-1}})},W.id)})}),u&&!l&&r.jsx("div",{style:{marginTop:12},children:r.jsxs("details",{children:[r.jsx("summary",{style:{cursor:"pointer",color:"var(--nice-text, #374151)"},children:h("genericPlaylist.bulkPasteSummary","Paste multiple items at once")}),r.jsxs("div",{style:{marginTop:6},children:[r.jsx("textarea",{value:m,onChange:W=>x(W.target.value),placeholder:h("genericPlaylist.bulkPastePlaceholder",`Paste lines in format:
66
66
  Artist - Title (Version)
67
67
  Artist — Title [Remastered 2011]
68
- OR: Artist;Title;Version`),rows:3,style:{width:"100%",border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:6,padding:8,fontFamily:"inherit"}}),r.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginTop:6},children:[r.jsx("div",{style:{color:"var(--nice-text-secondary, #6b7280)",fontSize:12},children:h("genericPlaylist.bulkPasteHint","Each line will be added as a separate song.")}),r.jsx("button",{type:"button",onClick:Y,disabled:!m.trim(),style:{padding:"6px 10px",borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)",background:"var(--nice-bg-secondary, #f9fafb)"},children:h("genericPlaylist.addFromList","Add from list")})]})]})]})})]})},vl={music:F.NtdMusic,microphone:F.NtdMicrophone,volume:F.NtdVolume,wave:F.NtdWave,megaphone:F.NtdMegaphone,star:F.NtdStar,heart:F.NtdHeart,lightning:F.NtdLightning,sparkle:F.NtdSparkle,moon:F.NtdMoon,sun:F.NtdSun,mountain:F.NtdMountain,trophy:F.NtdTrophy,crown:F.NtdCrown,target:F.NtdTarget,pin:F.NtdPin},bf=Object.keys(vl),Sa=({icon:e,size:t=14})=>{if(!e)return null;const n=vl[e];return n?r.jsx(n,{size:t}):r.jsx("span",{children:e})},ai=["var(--nice-danger, #ef4444)","var(--nice-warning, #f97316)","var(--nice-warning, #f59e0b)","var(--nice-warning, #eab308)","var(--nice-success, #84cc16)","var(--nice-success, #22c55e)","var(--nice-info, #14b8a6)","var(--nice-info, #06b6d4)","var(--nice-primary, #3b82f6)","var(--nice-info, #6366f1)","var(--nice-accent, #8b5cf6)","var(--nice-accent, #a855f7)","var(--nice-color-accent-pink, #d946ef)","var(--nice-color-accent-pink, #ec4899)","var(--nice-danger, #f43f5e)","var(--nice-text-muted, #78716c)","var(--nice-text-secondary, #64748b)","var(--nice-text, #000000)"],rr=bf,xf=({tags:e,onCreateTag:t,onUpdateTag:n,onDeleteTag:a,selectedTracks:s,onAssignTag:i,onUnassignTag:o})=>{const{t:l}=xe(),[c,u]=d.useState(null),[h,p]=d.useState(""),[g,y]=d.useState(ai[8]),[m,x]=d.useState(rr[0]),[b,f]=d.useState(!1),[k,v]=d.useState(null),[w,R]=d.useState(""),[M,j]=d.useState(""),[T,P]=d.useState(""),A=d.useCallback(O=>{u(O.id),R(O.name),j(O.color),P(O.icon||rr[0])},[]),I=d.useCallback(()=>{c&&w.trim()&&(n(c,w.trim(),M,T),u(null))},[c,w,M,T,n]),L=d.useCallback(()=>{h.trim()&&(t(h.trim(),g,m),p(""),f(!1))},[h,g,m,t]),N=d.useCallback(O=>{k===O?(a(O),v(null)):(v(O),setTimeout(()=>v(null),3e3))},[k,a]),_=s&&s.length>0,ee=O=>!s||s.length===0?!1:s.every(U=>U.tags.includes(O)),Y=O=>!s||s.length===0?!1:s.some(U=>U.tags.includes(O))&&!ee(O);return r.jsxs("div",{style:{border:"1px solid var(--nice-border-color, #e5e7eb)",borderRadius:10,background:"var(--nice-bg-elevated, #fff)",overflow:"hidden"},children:[r.jsxs("div",{style:{padding:"10px 14px",borderBottom:"1px solid var(--nice-border-color, #e5e7eb)",display:"flex",alignItems:"center",gap:8,background:"var(--nice-color-surface, #f9fafb)"},children:[r.jsx(F.NtdTag,{size:16}),r.jsx("span",{style:{fontWeight:600,fontSize:"0.85rem"},children:l("playlistManager.tagManager","Tag manager")}),r.jsx("div",{style:{flex:1}}),r.jsxs("button",{onClick:()=>f(!b),style:{background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",border:"none",borderRadius:6,padding:"4px 10px",fontSize:"0.72rem",cursor:"pointer"},children:["+ ",l("playlistManager.newTag","New tag")]})]}),r.jsxs("div",{style:{padding:12},children:[b&&r.jsxs("div",{style:{border:"1px solid var(--nice-border-color, #d1d5db)",borderRadius:8,padding:10,marginBottom:12,background:"var(--nice-color-surface, #f9fafb)"},children:[r.jsxs("div",{style:{display:"flex",gap:6,marginBottom:8},children:[r.jsx("input",{type:"text",value:h,onChange:O=>p(O.target.value),placeholder:l("playlistManager.tagName","Tag name"),style:{flex:1,padding:"5px 10px",borderRadius:6,border:"1px solid var(--nice-border-color, #d1d5db)",fontSize:"0.8rem",background:"var(--nice-input-bg, #fff)",color:"var(--nice-text-primary, #1f2937)"},onKeyDown:O=>O.key==="Enter"&&L()}),r.jsx("button",{onClick:L,disabled:!h.trim(),style:{background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",border:"none",borderRadius:6,padding:"5px 12px",fontSize:"0.78rem",cursor:"pointer",opacity:h.trim()?1:.5},"aria-label":l("playlistManager.createTag","Create tag"),children:r.jsx(F.NtdCheck,{size:14})})]}),r.jsxs("div",{style:{marginBottom:6},children:[r.jsx("div",{style:{fontSize:"0.68rem",opacity:.6,marginBottom:4},children:l("playlistManager.color","Color")}),r.jsx("div",{style:{display:"flex",gap:3,flexWrap:"wrap"},children:ai.map(O=>r.jsx("div",{onClick:()=>y(O),style:{width:20,height:20,borderRadius:"50%",background:O,cursor:"pointer",border:g===O?"3px solid var(--nice-color-accent, #3b82f6)":"2px solid transparent",boxSizing:"border-box"}},O))})]}),r.jsxs("div",{children:[r.jsx("div",{style:{fontSize:"0.68rem",opacity:.6,marginBottom:4},children:l("playlistManager.icon","Icon")}),r.jsx("div",{style:{display:"flex",gap:3,flexWrap:"wrap"},children:rr.map(O=>r.jsx("div",{onClick:()=>x(O),style:{width:26,height:26,borderRadius:4,display:"flex",alignItems:"center",justifyContent:"center",cursor:"pointer",fontSize:"0.85rem",background:m===O?"var(--nice-accent-tint-10, #eff6ff)":"transparent",border:m===O?"1px solid var(--nice-color-accent, #3b82f6)":"1px solid transparent"},children:r.jsx(Sa,{icon:O,size:16})},O))})]})]}),_&&r.jsx("div",{style:{padding:"6px 10px",background:"var(--nice-accent-tint-10, #eff6ff)",borderRadius:6,marginBottom:8,fontSize:"0.72rem",color:"var(--nice-color-accent, #3b82f6)"},children:l("playlistManager.bulkTagHint","Click a tag to apply it to the selected tracks")+": "+s.length}),e.length===0?r.jsx("div",{style:{textAlign:"center",padding:20,opacity:.3,fontSize:"0.82rem"},children:l("playlistManager.noTags","No tags yet")}):r.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:e.map(O=>r.jsx("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"6px 10px",borderRadius:8,border:"1px solid var(--nice-border-color, #e5e7eb)",background:c===O.id?"var(--nice-color-surface, #f9fafb)":"transparent"},children:c===O.id?r.jsxs(r.Fragment,{children:[r.jsx("select",{value:T,onChange:U=>P(U.target.value),style:{border:"none",background:"transparent",fontSize:"0.9rem",cursor:"pointer"},children:rr.map(U=>r.jsx("option",{value:U,children:U},U))}),r.jsx("input",{type:"color",value:M,onChange:U=>j(U.target.value),style:{width:24,height:24,border:"none",cursor:"pointer",padding:0}}),r.jsx("input",{type:"text",value:w,onChange:U=>R(U.target.value),style:{flex:1,padding:"3px 8px",borderRadius:4,border:"1px solid var(--nice-border-color, #d1d5db)",fontSize:"0.78rem",background:"var(--nice-input-bg, #fff)",color:"var(--nice-text-primary, #1f2937)"},onKeyDown:U=>U.key==="Enter"&&I()}),r.jsx("button",{onClick:I,style:ar("var(--nice-color-accent, #3b82f6)"),"aria-label":l("common.save","Save"),children:r.jsx(F.NtdCheck,{size:14})}),r.jsx("button",{onClick:()=>u(null),style:ar("var(--nice-text-secondary, #9ca3af)"),"aria-label":l("common.cancel","Cancel"),children:r.jsx(F.NtdClose,{size:14})})]}):r.jsxs(r.Fragment,{children:[r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4,padding:"2px 10px",borderRadius:20,background:`${O.color}18`,color:O.color,fontWeight:600,fontSize:"0.78rem"},children:[r.jsx(Sa,{icon:O.icon,size:12}),O.name]}),_&&i&&o&&r.jsx("input",{type:"checkbox",checked:ee(O.id),ref:U=>{U&&(U.indeterminate=Y(O.id))},onChange:()=>{const U=s.map(V=>V.id);ee(O.id)?o(U,O.id):i(U,O.id)},style:{cursor:"pointer"}}),r.jsx("div",{style:{flex:1}}),r.jsx("button",{onClick:()=>A(O),style:ar("var(--nice-text-secondary, #9ca3af)"),title:l("playlistManager.editTag","Edit tag"),"aria-label":l("playlistManager.editTag","Edit tag"),children:r.jsx(F.NtdEdit,{size:14})}),r.jsx("button",{onClick:()=>N(O.id),style:ar(k===O.id?"var(--nice-color-error, #ef4444)":"var(--nice-text-secondary, #9ca3af)"),title:k===O.id?l("playlistManager.confirmDelete","Click again to delete"):l("playlistManager.deleteTag","Delete tag"),"aria-label":k===O.id?l("playlistManager.confirmDelete","Click again to delete"):l("playlistManager.deleteTag","Delete tag"),children:r.jsx(F.NtdTrash,{size:14})})]})},O.id))})]})]})},ar=e=>({background:"none",border:"none",cursor:"pointer",fontSize:"0.82rem",color:e,padding:"2px 4px"});var Ja=(e=>(e.Static="static",e.Dynamic="dynamic",e))(Ja||{}),bl=(e=>(e.List="list",e.Grid="grid",e.Compact="compact",e.DualPane="dual",e))(bl||{}),xl=(e=>(e.Left="left",e.Right="right",e))(xl||{}),ot=(e=>(e.Artist="artist",e.Title="title",e.Album="album",e.Genre="genre",e.Year="year",e.Duration="duration",e.Rating="rating",e.PlayCount="playCount",e.Tag="tag",e.Source="source",e.AddedDate="addedDate",e))(ot||{}),lt=(e=>(e.Equals="eq",e.NotEquals="neq",e.Contains="contains",e.NotContains="notContains",e.StartsWith="startsWith",e.GreaterThan="gt",e.LessThan="lt",e.Between="between",e.In="in",e.NotIn="notIn",e))(lt||{}),Sl=(e=>(e.Title="title",e.Artist="artist",e.Album="album",e.Duration="duration",e.AddedDate="addedDate",e.Year="year",e.Rating="rating",e.Custom="custom",e))(Sl||{}),dn=(e=>(e.Asc="asc",e.Desc="desc",e))(dn||{}),xt=(e=>(e.Library="library",e.Spotify="spotify",e.Tidal="tidal",e.YouTube="youtube",e.MusicBrainz="musicbrainz",e.Import="import",e.Manual="manual",e))(xt||{});const Sf="_editor_qz5p3_5",kf="_heading_qz5p3_19",wf="_hint_qz5p3_35",Cf="_group_qz5p3_49",jf="_groupOr_qz5p3_61",Mf="_groupShaded_qz5p3_67",Rf="_groupHeader_qz5p3_73",Nf="_groupHint_qz5p3_87",Tf="_groupActions_qz5p3_95",Pf="_rule_qz5p3_107",Ef="_value_qz5p3_121",$f="_value2_qz5p3_127",Af="_dash_qz5p3_133",If="_limit_qz5p3_141",Lf="_limitInput_qz5p3_159",at={editor:Sf,heading:kf,hint:wf,group:Cf,groupOr:jf,groupShaded:Mf,groupHeader:Rf,groupHint:Nf,groupActions:Tf,rule:Pf,value:Ef,value2:$f,dash:Af,limit:If,limitInput:Lf},_f=[{value:ot.Artist,label:"Artist"},{value:ot.Title,label:"Title"},{value:ot.Album,label:"Album"},{value:ot.Genre,label:"Genre"},{value:ot.Year,label:"Year"},{value:ot.Duration,label:"Duration (s)"},{value:ot.Rating,label:"Rating"},{value:ot.PlayCount,label:"Play Count"},{value:ot.Tag,label:"Tag"},{value:ot.Source,label:"Source"},{value:ot.AddedDate,label:"Added Date"}],zf=[{value:lt.Equals,label:"="},{value:lt.NotEquals,label:"≠"},{value:lt.Contains,label:"contains"},{value:lt.NotContains,label:"not contains"},{value:lt.StartsWith,label:"starts with"},{value:lt.GreaterThan,label:">"},{value:lt.LessThan,label:"<"},{value:lt.Between,label:"between"},{value:lt.In,label:"in"},{value:lt.NotIn,label:"not in"}];function Df(e){return"logic"in e&&"rules"in e}function ka(){return{id:ke.createId(),field:ot.Artist,operator:lt.Contains,value:""}}function kl(){return{id:ke.createId(),logic:"and",rules:[ka()]}}const Ff=({rule:e,onChange:t,onRemove:n})=>{const{t:a}=xe();return r.jsxs("div",{className:at.rule,children:[r.jsx(ie.NiceSelect,{size:"sm",controlWidth:150,"aria-label":a("playlistManager.ruleField","Field"),value:e.field,onChange:s=>t({...e,field:Tt(s)}),options:_f.map(s=>({value:s.value,label:a(`playlistManager.field.${s.value}`,s.label)}))}),r.jsx(ie.NiceSelect,{size:"sm",controlWidth:150,"aria-label":a("playlistManager.ruleOperator","Operator"),value:e.operator,onChange:s=>t({...e,operator:Tt(s)}),options:zf.map(s=>({value:s.value,label:a(`playlistManager.op.${s.value}`,s.label)}))}),r.jsx(ie.NiceTextInput,{size:"sm",className:at.value,"aria-label":a("playlistManager.ruleValue","Value"),placeholder:a("playlistManager.ruleValue","Value"),value:e.value,onChange:s=>t({...e,value:s})}),e.operator===lt.Between&&r.jsxs(r.Fragment,{children:[r.jsx("span",{className:at.dash,"aria-hidden":"true",children:"–"}),r.jsx(ie.NiceTextInput,{size:"sm",className:at.value2,"aria-label":a("playlistManager.ruleValue2","Value 2"),placeholder:a("playlistManager.ruleValue2","Value 2"),value:e.value2??"",onChange:s=>t({...e,value2:s})})]}),r.jsx(ie.NiceButton,{size:"sm",variant:"ghost",leftIcon:r.jsx(F.NtdClose,{size:14}),ariaLabel:a("playlistManager.removeRule","Remove rule"),title:a("playlistManager.removeRule","Remove rule"),onClick:n,children:null})]})},wl=({group:e,onChange:t,onRemove:n,depth:a=0})=>{const{t:s}=xe(),i=d.useCallback((p,g)=>{const y=[...e.rules];y[p]=g,t({...e,rules:y})},[e,t]),o=d.useCallback(p=>{const g=e.rules.filter((y,m)=>m!==p);t({...e,rules:g.length>0?g:[ka()]})},[e,t]),l=d.useCallback(()=>{t({...e,rules:[...e.rules,ka()]})},[e,t]),c=d.useCallback(()=>{t({...e,rules:[...e.rules,kl()]})},[e,t]),u=d.useCallback(()=>{t({...e,logic:e.logic==="and"?"or":"and"})},[e,t]),h=e.logic==="and";return r.jsxs("div",{className:`${at.group} ${h?"":at.groupOr} ${a%2===0?at.groupShaded:""}`,children:[r.jsxs("div",{className:at.groupHeader,children:[r.jsx(ie.NiceButton,{size:"sm",variant:h?"primary":"warning",onClick:u,title:s("playlistManager.toggleLogic","Toggle AND/OR"),children:h?s("playlistManager.logicAnd","AND"):s("playlistManager.logicOr","OR")}),r.jsx("span",{className:at.groupHint,children:h?s("playlistManager.matchAllRules","Match all of these rules"):s("playlistManager.matchAnyRule","Match any of these rules")}),r.jsxs("div",{className:at.groupActions,children:[r.jsx(ie.NiceButton,{size:"sm",variant:"outline",leftIcon:r.jsx(F.NtdPlus,{size:14}),onClick:l,title:s("playlistManager.addRuleHint","Add rule"),children:s("playlistManager.addRule","Rule")}),a<3&&r.jsx(ie.NiceButton,{size:"sm",variant:"outline",leftIcon:r.jsx(F.NtdPlus,{size:14}),onClick:c,title:s("playlistManager.addGroupHint","Add nested group"),children:s("playlistManager.addGroup","Group")}),n&&r.jsx(ie.NiceButton,{size:"sm",variant:"ghost",leftIcon:r.jsx(F.NtdClose,{size:14}),ariaLabel:s("playlistManager.removeGroup","Remove group"),title:s("playlistManager.removeGroup","Remove group"),onClick:n,children:null})]})]}),e.rules.map((p,g)=>Df(p)?r.jsx(wl,{group:p,onChange:y=>i(g,y),onRemove:()=>o(g),depth:a+1},p.id):r.jsx(Ff,{rule:p,onChange:y=>i(g,y),onRemove:()=>o(g)},p.id))]})},Of=({rules:e,onChange:t,limit:n,onLimitChange:a})=>{const{t:s}=xe(),[i]=d.useState(kl),o=e??i;return r.jsxs("div",{className:at.editor,children:[r.jsxs("h6",{className:at.heading,children:[r.jsx(F.NtdRepeat,{size:14})," ",s("playlistManager.dynamicRules","Dynamic Playlist Rules")]}),r.jsx("p",{className:at.hint,children:s("playlistManager.dynamicRulesHint","Tracks matching these rules will automatically be included in the playlist.")}),r.jsx(wl,{group:o,onChange:t}),a&&r.jsx("div",{className:at.limit,children:r.jsx(ie.NiceNumberInput,{size:"sm",className:at.limitInput,label:s("playlistManager.maxTracksLabel","Max tracks"),min:1,step:1,value:n??null,onChange:l=>a(l===null||l<=0?void 0:Math.round(l)),helperText:s("playlistManager.leaveEmptyForAllHint","Leave empty for unlimited")})})]})},si=e=>{if(!e)return"--:--";const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${String(n).padStart(2,"0")}`},Bf={spotify:"var(--source-spotify, #1db954)",tidal:"var(--source-tidal, #000000)",youtube:"var(--source-youtube, #ff0000)",musicbrainz:"var(--source-musicbrainz, #ba478f)"},Gf=({source:e})=>{if(e==="import")return r.jsx(F.NtdDownload,{size:12});if(e==="manual")return r.jsx(F.NtdEdit,{size:12});const t=Bf[e];return t?r.jsx(F.NtdCircle,{size:10,style:{color:t}}):r.jsx(F.NtdMusic,{size:12})},Cl=({tracks:e,tags:t,selectedTrackIds:n,onSelectionChange:a,onPlay:s,onRemove:i,onReorder:o,onTagTracks:l,onRateTracks:c,sortField:u,sortDir:h,onSortChange:p,filterText:g,onFilterChange:y,compact:m=!1,draggable:x=!1,onDragStart:b,dropTarget:f=!1,onDrop:k})=>{const{t:v}=xe(),[w,R]=d.useState(null),[M,j]=d.useState(null),T=d.useRef(null),P=d.useMemo(()=>{let C=e??[];if(g.trim()){const $=g.toLowerCase();C=C.filter(S=>{var B,H;return S.title.toLowerCase().includes($)||S.artist.toLowerCase().includes($)||((B=S.album)==null?void 0:B.toLowerCase().includes($))||((H=S.genre)==null?void 0:H.toLowerCase().includes($))})}return[...C].sort(($,S)=>{const B=h==="asc"?1:-1;switch(u){case"title":return B*$.title.localeCompare(S.title);case"artist":return B*$.artist.localeCompare(S.artist);case"album":return B*($.album??"").localeCompare(S.album??"");case"duration":return B*(($.duration??0)-(S.duration??0));case"year":return B*(($.year??0)-(S.year??0));case"rating":return B*(($.rating??0)-(S.rating??0));case"addedDate":return B*($.addedAt??"").localeCompare(S.addedAt??"");case"custom":return B*(($.customOrder??0)-(S.customOrder??0));default:return 0}})},[e,g,u,h]),A=d.useCallback((C,$)=>{const S=P[C];if(S){if($.ctrlKey||$.metaKey){const B=new Set(n);B.has(S.id)?B.delete(S.id):B.add(S.id),a(B)}else if($.shiftKey&&T.current!==null){const B=Math.min(T.current,C),H=Math.max(T.current,C),z=new Set(n);for(let Z=B;Z<=H;Z++)z.add(P[Z].id);a(z)}else a(new Set([S.id]));T.current=C}},[P,n,a]),I=d.useCallback(()=>{n.size===P.length?a(new Set):a(new Set(P.map(C=>C.id)))},[P,n,a]),L=({field:C,label:$,width:S})=>{const B=u===C;return r.jsxs("div",{style:{width:S,flex:S?void 0:1,cursor:"pointer",userSelect:"none",fontWeight:B?700:500,fontSize:"0.72rem",textTransform:"uppercase",letterSpacing:"0.04em",opacity:B?1:.6,display:"flex",alignItems:"center",gap:4},onClick:()=>{B?p(C,h===dn.Asc?dn.Desc:dn.Asc):p(C,dn.Asc)},children:[$,B&&(h==="asc"?r.jsx(F.NtdArrowUp,{size:10}):r.jsx(F.NtdArrowDown,{size:10}))]})},N=d.useCallback((C,$)=>{const S=n.has(C.id)?Array.from(n):[C.id];$.dataTransfer.setData("trackIds",JSON.stringify(S)),$.dataTransfer.effectAllowed="move",b==null||b(S,$)},[n,b]),_=d.useCallback((C,$)=>{$.preventDefault(),$.dataTransfer.dropEffect="move",R(C)},[]),ee=d.useCallback((C,$)=>{$.preventDefault(),R(null);try{const S=$.dataTransfer.getData("trackIds");if(S&&o){const B=JSON.parse(S),H=P.filter(E=>!B.includes(E.id)),z=P.filter(E=>B.includes(E.id)),Z=Math.min(C,H.length);H.splice(Z,0,...z),o(H.map(E=>E.id))}}catch{}},[P,o]),Y=d.useCallback(C=>{C.preventDefault(),R(null),k==null||k(C)},[k]),O=d.useMemo(()=>new Map(t.map(C=>[C.id,C])),[t]),U=C=>C.replace(/[^a-z0-9_-]/gi,"-"),V=m?36:48,K={display:"flex",alignItems:"center",gap:8,padding:"6px 12px",borderBottom:"1px solid var(--nice-border-color, #e5e7eb)",color:"var(--nice-text-secondary, #6b7280)"},G=(C,$)=>({display:"flex",alignItems:"center",gap:8,padding:m?"4px 12px":"6px 12px",height:V,cursor:"pointer",background:$?"var(--nice-color-accent-light, #dbeafe)":C?"var(--nice-selected-bg, #eff6ff)":"transparent",borderBottom:"1px solid var(--nice-border-light, #f3f4f6)",transition:"background 0.1s"}),W=P.length>0&&n.size===P.length;return r.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",overflow:"hidden"},onDragOver:f?C=>{C.preventDefault(),C.dataTransfer.dropEffect="copy"}:void 0,onDrop:f?Y:void 0,children:[r.jsxs("div",{style:{padding:"8px 12px",borderBottom:"1px solid var(--nice-border-color, #e5e7eb)",display:"flex",gap:8,alignItems:"center"},children:[r.jsx("input",{type:"text",value:g,onChange:C=>y(C.target.value),placeholder:v("playlistManager.filterTracks","Filter tracks..."),style:{flex:1,fontSize:"0.82rem",padding:"6px 10px",borderRadius:6,border:"1px solid var(--nice-border-color, #d1d5db)",background:"var(--nice-input-bg, #f9fafb)",color:"var(--nice-text-primary, #1f2937)"}}),r.jsxs("span",{style:{fontSize:"0.72rem",opacity:.5},children:[P.length,"/",(e??[]).length]}),n.size>0&&i&&r.jsxs("button",{style:{fontSize:"0.72rem",padding:"4px 8px",borderRadius:4,border:"1px solid var(--nice-color-error, #ef4444)",background:"transparent",color:"var(--nice-color-error, #ef4444)",cursor:"pointer"},onClick:()=>i(Array.from(n)),"aria-label":v("playlistManager.removeSelected","Remove selected"),children:[r.jsx(F.NtdTrash,{size:12})," ",n.size]})]}),r.jsxs("div",{style:K,children:[r.jsx("div",{style:{width:28},children:r.jsx("input",{type:"checkbox",checked:W,onChange:I,style:{cursor:"pointer"}})}),r.jsx("div",{style:{width:20},children:"#"}),!m&&r.jsx("div",{style:{width:44}}),r.jsx(L,{field:"title",label:v("playlistManager.colTitle","Title")}),r.jsx(L,{field:"artist",label:v("playlistManager.colArtist","Artist")}),!m&&r.jsx(L,{field:"album",label:v("playlistManager.colAlbum","Album")}),r.jsx(L,{field:"duration",label:v("playlistManager.colDuration","Duration"),width:60}),!m&&r.jsx(L,{field:"year",label:v("playlistManager.colYear","Year"),width:50}),r.jsx("div",{style:{width:30}})," ",!m&&r.jsx("div",{style:{width:60}})," ",r.jsx("div",{style:{width:24}})," "]}),r.jsxs("div",{style:{flex:1,overflow:"auto"},children:[P.length===0&&r.jsx("div",{style:{padding:24,textAlign:"center",opacity:.4,fontSize:"0.85rem"},children:e.length===0?v("playlistManager.emptyPlaylist","This playlist is empty"):v("playlistManager.noMatchingTracks","No tracks match the filter")}),P.map((C,$)=>{const S=n.has(C.id),B=w===$;return r.jsxs("div",{style:G(S,B),onClick:H=>A($,H),onDoubleClick:()=>s==null?void 0:s(C),draggable:x,onDragStart:H=>N(C,H),onDragOver:H=>_($,H),onDrop:H=>ee($,H),onDragLeave:()=>R(null),children:[r.jsx("div",{style:{width:28},children:r.jsx("input",{type:"checkbox",checked:S,onChange:()=>{const H=new Set(n);S?H.delete(C.id):H.add(C.id),a(H)},onClick:H=>H.stopPropagation(),style:{cursor:"pointer"}})}),r.jsx("div",{style:{width:20,fontSize:"0.7rem",opacity:.4},children:$+1}),!m&&r.jsx("div",{style:{width:44,height:36,flexShrink:0},children:C.coverUrl?r.jsx("img",{src:C.coverUrl,alt:C.title||v("common.coverArt","Cover art"),style:{width:36,height:36,borderRadius:4,objectFit:"cover"},loading:"lazy"}):r.jsx("div",{style:{width:36,height:36,borderRadius:4,background:"var(--nice-color-surface, #f3f4f6)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"0.9rem"},children:r.jsx(F.NtdMusic,{size:16})})}),r.jsx("div",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontSize:"0.82rem",fontWeight:500},children:C.title}),r.jsx("div",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontSize:"0.82rem",opacity:.7},children:C.artist}),!m&&r.jsx("div",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontSize:"0.78rem",opacity:.5},children:C.album}),r.jsx("div",{style:{width:60,fontSize:"0.78rem",opacity:.5,textAlign:"right"},children:si(C.duration)}),!m&&r.jsx("div",{style:{width:50,fontSize:"0.72rem",opacity:.4,textAlign:"center"},children:C.year||""}),r.jsx("div",{style:{width:30,textAlign:"center",fontSize:"0.75rem"},title:C.source,children:r.jsx(Gf,{source:C.source})}),!m&&r.jsxs("div",{style:{width:60,display:"flex",gap:2,overflow:"hidden"},children:[C.tags.slice(0,2).map(H=>{const z=O.get(H);if(!z)return null;const Z=`--tag-${U(H)}`;return r.jsx("span",{style:{fontSize:"0.6rem",padding:"1px 5px",borderRadius:8,background:`var(${Z}-bg, ${z.color}22)`,color:`var(${Z}, ${z.color})`,whiteSpace:"nowrap"},children:z.name},H)}),C.tags.length>2&&r.jsxs("span",{style:{fontSize:"0.6rem",opacity:.4},children:["+",C.tags.length-2]})]}),r.jsxs("div",{style:{width:24,display:"flex",alignItems:"center"},children:[r.jsx("button",{style:{background:"none",border:"none",cursor:"pointer",fontSize:"0.75rem",padding:2,opacity:.5,position:"relative"},onClick:H=>{H.stopPropagation(),j(M===C.id?null:C.id)},title:v("playlistManager.morActions","More actions"),"aria-label":v("playlistManager.morActions","More actions"),children:r.jsx(F.NtdTag,{size:12})}),M===C.id&&t.length>0&&r.jsxs("div",{style:{position:"absolute",right:12,marginTop:4,background:"var(--nice-bg-elevated, #fff)",border:"1px solid var(--nice-border-color, #e5e7eb)",borderRadius:8,padding:8,zIndex:100,boxShadow:"0 4px 12px var(--nice-overlay-10, rgba(0, 0, 0, 0.1))",minWidth:140},children:[r.jsx("div",{style:{fontSize:"0.7rem",fontWeight:600,marginBottom:4,opacity:.6},children:v("playlistManager.assignTag","Assign tag")}),t.map(H=>{const z=C.tags.includes(H.id);return r.jsxs("div",{style:{padding:"4px 8px",borderRadius:4,cursor:"pointer",fontSize:"0.78rem",display:"flex",alignItems:"center",gap:6,background:z?`var(--tag-${U(H.id)}-bg, ${H.color}22)`:"transparent"},onClick:Z=>{Z.stopPropagation();const E=n.size>0?Array.from(n):[C.id];z||l==null||l(E,[H.id]),j(null)},children:[r.jsx("span",{style:{width:10,height:10,borderRadius:"50%",background:`var(--tag-${U(H.id)}, ${H.color})`,flexShrink:0}}),r.jsx("span",{children:H.name}),z&&r.jsx(F.NtdCheck,{size:12,style:{marginLeft:"auto"}})]},H.id)})]})]})]},C.id)})]}),r.jsxs("div",{style:{padding:"6px 12px",borderTop:"1px solid var(--nice-border-color, #e5e7eb)",fontSize:"0.72rem",opacity:.5,display:"flex",gap:16},children:[r.jsxs("span",{children:[P.length," ",v("playlistManager.tracks","tracks")]}),r.jsx("span",{children:si(P.reduce((C,$)=>C+($.duration??0),0))}),n.size>0&&r.jsxs("span",{children:[n.size," ",v("playlistManager.selected","selected")]})]})]})},ii=e=>({playlistId:e,selectedTrackIds:new Set,sortField:"custom",sortDir:"asc",filterText:""}),Wf=({playlists:e=[],tags:t=[],onCopyTracks:n=()=>{},onMoveTracks:a=()=>{},onRemoveTracks:s=()=>{},onReorderTracks:i=()=>{},onPlay:o=()=>{},onTagTracks:l=()=>{},initialLeftId:c,initialRightId:u})=>{const{t:h}=xe(),[p,g]=d.useState(()=>ii(c??null)),[y,m]=d.useState(()=>ii(u??null)),[x,b]=d.useState("left"),[f,k]=d.useState(null),[v,w]=d.useState(50),[R,M]=d.useState(!1),j=d.useMemo(()=>e.find(W=>W.id===p.playlistId),[e,p.playlistId]),T=d.useMemo(()=>e.find(W=>W.id===y.playlistId),[e,y.playlistId]),P=d.useCallback((W,C)=>{W==="left"?g($=>({...$,...C})):m($=>({...$,...C}))},[]),A=d.useCallback(W=>W==="left"?p:y,[p,y]),I=W=>W==="left"?"right":"left",L=d.useCallback(W=>{const C=A(W),$=A(I(W));!C.playlistId||!$.playlistId||C.selectedTrackIds.size===0||(n(C.playlistId,$.playlistId,Array.from(C.selectedTrackIds)),P(W,{selectedTrackIds:new Set}))},[A,n,P]),N=d.useCallback(W=>{const C=A(W),$=A(I(W));!C.playlistId||!$.playlistId||C.selectedTrackIds.size===0||(a(C.playlistId,$.playlistId,Array.from(C.selectedTrackIds)),P(W,{selectedTrackIds:new Set}))},[A,a,P]),_=d.useCallback(W=>{const C=A(W);!C.playlistId||C.selectedTrackIds.size===0||k({operation:"copy",sourcePlaylistId:C.playlistId,trackIds:Array.from(C.selectedTrackIds)})},[A]),ee=d.useCallback(W=>{const C=A(W);!C.playlistId||C.selectedTrackIds.size===0||k({operation:"cut",sourcePlaylistId:C.playlistId,trackIds:Array.from(C.selectedTrackIds)})},[A]),Y=d.useCallback(W=>{const C=A(W);!f||!C.playlistId||(f.operation==="copy"?n(f.sourcePlaylistId,C.playlistId,f.trackIds):a(f.sourcePlaylistId,C.playlistId,f.trackIds),k(null))},[f,A,n,a]),O=d.useCallback(W=>{W.key==="Tab"&&!W.shiftKey&&(W.preventDefault(),b(C=>I(C))),(W.ctrlKey||W.metaKey)&&W.key==="c"&&_(x),(W.ctrlKey||W.metaKey)&&W.key==="x"&&ee(x),(W.ctrlKey||W.metaKey)&&W.key==="v"&&Y(x)},[x,_,ee,Y]),U=d.useCallback(()=>M(!0),[]),V=d.useCallback(W=>{if(!R)return;const C=W.currentTarget.getBoundingClientRect(),$=(W.clientX-C.left)/C.width*100;w(Math.max(20,Math.min(80,$)))},[R]),K=d.useCallback(()=>M(!1),[]),G=W=>{const C=A(W),$=W==="left"?j:T,S=x===W,H=!!A(I(W)).playlistId;return r.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",border:S?"2px solid var(--nice-color-accent, #3b82f6)":"2px solid transparent",borderRadius:8,overflow:"hidden",background:"var(--nice-bg-elevated, #fff)"},onClick:()=>b(W),children:[r.jsx("div",{style:{padding:"8px 12px",background:S?"var(--nice-color-accent, #3b82f6)":"var(--nice-color-surface, #f3f4f6)",color:S?"var(--nice-text-on-accent, #fff)":"var(--nice-text-primary, #1f2937)",display:"flex",alignItems:"center",gap:8},children:r.jsxs("select",{value:C.playlistId??"",onChange:z=>P(W,{playlistId:z.target.value||null,selectedTrackIds:new Set}),style:{flex:1,fontSize:"0.82rem",padding:"4px 8px",borderRadius:6,border:"1px solid var(--nice-border-color, #d1d5db)",background:S?"var(--nice-overlay-light-20, #ffffff30)":"var(--nice-input-bg, #fff)",color:S?"var(--nice-text-on-accent, #fff)":"var(--nice-text-primary, #1f2937)"},children:[r.jsx("option",{value:"",children:h("playlistManager.selectPlaylist","Select a playlist")}),e.map(z=>r.jsxs("option",{value:z.id,children:[z.name," (",z.trackCount,")"]},z.id))]})}),r.jsxs("div",{style:{display:"flex",gap:4,padding:"4px 8px",borderBottom:"1px solid var(--nice-border-color, #e5e7eb)",flexWrap:"wrap"},children:[r.jsxs("button",{style:ra(!1),onClick:()=>L(W),disabled:!C.playlistId||!H||C.selectedTrackIds.size===0,title:h("playlistManager.copyToOther","Copy to the other playlist"),children:[W==="left"?r.jsxs(r.Fragment,{children:[r.jsx(F.NtdCopy,{size:12}),r.jsx(F.NtdChevronRight,{size:12})]}):r.jsxs(r.Fragment,{children:[r.jsx(F.NtdChevronLeft,{size:12}),r.jsx(F.NtdCopy,{size:12})]})," ",h("playlistManager.copy","Copy")]}),r.jsxs("button",{style:ra(!1),onClick:()=>N(W),disabled:!C.playlistId||!H||C.selectedTrackIds.size===0,title:h("playlistManager.moveToOther","Move to the other playlist"),children:[W==="left"?r.jsxs(r.Fragment,{children:[r.jsx(F.NtdMove,{size:12}),r.jsx(F.NtdChevronRight,{size:12})]}):r.jsxs(r.Fragment,{children:[r.jsx(F.NtdChevronLeft,{size:12}),r.jsx(F.NtdMove,{size:12})]})," ",h("playlistManager.move","Move")]}),r.jsx("div",{style:{flex:1}}),f&&r.jsxs("button",{style:ra(!0),onClick:()=>Y(W),disabled:!C.playlistId,children:[r.jsx(F.NtdClipboard,{size:12})," ",h("playlistManager.paste","Paste")," (",f.trackIds.length,")"]})]}),$?r.jsx(Cl,{tracks:$.tracks,tags:t,selectedTrackIds:C.selectedTrackIds,onSelectionChange:z=>P(W,{selectedTrackIds:z}),onPlay:o,onRemove:z=>s($.id,z),onReorder:z=>i($.id,z),onTagTracks:l,sortField:C.sortField,sortDir:C.sortDir,onSortChange:(z,Z)=>P(W,{sortField:z,sortDir:Z}),filterText:C.filterText,onFilterChange:z=>P(W,{filterText:z}),compact:!0,draggable:!0}):r.jsx("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",opacity:.3,fontSize:"0.85rem"},children:h("playlistManager.selectPlaylistPrompt","Select a playlist to see its tracks")})]})};return r.jsxs("div",{style:{display:"flex",height:"100%",userSelect:R?"none":"auto"},onKeyDown:O,onMouseMove:V,onMouseUp:K,tabIndex:0,children:[r.jsx("div",{style:{width:`${v}%`,minWidth:200},children:G("left")}),r.jsx("div",{style:{width:6,cursor:"col-resize",background:R?"var(--nice-color-accent, #3b82f6)":"var(--nice-border-color, #e5e7eb)",transition:R?"none":"background 0.15s",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},onMouseDown:U,children:r.jsx("div",{style:{width:2,height:40,borderRadius:1,background:R?"var(--nice-color-accent, #3b82f6)":"var(--nice-bg-tertiary, #9ca3af)"}})}),r.jsx("div",{style:{flex:1,minWidth:200},children:G("right")})]})},ra=e=>({background:e?"var(--nice-color-accent, #3b82f6)":"transparent",color:e?"var(--nice-text-on-accent, #fff)":"var(--nice-text-secondary, #6b7280)",border:e?"none":"1px solid var(--nice-border-color, #d1d5db)",borderRadius:6,padding:"3px 8px",fontSize:"0.72rem",cursor:"pointer",whiteSpace:"nowrap"}),jl="av:local-playlists";function Vf(){try{const e=localStorage.getItem(jl);return e?JSON.parse(e):[]}catch{return[]}}function Uf(e){const t=JSON.stringify(e);try{localStorage.setItem(jl,t)}catch{}}function es(){const[e,t]=d.useState(()=>Vf()),n=d.useRef(!1);return d.useEffect(()=>{n.current=!0},[]),d.useEffect(()=>{Uf(e)},[e]),d.useMemo(()=>({list:()=>e,get:s=>e.find(i=>i.id===s),create:s=>{const i=new Date().toISOString(),o={id:ke.createId(),name:s,items:[],updatedAt:i};return t(l=>[o,...l]),o},rename:(s,i)=>t(o=>o.map(l=>l.id===s?{...l,name:i,updatedAt:new Date().toISOString()}:l)),remove:s=>t(i=>i.filter(o=>o.id!==s)),replaceItems:(s,i)=>t(o=>o.map(l=>l.id===s?{...l,items:i,updatedAt:new Date().toISOString()}:l)),addItems:(s,i)=>t(o=>o.map(l=>l.id===s?{...l,items:[...l.items,...i],updatedAt:new Date().toISOString()}:l))}),[e])}const qf=st.scoped("PlaylistList"),Hf={border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:8,background:"var(--nice-bg, #fff)"},Kf=(function(){return{...Hf,padding:"8px 10px",cursor:"pointer"}})(),Ml={border:"1px solid var(--nice-border-light, #d1d5db)",borderRadius:8,padding:"6px 10px",background:"var(--nice-bg, #fff)",cursor:"pointer"},Yf=(function(){return{...Ml,background:"var(--nice-color-primary, #4f46e5)",borderColor:"var(--nice-color-primary, #4f46e5)",color:"var(--nice-text-on-primary, #fff)"}})(),ts=({selectedId:e,onSelect:t,onCreateRemote:n})=>{const{t:a}=xe(),s=es(),[i,o]=d.useState(""),l=d.useMemo(()=>s.list(),[s]);return r.jsxs("div",{style:{display:"grid",gap:10},children:[r.jsxs("div",{style:{display:"flex",gap:8},children:[r.jsx("input",{placeholder:a("playlistList.playlistName","Playlist name..."),value:i,onChange:c=>o(c.target.value),style:{flex:1,border:"1px solid var(--nice-border, #d1d5db)",borderRadius:8,padding:"6px 10px"},"aria-label":a("playlistList.playlistName","Playlist name")}),r.jsxs("button",{type:"button",disabled:!i.trim(),style:i.trim()?Yf:{...Ml,cursor:"not-allowed",color:"var(--nice-text-muted, #9ca3af)",background:"var(--nice-bg-tertiary, #f3f4f6)"},onClick:async()=>{const c=s.create(i.trim());if(o(""),n)try{await n({platform:"tidal",name:c.name,songs:c.items})}catch(u){qf.error("Remote playlist create failed:",u)}t==null||t(c)},children:["+ ",a("common.add","Add")]})]}),r.jsxs("div",{style:{display:"grid",gap:6},children:[l.map(c=>{const u=c.id===e;return r.jsxs("button",{onClick:()=>t==null?void 0:t(c),style:{...Kf,background:u?"var(--nice-selected-bg, #eef2ff)":"var(--nice-bg, #fff)"},children:[r.jsx("div",{style:{fontWeight:600},children:c.name}),r.jsxs("div",{style:{color:"var(--nice-text-dim, #64748b)",fontSize:12},children:[c.items.length+" "+a("playlistList.songs","songs")," ","• ",new Date(c.updatedAt).toLocaleString()]})]},c.id)}),!l.length&&r.jsx("div",{style:{color:"var(--nice-text-muted, #6b7280)"},children:a("playlistList.emptyState","No playlists. Add the first one ↑")})]})]})},Zf=st.scoped("PlaylistBrowser"),oi={display:"grid",gap:12},li=e=>({artist:(e.artists??[]).join(", "),title:e.title}),Xf=({renderLibrarySearch:e,renderLibrarySearchResult:t,renderLibraryList:n,tracks:a,view:s,onSelect:i,onPlay:o})=>{var b;const{t:l}=xe(),c=es(),[u,h]=d.useState(null),[p,g]=d.useState(""),[,y]=d.useState([]),m=u==null?void 0:u.id,x=(f,k)=>{if("addItems"in c){c.addItems(f.id,k);const w=c.list().find(R=>R.id===f.id)||f;h(w);return}const v=c;if("update"in c&&typeof v.update=="function"){const w=Array.from([...f.items||[],...k]);v.update({...f,items:w});const R=c.list().find(M=>M.id===f.id)||{...f,items:w};h(R);return}Zf.warn("useLocalPlaylists: missing addItems/update method — update hook implementation.")};return r.jsxs("div",{style:{display:"grid",gridTemplateColumns:"minmax(min(200px, 100%), 320px) 1fr",gap:16},children:[r.jsxs("div",{style:oi,children:[r.jsx("h3",{style:{margin:0},children:l("playlistBrowser.playlists","Playlists")}),r.jsx(ts,{selectedId:m,onSelect:h}),u&&r.jsxs("div",{style:{fontSize:12,color:"var(--nice-text-dim, #64748b)"},children:[l("playlistBrowser.selected","Selected"),": ",r.jsx("strong",{children:u.name})," ·"," ",((b=u.items)==null?void 0:b.length)??0," ",l("playlistBrowser.tracks","tracks")]})]}),r.jsxs("div",{style:oi,children:[r.jsx("h3",{style:{margin:0},children:l("playlistBrowser.library","Library")}),r.jsxs("div",{children:[e==null?void 0:e({placeholder:l("playlistBrowser.searchAndAdd","Search and add to playlist..."),onSelect:f=>{u&&x(u,[li(f)])}}),r.jsx("input",{placeholder:l("playlistBrowser.fullSearch","Full search (Enter does not add, full list below)"),value:p,onChange:f=>g(f.target.value),style:{width:"100%",border:"1px solid var(--nice-border, #d1d5db)",borderRadius:8,padding:"6px 10px",marginTop:10}})]}),t==null?void 0:t({query:p,onSelect:f=>{u&&x(u,[li(f)])}}),n==null?void 0:n({onPlayNow:f=>y(f),onAddToQueue:f=>y(k=>[...k,...f]),onAddDescriptors:f=>u&&x(u,f)})]})]})};var Kt=(e=>(e[e.None=0]="None",e[e.Spotify=1]="Spotify",e[e.Tidal=2]="Tidal",e[e.YouTube=4]="YouTube",e[e.All=7]="All",e))(Kt||{});const Rl=(e,t=null)=>e.filter(n=>n.parentId===t).sort((n,a)=>n.sortOrder-a.sortOrder).map(n=>({...n,children:Rl(e,n.id)})),Qf={[Kt.Spotify]:{label:"Spotify",color:"var(--source-spotify, #1DB954)",bg:"var(--source-spotify-bg, #1DB95418)"},[Kt.Tidal]:{label:"Tidal",color:"var(--source-tidal, #000000)",bg:"var(--source-tidal-bg, #00000010)"},[Kt.YouTube]:{label:"YouTube",color:"var(--source-youtube, #FF0000)",bg:"var(--source-youtube-bg, #FF000010)"}},Jf=({folders:e,playlists:t,tags:n,services:a,activeFolderId:s,activePlaylistId:i,onSelectFolder:o,onSelectPlaylist:l,onCreateFolder:c,onRenameFolder:u,onDeleteFolder:h,onCreatePlaylist:p,onConnectService:g,onDisconnectService:y,onDragPlaylistToFolder:m,collapsed:x=!1,onToggleCollapse:b})=>{const{t:f}=xe(),[k,v]=d.useState(new Set),[w,R]=d.useState(!1),[M,j]=d.useState(""),[T,P]=d.useState(null),[A,I]=d.useState(!1),[L,N]=d.useState(""),[_,ee]=d.useState("static"),[Y,O]=d.useState(null),[U,V]=d.useState(""),[K,G]=d.useState(null),[W,C]=d.useState(!1),$=d.useMemo(()=>Rl(e),[e]),S=d.useCallback(ne=>{v(pe=>{const fe=new Set(pe);return fe.has(ne)?fe.delete(ne):fe.add(ne),fe})},[]),B=d.useCallback(()=>{M.trim()&&(c(M.trim(),T),j(""),R(!1))},[M,T,c]),H=d.useCallback(()=>{L.trim()&&(p(L.trim(),_,s),N(""),I(!1))},[L,_,s,p]),z=d.useCallback(ne=>{U.trim()&&(u(ne,U.trim()),O(null),V(""))},[U,u]),Z=d.useCallback((ne,pe)=>{ne.preventDefault(),ne.dataTransfer.dropEffect="move",G(pe)},[]),E=d.useCallback((ne,pe)=>{ne.preventDefault();const fe=ne.dataTransfer.getData("playlistId");fe&&m&&m(fe,pe),G(null)},[m]),q=d.useCallback(()=>G(null),[]),X=d.useCallback(ne=>t.filter(pe=>(pe.folderId??null)===ne),[t]),re={width:x?48:280,minWidth:x?48:280,background:"var(--nice-bg-secondary, #f8f9fa)",borderRight:"1px solid var(--nice-border-color, #e5e7eb)",display:"flex",flexDirection:"column",transition:"width 0.2s, min-width 0.2s",overflow:"hidden",height:"100%"},oe={padding:"8px 12px",borderBottom:"1px solid var(--nice-border-color, #e5e7eb)"},se=(ne,pe=!1)=>({padding:"6px 12px",borderRadius:6,cursor:"pointer",display:"flex",alignItems:"center",gap:8,fontSize:"0.82rem",background:pe?"var(--nice-color-accent-light, #dbeafe)":ne?"var(--nice-color-accent, #3b82f6)":"transparent",color:ne?"var(--btn-text, #fff)":"var(--nice-text-primary, #1f2937)",transition:"background 0.15s",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}),D={background:"none",border:"none",cursor:"pointer",fontSize:"0.75rem",padding:"2px 6px",borderRadius:4,color:"var(--nice-text-secondary, #6b7280)"},J={fontSize:"0.8rem",padding:"4px 8px",borderRadius:6,border:"1px solid var(--nice-border-color, #d1d5db)",background:"var(--nice-input-bg, #fff)",color:"var(--nice-text-primary, #1f2937)",width:"100%"},ae=(ne,pe)=>{var je,Ne;const fe=k.has(ne.id),me=s===ne.id,he=K===ne.id,we=X(ne.id);return r.jsxs("div",{children:[r.jsxs("div",{style:{...se(me,he),paddingLeft:12+pe*16},onClick:()=>{o(ne.id),ne.children&&ne.children.length>0&&S(ne.id)},onDragOver:Ee=>Z(Ee,ne.id),onDrop:Ee=>E(Ee,ne.id),onDragLeave:q,children:[r.jsx("span",{style:{width:14,textAlign:"center",flexShrink:0,fontSize:"0.7rem"},children:(((je=ne.children)==null?void 0:je.length)||0)>0||we.length>0?fe?r.jsx(F.NtdChevronDown,{size:10}):r.jsx(F.NtdChevronRight,{size:10}):null}),Y===ne.id?r.jsx("input",{value:U,onChange:Ee=>V(Ee.target.value),onKeyDown:Ee=>{Ee.key==="Enter"&&z(ne.id),Ee.key==="Escape"&&O(null)},onBlur:()=>z(ne.id),autoFocus:!0,style:{...J,flex:1},onClick:Ee=>Ee.stopPropagation()}):r.jsxs(r.Fragment,{children:[r.jsx("span",{style:{display:"inline-flex"},children:ne.icon??r.jsx(F.NtdFolder,{size:14})}),r.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:ne.name}),r.jsx("span",{style:{fontSize:"0.65rem",opacity:.5},children:we.length}),r.jsx("button",{style:D,onClick:Ee=>{Ee.stopPropagation(),O(ne.id),V(ne.name)},title:f("common.rename","Rename"),"aria-label":f("common.rename","Rename"),children:r.jsx(F.NtdEdit,{size:12})}),r.jsx("button",{style:{...D,color:"var(--nice-color-error, #ef4444)"},onClick:Ee=>{Ee.stopPropagation(),h(ne.id)},title:f("common.delete","Delete"),"aria-label":f("common.delete","Delete"),children:r.jsx(F.NtdTrash,{size:12})})]})]}),fe&&r.jsxs(r.Fragment,{children:[we.map(Ee=>ce(Ee,pe+1)),(Ne=ne.children)==null?void 0:Ne.map(Ee=>ae(Ee,pe+1))]})]},ne.id)},ce=(ne,pe)=>{const fe=i===ne.id;return r.jsxs("div",{style:{...se(fe),paddingLeft:12+pe*16+22},onClick:()=>l(ne.id),draggable:!0,onDragStart:me=>{me.dataTransfer.setData("playlistId",ne.id),me.dataTransfer.effectAllowed="move"},children:[r.jsx("span",{style:{display:"inline-flex"},children:ne.type==="dynamic"?r.jsx(F.NtdLightning,{size:12}):r.jsx(F.NtdMusic,{size:12})}),r.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:ne.name}),r.jsx("span",{style:{fontSize:"0.65rem",opacity:.5},children:ne.trackCount})]},ne.id)};if(x)return r.jsx("div",{style:re,children:r.jsx("button",{style:{...D,padding:"12px 0",fontSize:"1.1rem",width:"100%"},onClick:b,title:f("playlistManager.expandSidebar","Expand sidebar"),"aria-label":f("playlistManager.expandSidebar","Expand sidebar"),children:r.jsx(F.NtdChevronRight,{size:16})})});const le=X(null);return r.jsxs("div",{style:re,children:[r.jsxs("div",{style:{...oe,display:"flex",alignItems:"center",justifyContent:"space-between"},children:[r.jsxs("span",{style:{fontWeight:700,fontSize:"0.85rem",display:"inline-flex",alignItems:"center",gap:6},children:[r.jsx(F.NtdMusic,{size:14})," ",f("playlistManager.title","Playlists")]}),r.jsx("button",{style:D,onClick:b,title:f("playlistManager.collapseSidebar","Collapse sidebar"),"aria-label":f("playlistManager.collapseSidebar","Collapse sidebar"),children:r.jsx(F.NtdChevronLeft,{size:16})})]}),r.jsxs("div",{style:{...oe,display:"flex",gap:4,flexWrap:"wrap"},children:[r.jsxs("button",{style:{...D,background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",borderRadius:6,padding:"4px 10px"},onClick:()=>I(!0),children:["+ ",f("playlistManager.newPlaylist","New playlist")]}),r.jsxs("button",{style:{...D,border:"1px solid var(--nice-border-color, #d1d5db)",borderRadius:6,padding:"4px 10px"},onClick:()=>{R(!0),P(s)},children:[r.jsx(F.NtdFolder,{size:12})," ",f("playlistManager.newFolder","New folder")]})]}),A&&r.jsxs("div",{style:{...oe,display:"flex",flexDirection:"column",gap:6},children:[r.jsx("input",{value:L,onChange:ne=>N(ne.target.value),placeholder:f("playlistManager.playlistName","Playlist name"),style:J,autoFocus:!0,onKeyDown:ne=>{ne.key==="Enter"&&H(),ne.key==="Escape"&&I(!1)}}),r.jsxs("div",{style:{display:"flex",gap:6,alignItems:"center"},children:[r.jsxs("label",{style:{fontSize:"0.75rem",display:"flex",gap:4,alignItems:"center",cursor:"pointer"},children:[r.jsx("input",{type:"radio",checked:_==="static",onChange:()=>ee("static")}),f("playlistManager.static","Static")]}),r.jsxs("label",{style:{fontSize:"0.75rem",display:"flex",gap:4,alignItems:"center",cursor:"pointer"},children:[r.jsx("input",{type:"radio",checked:_==="dynamic",onChange:()=>ee("dynamic")}),r.jsx(F.NtdLightning,{size:12})," ",f("playlistManager.dynamic","Dynamic")]}),r.jsx("div",{style:{flex:1}}),r.jsx("button",{style:{...D,background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",borderRadius:4,padding:"3px 8px"},onClick:H,"aria-label":f("playlistManager.confirmCreatePlaylist","Confirm create playlist"),children:r.jsx(F.NtdCheck,{size:12})}),r.jsx("button",{style:D,onClick:()=>I(!1),"aria-label":f("playlistManager.cancelCreatePlaylist","Cancel create playlist"),children:r.jsx(F.NtdClose,{size:12})})]})]}),w&&r.jsxs("div",{style:{...oe,display:"flex",gap:6},children:[r.jsx("input",{value:M,onChange:ne=>j(ne.target.value),placeholder:f("playlistManager.folderName","Folder name"),style:{...J,flex:1},autoFocus:!0,onKeyDown:ne=>{ne.key==="Enter"&&B(),ne.key==="Escape"&&R(!1)}}),r.jsx("button",{style:{...D,background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",borderRadius:4,padding:"3px 8px"},onClick:B,"aria-label":f("playlistManager.confirmCreateFolder","Confirm create folder"),children:r.jsx(F.NtdCheck,{size:12})}),r.jsx("button",{style:D,onClick:()=>R(!1),"aria-label":f("playlistManager.cancelCreateFolder","Cancel create folder"),children:r.jsx(F.NtdClose,{size:12})})]}),r.jsxs("div",{style:{flex:1,overflow:"auto",padding:"4px 0"},children:[r.jsxs("div",{style:se(s===null&&i===null,K==="__root__"),onClick:()=>o(null),onDragOver:ne=>Z(ne,null),onDrop:ne=>E(ne,null),onDragLeave:q,children:[r.jsx(F.NtdHome,{size:14}),r.jsx("span",{style:{flex:1},children:f("playlistManager.allPlaylists","All playlists")}),r.jsx("span",{style:{fontSize:"0.65rem",opacity:.5},children:t.length})]}),le.map(ne=>ce(ne,0)),$.map(ne=>ae(ne,0))]}),n.length>0&&r.jsxs("div",{style:oe,children:[r.jsx("div",{style:{fontSize:"0.7rem",fontWeight:600,marginBottom:4,opacity:.6},children:f("playlistManager.tags","Tags")}),r.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:4},children:n.map(ne=>r.jsxs("span",{style:{fontSize:"0.7rem",padding:"2px 8px",borderRadius:12,background:ne.color+"22",color:ne.color,border:`1px solid ${ne.color}44`,cursor:"pointer"},children:[r.jsx(Sa,{icon:ne.icon,size:10}),ne.icon?" ":"",ne.name]},ne.id))})]}),r.jsxs("div",{style:oe,children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",cursor:"pointer",fontSize:"0.7rem",fontWeight:600,opacity:.6},onClick:()=>C(!W),children:[r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(F.NtdLink,{size:12})," ",f("playlistManager.services","Services")]}),W?r.jsx(F.NtdChevronUp,{size:12}):r.jsx(F.NtdChevronDown,{size:12})]}),W&&r.jsx("div",{style:{marginTop:6,display:"flex",flexDirection:"column",gap:4},children:[Kt.Spotify,Kt.Tidal,Kt.YouTube].map(ne=>{const pe=Qf[ne],fe=a.find(me=>me.platform===ne);return r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"4px 8px",borderRadius:6,border:"1px solid var(--nice-border-color, #e5e7eb)",fontSize:"0.78rem"},children:[r.jsx(F.NtdCircle,{size:10,style:{color:pe.color}}),r.jsx("span",{style:{flex:1},children:pe.label}),fe!=null&&fe.connected?r.jsxs(r.Fragment,{children:[r.jsx("span",{style:{fontSize:"0.65rem",opacity:.6},children:fe.username??f("playlistManager.connected","Connected")}),r.jsx("button",{style:{...D,color:"var(--nice-danger, #ef4444)"},onClick:()=>y(ne),"aria-label":f("playlistManager.disconnect","Disconnect"),children:r.jsx(F.NtdClose,{size:12})})]}):r.jsx("button",{style:{...D,background:pe.color,color:"var(--nice-color-white, #fff)",borderRadius:4,padding:"2px 8px"},onClick:()=>g(ne),children:f("playlistManager.connect","Connect")})]},ne)})})]})]})},em=({playlist:e,tags:t,onPlay:n,selectedTrackIds:a,onSelectionChange:s})=>{const{t:i}=xe(),o=d.useCallback(l=>{const c=new Set(a);c.has(l)?c.delete(l):c.add(l),s(c)},[a,s]);return e.tracks.length===0?r.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",padding:60,opacity:.3},children:[r.jsx("span",{style:{marginBottom:8,display:"inline-flex"},children:r.jsx(F.NtdMusic,{size:32})}),r.jsx("span",{style:{fontSize:"0.82rem"},children:i("playlistManager.emptyPlaylist","This playlist is empty")})]}):r.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(160px, 1fr))",gap:10},children:e.tracks.map(l=>{const c=a.has(l.id);return r.jsxs("div",{onClick:()=>o(l.id),onDoubleClick:()=>n(l),style:{border:c?"2px solid var(--nice-color-accent, #3b82f6)":"1px solid var(--nice-border-color, #e5e7eb)",borderRadius:10,padding:10,cursor:"pointer",background:c?"var(--nice-accent-tint-10, #eff6ff)":"var(--nice-bg-elevated, #fff)",transition:"all 0.12s"},children:[r.jsx("div",{style:{width:"100%",aspectRatio:"1",borderRadius:6,background:"linear-gradient(135deg, var(--playlist-track-bg1, #6366f140), var(--playlist-track-bg2, #6366f110))",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"1.5rem",marginBottom:6},children:r.jsx(F.NtdMusic,{size:24})}),r.jsx("div",{style:{fontWeight:500,fontSize:"0.78rem",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:l.title}),r.jsx("div",{style:{fontSize:"0.68rem",opacity:.5,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:l.artist})]},l.id)})})},tm=d.memo(em),ci=e=>e.replace(/[^a-z0-9_-]/gi,"-"),di={background:"none",border:"none",cursor:"pointer",fontSize:"0.78rem",padding:"2px 4px",opacity:.4},nm=({playlists:e,folders:t,tags:n,activeFolderId:a,onSelectPlaylist:s,onDeletePlaylist:i,onDuplicatePlaylist:o})=>{const{t:l}=xe(),c=d.useMemo(()=>a?e.filter(u=>u.folderId===a):e,[e,a]);return c.length===0?r.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:60,opacity:.4},children:[r.jsx("span",{style:{marginBottom:12,display:"inline-flex"},children:r.jsx(F.NtdMusic,{size:40})}),r.jsx("span",{style:{fontSize:"0.85rem"},children:l("playlistManager.emptyState","No playlists yet")})]}):r.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(240px, 1fr))",gap:12},children:c.map(u=>{var p;const h=t.find(g=>g.id===u.folderId);return r.jsxs("div",{onClick:()=>s(u.id),style:{border:"1px solid var(--nice-border-color, #e5e7eb)",borderRadius:12,padding:16,cursor:"pointer",background:"var(--nice-bg-elevated, #fff)",transition:"box-shadow 0.15s, transform 0.15s"},onMouseEnter:g=>{g.currentTarget.style.boxShadow="0 4px 12px var(--nice-overlay-8, rgba(0, 0, 0, 0.08))",g.currentTarget.style.transform="translateY(-1px)"},onMouseLeave:g=>{g.currentTarget.style.boxShadow="none",g.currentTarget.style.transform="none"},children:[r.jsx("div",{style:{width:"100%",aspectRatio:"1",borderRadius:8,background:"linear-gradient(135deg, var(--playlist-cover-bg1, #6366f140), var(--playlist-cover-bg2, #6366f110))",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"2.5rem",marginBottom:10},children:u.type===Ja.Dynamic?r.jsx(F.NtdLightning,{size:40}):r.jsx(F.NtdMusic,{size:40})}),r.jsx("div",{style:{fontWeight:600,fontSize:"0.85rem",marginBottom:2},children:u.name}),r.jsxs("div",{style:{fontSize:"0.72rem",opacity:.5},children:[u.trackCount," ",l("playlistManager.tracks","tracks"),h&&r.jsxs(r.Fragment,{children:[" — ",r.jsx(F.NtdFolder,{size:11})," ",h.name]})]}),((p=u.tags)==null?void 0:p.length)>0&&r.jsx("div",{style:{display:"flex",gap:4,marginTop:6,flexWrap:"wrap"},children:u.tags.slice(0,3).map(g=>{const y=n.find(m=>m.id===g);return y?r.jsx("span",{style:{padding:"1px 8px",borderRadius:12,background:`var(--tag-${ci(g)}-bg, ${y.color}18)`,color:`var(--tag-${ci(g)}, ${y.color})`,fontSize:"0.65rem",fontWeight:500},children:y.name},g):null})}),r.jsxs("div",{style:{display:"flex",gap:4,marginTop:8},children:[r.jsx("button",{onClick:g=>{g.stopPropagation(),o(u.id)},style:di,title:l("playlistManager.duplicate","Duplicate"),"aria-label":l("playlistManager.duplicate","Duplicate"),children:r.jsx(F.NtdCopy,{size:14})}),r.jsx("button",{onClick:g=>{g.stopPropagation(),i(u.id)},style:di,title:l("playlistManager.delete","Delete"),"aria-label":l("playlistManager.delete","Delete"),children:r.jsx(F.NtdTrash,{size:14})})]})]},u.id)})})},rm=d.memo(nm),ui=[{value:xt.Library,label:"Library",hex:"var(--nice-info, #6366f1)",css:"var(--source-library, #6366f1)",cssBg:"var(--source-library-bg, #6366f118)"},{value:xt.Spotify,label:"Spotify",hex:"var(--nice-success, #1db954)",css:"var(--source-spotify, #1db954)",cssBg:"var(--source-spotify-bg, #1db95418)"},{value:xt.Tidal,label:"Tidal",hex:"var(--nice-text, #000000)",css:"var(--source-tidal, #000000)",cssBg:"var(--source-tidal-bg, #00000018)"},{value:xt.YouTube,label:"YouTube",hex:"var(--nice-danger, #ff0000)",css:"var(--source-youtube, #ff0000)",cssBg:"var(--source-youtube-bg, #ff000018)"},{value:xt.MusicBrainz,label:"MusicBrainz",hex:"var(--source-musicbrainz, #ba478f)",css:"var(--source-musicbrainz, #ba478f)",cssBg:"var(--source-musicbrainz-bg, #ba478f18)"}],am=({onSearch:e,results:t,isSearching:n,onAddToPlaylist:a,onPlayPreview:s})=>{const{t:i}=xe(),[o,l]=d.useState(""),[c,u]=d.useState(new Set([xt.Library,xt.Spotify,xt.Tidal,xt.YouTube])),[h,p]=d.useState(new Set),[g,y]=d.useState(!1),m=d.useRef(null),x=d.useCallback(j=>{u(T=>{const P=new Set(T);return P.has(j)?P.delete(j):P.add(j),P})},[]),b=d.useCallback(j=>{l(j),m.current&&clearTimeout(m.current),j.trim().length>=2&&(m.current=setTimeout(()=>{e(j.trim(),Array.from(c))},350))},[c,e]),f=d.useCallback(j=>{j.preventDefault(),o.trim().length>=2&&e(o.trim(),Array.from(c))},[o,c,e]),k=d.useCallback(j=>{p(T=>{const P=new Set(T);return P.has(j)?P.delete(j):P.add(j),P})},[]),v=d.useCallback(()=>{h.size===t.length?p(new Set):p(new Set(t.map(j=>j.id)))},[h,t]),w=d.useCallback(()=>{const j=t.filter(T=>h.has(T.id));j.length>0&&(a(j),p(new Set))},[t,h,a]),R=j=>{if(!j)return"--:--";const T=Math.floor(j/60),P=j%60;return`${T}:${P.toString().padStart(2,"0")}`},M=j=>{const T=ui.find(P=>P.value===j);return r.jsx(F.NtdCircle,{size:10,style:{color:T?T.css:"var(--nice-text-secondary, #6b7280)"}})};return r.jsxs("div",{style:{border:"1px solid var(--nice-border-color, #e5e7eb)",borderRadius:10,background:"var(--nice-bg-elevated, #fff)",overflow:"hidden"},children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",padding:"8px 12px",gap:8,cursor:"pointer",background:"var(--nice-color-surface, #f9fafb)"},onClick:()=>y(!g),children:[r.jsx(F.NtdSearch,{size:16}),r.jsx("span",{style:{fontWeight:600,fontSize:"0.85rem"},children:i("playlistManager.search","Search")}),r.jsx("span",{style:{marginLeft:"auto",fontSize:"0.75rem",opacity:.5},children:g?r.jsx(F.NtdChevronUp,{size:12}):r.jsx(F.NtdChevronDown,{size:12})})]}),g&&r.jsxs("div",{style:{padding:"0 12px 12px"},children:[r.jsx("div",{style:{display:"flex",gap:6,marginBottom:8,flexWrap:"wrap"},children:ui.map(j=>{const T=c.has(j.value);return r.jsxs("button",{onClick:()=>x(j.value),style:{padding:"4px 10px",borderRadius:20,border:T?`2px solid ${j.css}`:"1px solid var(--nice-border-color, #d1d5db)",background:T?j.cssBg:"transparent",color:T?j.css:"var(--nice-text-secondary, #6b7280)",fontSize:"0.72rem",cursor:"pointer",fontWeight:T?600:400,transition:"all 0.15s"},children:[r.jsx(F.NtdCircle,{size:8,style:{color:j.css}})," ",j.label]},j.value)})}),r.jsxs("form",{onSubmit:f,style:{display:"flex",gap:6,marginBottom:8},children:[r.jsx("input",{type:"text",value:o,onChange:j=>b(j.target.value),placeholder:i("playlistManager.searchPlaceholder","Search tracks, artists, albums..."),style:{flex:1,padding:"6px 12px",borderRadius:8,border:"1px solid var(--nice-border-color, #d1d5db)",background:"var(--nice-input-bg, #fff)",color:"var(--nice-text-primary, #1f2937)",fontSize:"0.82rem"}}),r.jsx("button",{type:"submit",disabled:o.trim().length<2||n,style:{padding:"6px 14px",borderRadius:8,border:"none",background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",fontSize:"0.82rem",cursor:"pointer",opacity:o.trim().length<2?.5:1},"aria-label":i("playlistManager.search","Search"),children:n?r.jsx(F.NtdClock,{size:14}):r.jsx(F.NtdSearch,{size:14})})]}),t.length>0&&r.jsxs("div",{children:[r.jsxs("div",{style:{display:"flex",gap:6,marginBottom:4,alignItems:"center"},children:[r.jsxs("label",{style:{fontSize:"0.72rem",display:"flex",alignItems:"center",gap:4,cursor:"pointer"},children:[r.jsx("input",{type:"checkbox",checked:h.size===t.length&&t.length>0,onChange:v}),i("playlistManager.selectAll","Select all")]}),r.jsxs("span",{style:{fontSize:"0.72rem",opacity:.5},children:[t.length," ",i("playlistManager.results","results")]}),r.jsx("div",{style:{flex:1}}),h.size>0&&r.jsxs("button",{onClick:w,style:{padding:"3px 10px",borderRadius:6,border:"none",background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",fontSize:"0.72rem",cursor:"pointer"},children:[r.jsx(F.NtdPlus,{size:12})," ",i("playlistManager.addSelected","Add selected")," (",h.size,")"]})]}),r.jsx("div",{style:{maxHeight:300,overflowY:"auto",borderRadius:6,border:"1px solid var(--nice-border-color, #e5e7eb)"},children:t.map(j=>r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"6px 10px",borderBottom:"1px solid var(--nice-border-color, #f3f4f6)",background:h.has(j.id)?"var(--nice-accent-tint-10, #eff6ff)":"transparent",cursor:"pointer",fontSize:"0.78rem"},onClick:()=>k(j.id),children:[r.jsx("input",{type:"checkbox",checked:h.has(j.id),readOnly:!0}),M(j.source),j.imageUrl&&r.jsx("img",{src:j.imageUrl,alt:j.title||i("common.coverArt","Cover art"),style:{width:28,height:28,borderRadius:4,objectFit:"cover"}}),r.jsxs("div",{style:{flex:1,minWidth:0},children:[r.jsx("div",{style:{fontWeight:500,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:j.title}),r.jsxs("div",{style:{fontSize:"0.7rem",opacity:.6,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:[j.artist,j.album?` — ${j.album}`:""]})]}),r.jsx("span",{style:{opacity:.5,fontSize:"0.7rem",flexShrink:0},children:R(j.duration)}),s&&r.jsx("button",{onClick:T=>{T.stopPropagation(),s(j)},style:{background:"none",border:"none",cursor:"pointer",fontSize:"0.85rem"},title:i("playlistManager.preview","Preview"),"aria-label":i("playlistManager.preview","Preview"),children:r.jsx(F.NtdPlay,{size:14})})]},j.id))})]}),n&&r.jsxs("div",{style:{textAlign:"center",padding:20,opacity:.5,fontSize:"0.82rem"},children:[r.jsx(F.NtdClock,{size:14})," ",i("playlistManager.searching","Searching"),"..."]}),!n&&o.trim().length>=2&&t.length===0&&r.jsx("div",{style:{textAlign:"center",padding:20,opacity:.4,fontSize:"0.82rem"},children:i("playlistManager.noResults","No results")})]})]})},sm=[{value:1,label:"Spotify",icon:r.jsx(F.NtdMusic,{size:16}),color:"var(--source-spotify, #1db954)"},{value:2,label:"Tidal",icon:r.jsx(F.NtdMusic,{size:16}),color:"var(--source-tidal, #000000)"},{value:3,label:"Apple Music",icon:r.jsx(F.NtdMusic,{size:16}),color:"var(--source-apple, #fa243c)"},{value:4,label:"YouTube",icon:r.jsx(F.NtdMusic,{size:16}),color:"var(--source-youtube, #ff0000)"},{value:99,label:"Manual Paste",icon:r.jsx(F.NtdMusic,{size:16}),color:"var(--source-manual, #6366f1)"}],im={display:"flex",flexDirection:"column",gap:16,padding:24,borderRadius:12,background:"var(--nice-bg-primary, #ffffff)",border:"1px solid var(--nice-border, #e2e8f0)",maxWidth:640,minHeight:400},om={display:"flex",justifyContent:"space-between",alignItems:"center"},lm={display:"flex",gap:4,marginBottom:8},Ln={padding:"8px 20px",borderRadius:6,border:"none",background:"var(--nice-color-accent, #6366f1)",color:"var(--nice-text-on-primary, #fff)",cursor:"pointer",fontWeight:600},sr=(function(){return{...Ln,background:"transparent",color:"var(--nice-text-primary, #334155)",border:"1px solid var(--nice-border, #e2e8f0)"}})(),hi={padding:12,borderRadius:8,border:"1px solid var(--nice-border, #e2e8f0)",cursor:"pointer",transition:"border-color 0.15s"},Nl=["connect","browse","tracks","options","importing","done"];function cm(e){return Nl.indexOf(e)}function dm(e){if(!e)return"--:--";const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`}const um=({connections:e=[],onConnect:t=()=>{},onDisconnect:n=()=>{},onFetchPlaylists:a=async()=>[],onFetchTracks:s=async()=>[],onImport:i=async()=>({playlistName:"",imported:0,skipped:0,failed:0,failedTracks:[]}),onClose:o=()=>{},targetFolders:l,sources:c})=>{const{t:u}=xe(),[h,p]=d.useState("connect"),[g,y]=d.useState(null),[m,x]=d.useState([]),[b,f]=d.useState(null),[k,v]=d.useState([]),[w,R]=d.useState(new Set),[M,j]=d.useState(!1),[T,P]=d.useState(null),[A,I]=d.useState(null),[L,N]=d.useState(null),[_,ee]=d.useState({mergeTags:!0,mergeFolders:!0,overwriteExisting:!1}),[Y,O]=d.useState(""),U=d.useMemo(()=>new Set(e.filter(D=>D.connected).map(D=>D.platform)),[e]),V=d.useCallback(D=>e.find(J=>J.platform===D),[e]),K=d.useCallback(D=>{if(y(D),D===99){p("tracks"),O(""),v([]),j(!1);return}U.has(D)?(p("browse"),j(!0),N(null),a(D).then(J=>{x(J),j(!1)}).catch(J=>{N(String(J)),j(!1)})):t(D)},[U,t,a]),G=d.useCallback(D=>{f(D),p("tracks"),j(!0),N(null),s(D).then(J=>{v(J),R(new Set(J.map(ae=>ae.externalId))),j(!1)}).catch(J=>{N(String(J)),j(!1)})},[s]),W=d.useCallback(D=>{R(J=>{const ae=new Set(J);return ae.has(D)?ae.delete(D):ae.add(D),ae})},[]),C=d.useCallback(()=>{R(D=>D.size===k.length?new Set:new Set(k.map(J=>J.externalId)))},[k]),$=d.useCallback(async()=>{if(!b)return;const D=k.filter(J=>w.has(J.externalId));if(D.length!==0){p("importing"),P({total:D.length,imported:0,skipped:0,failed:0}),N(null);try{const J=await i(b,D,_),ae=J&&typeof J=="object"&&"imported"in J?J:{playlistName:b.name,imported:D.length,skipped:0,failed:0,failedTracks:[]};I(ae),p("done")}catch(J){N(String(J)),p("options")}}},[b,k,w,_,i]),S=h!=="connect"&&h!=="importing"&&h!=="done",B=d.useCallback(()=>{switch(h){case"browse":p("connect");break;case"tracks":p("browse");break;case"options":p("tracks");break}},[h]),H=()=>r.jsx("div",{style:lm,children:Nl.map((D,J)=>r.jsx("div",{style:{flex:1,height:4,borderRadius:2,background:J<=cm(h)?"var(--nice-color-accent, #6366f1)":"var(--nice-border, #e2e8f0)",transition:"background 0.2s"}},D))}),z=()=>r.jsxs("div",{style:{display:"grid",gap:12},children:[r.jsx("p",{style:{margin:0,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.selectPlatform","Select a music platform to import from")}),sm.map(D=>{const J=V(D.value),ae=U.has(D.value);return r.jsxs("div",{style:{...hi,display:"flex",alignItems:"center",gap:12,borderColor:ae?D.color:void 0},onClick:()=>K(D.value),role:"button",tabIndex:0,onKeyDown:ce=>ce.key==="Enter"&&K(D.value),children:[r.jsx("span",{style:{color:D.color,display:"inline-flex"},"aria-hidden":"true",children:D.icon}),r.jsxs("div",{style:{flex:1},children:[r.jsx("strong",{children:D.label}),(J==null?void 0:J.username)&&r.jsx("div",{style:{fontSize:12,color:"var(--nice-text-dim, #64748b)"},children:J.username})]}),ae?r.jsxs("span",{style:{color:D.color,fontSize:12,fontWeight:600},children:[u("importWizard.connected","Connected")," ",r.jsx(F.NtdCheck,{size:12})]}):r.jsx("span",{style:{fontSize:12,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.clickToConnect","Click to connect")})]},D.value)})]}),Z=()=>r.jsxs("div",{style:{display:"grid",gap:12},children:[r.jsx("p",{style:{margin:0,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.selectPlaylist","Select a playlist to import")}),M?r.jsx("div",{style:{textAlign:"center",padding:32,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.loading","Loading playlists…")}):r.jsxs("div",{style:{display:"grid",gap:8,maxHeight:320,overflowY:"auto"},children:[m.map(D=>r.jsxs("div",{style:{...hi,display:"flex",alignItems:"center",gap:12},onClick:()=>G(D),role:"button",tabIndex:0,onKeyDown:J=>J.key==="Enter"&&G(D),children:[D.coverUrl&&r.jsx("img",{src:D.coverUrl,alt:"",style:{width:48,height:48,borderRadius:6,objectFit:"cover"}}),r.jsxs("div",{style:{flex:1,minWidth:0},children:[r.jsx("div",{style:{fontWeight:600,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:D.name}),D.description&&r.jsx("div",{style:{fontSize:12,color:"var(--nice-text-dim, #64748b)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:D.description})]}),r.jsxs("span",{style:{fontSize:12,color:"var(--nice-text-dim, #64748b)",whiteSpace:"nowrap"},children:[D.trackCount," ",u("importWizard.tracks","tracks")]})]},D.id)),m.length===0&&r.jsx("div",{style:{textAlign:"center",padding:24,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.noPlaylists","No playlists found")})]})]}),E=d.useCallback(D=>{const ae=D.split(`
69
- `).map(ce=>ce.trim()).filter(Boolean).map((ce,le)=>{const ne=ce.match(/^(.+?)\s*[-–—]\s*(.+)$/);return ne?{externalId:`paste-${le}`,title:ne[2].trim(),artist:ne[1].trim(),album:void 0,duration:0}:{externalId:`paste-${le}`,title:ce,artist:"",album:void 0,duration:0}});v(ae),R(new Set(ae.map(ce=>ce.externalId)))},[]),q=()=>r.jsxs("div",{style:{display:"grid",gap:12},children:[g===99&&k.length===0&&r.jsxs("div",{style:{display:"grid",gap:8},children:[r.jsx("p",{style:{margin:0,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.pasteInstructions",'Paste your track list below (one track per line). Use "Artist - Title" format for best results.')}),r.jsx("textarea",{value:Y,onChange:D=>O(D.target.value),placeholder:`Daft Punk - Get Lucky
68
+ OR: Artist;Title;Version`),rows:3,style:{width:"100%",border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:6,padding:8,fontFamily:"inherit"}}),r.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginTop:6},children:[r.jsx("div",{style:{color:"var(--nice-text-secondary, #6b7280)",fontSize:12},children:h("genericPlaylist.bulkPasteHint","Each line will be added as a separate song.")}),r.jsx("button",{type:"button",onClick:K,disabled:!m.trim(),style:{padding:"6px 10px",borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)",background:"var(--nice-bg-secondary, #f9fafb)"},children:h("genericPlaylist.addFromList","Add from list")})]})]})]})})]})},vl={music:B.NtdMusic,microphone:B.NtdMicrophone,volume:B.NtdVolume,wave:B.NtdWave,megaphone:B.NtdMegaphone,star:B.NtdStar,heart:B.NtdHeart,lightning:B.NtdLightning,sparkle:B.NtdSparkle,moon:B.NtdMoon,sun:B.NtdSun,mountain:B.NtdMountain,trophy:B.NtdTrophy,crown:B.NtdCrown,target:B.NtdTarget,pin:B.NtdPin},bf=Object.keys(vl),Sa=({icon:e,size:t=14})=>{if(!e)return null;const n=vl[e];return n?r.jsx(n,{size:t}):r.jsx("span",{children:e})},ai=["var(--nice-danger, #ef4444)","var(--nice-warning, #f97316)","var(--nice-warning, #f59e0b)","var(--nice-warning, #eab308)","var(--nice-success, #84cc16)","var(--nice-success, #22c55e)","var(--nice-info, #14b8a6)","var(--nice-info, #06b6d4)","var(--nice-primary, #3b82f6)","var(--nice-info, #6366f1)","var(--nice-accent, #8b5cf6)","var(--nice-accent, #a855f7)","var(--nice-color-accent-pink, #d946ef)","var(--nice-color-accent-pink, #ec4899)","var(--nice-danger, #f43f5e)","var(--nice-text-muted, #78716c)","var(--nice-text-secondary, #64748b)","var(--nice-text, #000000)"],rr=bf,xf=({tags:e,onCreateTag:t,onUpdateTag:n,onDeleteTag:a,selectedTracks:s,onAssignTag:i,onUnassignTag:o})=>{const{t:l}=xe(),[c,u]=d.useState(null),[h,p]=d.useState(""),[g,y]=d.useState(ai[8]),[m,x]=d.useState(rr[0]),[b,f]=d.useState(!1),[j,v]=d.useState(null),[C,N]=d.useState(""),[M,k]=d.useState(""),[T,E]=d.useState(""),A=d.useCallback(z=>{u(z.id),N(z.name),k(z.color),E(z.icon||rr[0])},[]),I=d.useCallback(()=>{c&&C.trim()&&(n(c,C.trim(),M,T),u(null))},[c,C,M,T,n]),L=d.useCallback(()=>{h.trim()&&(t(h.trim(),g,m),p(""),f(!1))},[h,g,m,t]),P=d.useCallback(z=>{j===z?(a(z),v(null)):(v(z),setTimeout(()=>v(null),3e3))},[j,a]),_=s&&s.length>0,ee=z=>!s||s.length===0?!1:s.every(V=>V.tags.includes(z)),K=z=>!s||s.length===0?!1:s.some(V=>V.tags.includes(z))&&!ee(z);return r.jsxs("div",{style:{border:"1px solid var(--nice-border-color, #e5e7eb)",borderRadius:10,background:"var(--nice-bg-elevated, #fff)",overflow:"hidden"},children:[r.jsxs("div",{style:{padding:"10px 14px",borderBottom:"1px solid var(--nice-border-color, #e5e7eb)",display:"flex",alignItems:"center",gap:8,background:"var(--nice-color-surface, #f9fafb)"},children:[r.jsx(B.NtdTag,{size:16}),r.jsx("span",{style:{fontWeight:600,fontSize:"0.85rem"},children:l("playlistManager.tagManager","Tag manager")}),r.jsx("div",{style:{flex:1}}),r.jsxs("button",{onClick:()=>f(!b),style:{background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",border:"none",borderRadius:6,padding:"4px 10px",fontSize:"0.72rem",cursor:"pointer"},children:["+ ",l("playlistManager.newTag","New tag")]})]}),r.jsxs("div",{style:{padding:12},children:[b&&r.jsxs("div",{style:{border:"1px solid var(--nice-border-color, #d1d5db)",borderRadius:8,padding:10,marginBottom:12,background:"var(--nice-color-surface, #f9fafb)"},children:[r.jsxs("div",{style:{display:"flex",gap:6,marginBottom:8},children:[r.jsx("input",{type:"text",value:h,onChange:z=>p(z.target.value),placeholder:l("playlistManager.tagName","Tag name"),style:{flex:1,padding:"5px 10px",borderRadius:6,border:"1px solid var(--nice-border-color, #d1d5db)",fontSize:"0.8rem",background:"var(--nice-input-bg, #fff)",color:"var(--nice-text-primary, #1f2937)"},onKeyDown:z=>z.key==="Enter"&&L()}),r.jsx("button",{onClick:L,disabled:!h.trim(),style:{background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",border:"none",borderRadius:6,padding:"5px 12px",fontSize:"0.78rem",cursor:"pointer",opacity:h.trim()?1:.5},"aria-label":l("playlistManager.createTag","Create tag"),children:r.jsx(B.NtdCheck,{size:14})})]}),r.jsxs("div",{style:{marginBottom:6},children:[r.jsx("div",{style:{fontSize:"0.68rem",opacity:.6,marginBottom:4},children:l("playlistManager.color","Color")}),r.jsx("div",{style:{display:"flex",gap:3,flexWrap:"wrap"},children:ai.map(z=>r.jsx("div",{role:"button",tabIndex:0,"aria-label":z,"aria-pressed":g===z,onKeyDown:ve.clickOnActivationKey,onClick:()=>y(z),style:{width:20,height:20,borderRadius:"50%",background:z,cursor:"pointer",border:g===z?"3px solid var(--nice-color-accent, #3b82f6)":"2px solid transparent",boxSizing:"border-box"}},z))})]}),r.jsxs("div",{children:[r.jsx("div",{style:{fontSize:"0.68rem",opacity:.6,marginBottom:4},children:l("playlistManager.icon","Icon")}),r.jsx("div",{style:{display:"flex",gap:3,flexWrap:"wrap"},children:rr.map(z=>r.jsx("div",{role:"button",tabIndex:0,"aria-label":z,"aria-pressed":m===z,onKeyDown:ve.clickOnActivationKey,onClick:()=>x(z),style:{width:26,height:26,borderRadius:4,display:"flex",alignItems:"center",justifyContent:"center",cursor:"pointer",fontSize:"0.85rem",background:m===z?"var(--nice-accent-tint-10, #eff6ff)":"transparent",border:m===z?"1px solid var(--nice-color-accent, #3b82f6)":"1px solid transparent"},children:r.jsx(Sa,{icon:z,size:16})},z))})]})]}),_&&r.jsx("div",{style:{padding:"6px 10px",background:"var(--nice-accent-tint-10, #eff6ff)",borderRadius:6,marginBottom:8,fontSize:"0.72rem",color:"var(--nice-color-accent, #3b82f6)"},children:l("playlistManager.bulkTagHint","Click a tag to apply it to the selected tracks")+": "+s.length}),e.length===0?r.jsx("div",{style:{textAlign:"center",padding:20,opacity:.3,fontSize:"0.82rem"},children:l("playlistManager.noTags","No tags yet")}):r.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:e.map(z=>r.jsx("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"6px 10px",borderRadius:8,border:"1px solid var(--nice-border-color, #e5e7eb)",background:c===z.id?"var(--nice-color-surface, #f9fafb)":"transparent"},children:c===z.id?r.jsxs(r.Fragment,{children:[r.jsx("select",{value:T,onChange:V=>E(V.target.value),style:{border:"none",background:"transparent",fontSize:"0.9rem",cursor:"pointer"},children:rr.map(V=>r.jsx("option",{value:V,children:V},V))}),r.jsx("input",{type:"color",value:M,onChange:V=>k(V.target.value),style:{width:24,height:24,border:"none",cursor:"pointer",padding:0}}),r.jsx("input",{type:"text",value:C,onChange:V=>N(V.target.value),style:{flex:1,padding:"3px 8px",borderRadius:4,border:"1px solid var(--nice-border-color, #d1d5db)",fontSize:"0.78rem",background:"var(--nice-input-bg, #fff)",color:"var(--nice-text-primary, #1f2937)"},onKeyDown:V=>V.key==="Enter"&&I()}),r.jsx("button",{onClick:I,style:ar("var(--nice-color-accent, #3b82f6)"),"aria-label":l("common.save","Save"),children:r.jsx(B.NtdCheck,{size:14})}),r.jsx("button",{onClick:()=>u(null),style:ar("var(--nice-text-secondary, #9ca3af)"),"aria-label":l("common.cancel","Cancel"),children:r.jsx(B.NtdClose,{size:14})})]}):r.jsxs(r.Fragment,{children:[r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4,padding:"2px 10px",borderRadius:20,background:`${z.color}18`,color:z.color,fontWeight:600,fontSize:"0.78rem"},children:[r.jsx(Sa,{icon:z.icon,size:12}),z.name]}),_&&i&&o&&r.jsx("input",{type:"checkbox",checked:ee(z.id),ref:V=>{V&&(V.indeterminate=K(z.id))},onChange:()=>{const V=s.map(W=>W.id);ee(z.id)?o(V,z.id):i(V,z.id)},style:{cursor:"pointer"}}),r.jsx("div",{style:{flex:1}}),r.jsx("button",{onClick:()=>A(z),style:ar("var(--nice-text-secondary, #9ca3af)"),title:l("playlistManager.editTag","Edit tag"),"aria-label":l("playlistManager.editTag","Edit tag"),children:r.jsx(B.NtdEdit,{size:14})}),r.jsx("button",{onClick:()=>P(z.id),style:ar(j===z.id?"var(--nice-color-error, #ef4444)":"var(--nice-text-secondary, #9ca3af)"),title:j===z.id?l("playlistManager.confirmDelete","Click again to delete"):l("playlistManager.deleteTag","Delete tag"),"aria-label":j===z.id?l("playlistManager.confirmDelete","Click again to delete"):l("playlistManager.deleteTag","Delete tag"),children:r.jsx(B.NtdTrash,{size:14})})]})},z.id))})]})]})},ar=e=>({background:"none",border:"none",cursor:"pointer",fontSize:"0.82rem",color:e,padding:"2px 4px"});var Ja=(e=>(e.Static="static",e.Dynamic="dynamic",e))(Ja||{}),bl=(e=>(e.List="list",e.Grid="grid",e.Compact="compact",e.DualPane="dual",e))(bl||{}),xl=(e=>(e.Left="left",e.Right="right",e))(xl||{}),ot=(e=>(e.Artist="artist",e.Title="title",e.Album="album",e.Genre="genre",e.Year="year",e.Duration="duration",e.Rating="rating",e.PlayCount="playCount",e.Tag="tag",e.Source="source",e.AddedDate="addedDate",e))(ot||{}),lt=(e=>(e.Equals="eq",e.NotEquals="neq",e.Contains="contains",e.NotContains="notContains",e.StartsWith="startsWith",e.GreaterThan="gt",e.LessThan="lt",e.Between="between",e.In="in",e.NotIn="notIn",e))(lt||{}),Sl=(e=>(e.Title="title",e.Artist="artist",e.Album="album",e.Duration="duration",e.AddedDate="addedDate",e.Year="year",e.Rating="rating",e.Custom="custom",e))(Sl||{}),dn=(e=>(e.Asc="asc",e.Desc="desc",e))(dn||{}),xt=(e=>(e.Library="library",e.Spotify="spotify",e.Tidal="tidal",e.YouTube="youtube",e.MusicBrainz="musicbrainz",e.Import="import",e.Manual="manual",e))(xt||{});const Sf="_editor_qz5p3_5",kf="_heading_qz5p3_19",wf="_hint_qz5p3_35",Cf="_group_qz5p3_49",jf="_groupOr_qz5p3_61",Mf="_groupShaded_qz5p3_67",Rf="_groupHeader_qz5p3_73",Nf="_groupHint_qz5p3_87",Tf="_groupActions_qz5p3_95",Pf="_rule_qz5p3_107",Ef="_value_qz5p3_121",$f="_value2_qz5p3_127",Af="_dash_qz5p3_133",If="_limit_qz5p3_141",Lf="_limitInput_qz5p3_159",at={editor:Sf,heading:kf,hint:wf,group:Cf,groupOr:jf,groupShaded:Mf,groupHeader:Rf,groupHint:Nf,groupActions:Tf,rule:Pf,value:Ef,value2:$f,dash:Af,limit:If,limitInput:Lf},_f=[{value:ot.Artist,label:"Artist"},{value:ot.Title,label:"Title"},{value:ot.Album,label:"Album"},{value:ot.Genre,label:"Genre"},{value:ot.Year,label:"Year"},{value:ot.Duration,label:"Duration (s)"},{value:ot.Rating,label:"Rating"},{value:ot.PlayCount,label:"Play Count"},{value:ot.Tag,label:"Tag"},{value:ot.Source,label:"Source"},{value:ot.AddedDate,label:"Added Date"}],Df=[{value:lt.Equals,label:"="},{value:lt.NotEquals,label:"≠"},{value:lt.Contains,label:"contains"},{value:lt.NotContains,label:"not contains"},{value:lt.StartsWith,label:"starts with"},{value:lt.GreaterThan,label:">"},{value:lt.LessThan,label:"<"},{value:lt.Between,label:"between"},{value:lt.In,label:"in"},{value:lt.NotIn,label:"not in"}];function zf(e){return"logic"in e&&"rules"in e}function ka(){return{id:ve.createId(),field:ot.Artist,operator:lt.Contains,value:""}}function kl(){return{id:ve.createId(),logic:"and",rules:[ka()]}}const Ff=({rule:e,onChange:t,onRemove:n})=>{const{t:a}=xe();return r.jsxs("div",{className:at.rule,children:[r.jsx(ie.NiceSelect,{size:"sm",controlWidth:150,"aria-label":a("playlistManager.ruleField","Field"),value:e.field,onChange:s=>t({...e,field:Tt(s)}),options:_f.map(s=>({value:s.value,label:a(`playlistManager.field.${s.value}`,s.label)}))}),r.jsx(ie.NiceSelect,{size:"sm",controlWidth:150,"aria-label":a("playlistManager.ruleOperator","Operator"),value:e.operator,onChange:s=>t({...e,operator:Tt(s)}),options:Df.map(s=>({value:s.value,label:a(`playlistManager.op.${s.value}`,s.label)}))}),r.jsx(ie.NiceTextInput,{size:"sm",className:at.value,"aria-label":a("playlistManager.ruleValue","Value"),placeholder:a("playlistManager.ruleValue","Value"),value:e.value,onChange:s=>t({...e,value:s})}),e.operator===lt.Between&&r.jsxs(r.Fragment,{children:[r.jsx("span",{className:at.dash,"aria-hidden":"true",children:"–"}),r.jsx(ie.NiceTextInput,{size:"sm",className:at.value2,"aria-label":a("playlistManager.ruleValue2","Value 2"),placeholder:a("playlistManager.ruleValue2","Value 2"),value:e.value2??"",onChange:s=>t({...e,value2:s})})]}),r.jsx(ie.NiceButton,{size:"sm",variant:"ghost",leftIcon:r.jsx(B.NtdClose,{size:14}),ariaLabel:a("playlistManager.removeRule","Remove rule"),title:a("playlistManager.removeRule","Remove rule"),onClick:n,children:null})]})},wl=({group:e,onChange:t,onRemove:n,depth:a=0})=>{const{t:s}=xe(),i=d.useCallback((p,g)=>{const y=[...e.rules];y[p]=g,t({...e,rules:y})},[e,t]),o=d.useCallback(p=>{const g=e.rules.filter((y,m)=>m!==p);t({...e,rules:g.length>0?g:[ka()]})},[e,t]),l=d.useCallback(()=>{t({...e,rules:[...e.rules,ka()]})},[e,t]),c=d.useCallback(()=>{t({...e,rules:[...e.rules,kl()]})},[e,t]),u=d.useCallback(()=>{t({...e,logic:e.logic==="and"?"or":"and"})},[e,t]),h=e.logic==="and";return r.jsxs("div",{className:`${at.group} ${h?"":at.groupOr} ${a%2===0?at.groupShaded:""}`,children:[r.jsxs("div",{className:at.groupHeader,children:[r.jsx(ie.NiceButton,{size:"sm",variant:h?"primary":"warning",onClick:u,title:s("playlistManager.toggleLogic","Toggle AND/OR"),children:h?s("playlistManager.logicAnd","AND"):s("playlistManager.logicOr","OR")}),r.jsx("span",{className:at.groupHint,children:h?s("playlistManager.matchAllRules","Match all of these rules"):s("playlistManager.matchAnyRule","Match any of these rules")}),r.jsxs("div",{className:at.groupActions,children:[r.jsx(ie.NiceButton,{size:"sm",variant:"outline",leftIcon:r.jsx(B.NtdPlus,{size:14}),onClick:l,title:s("playlistManager.addRuleHint","Add rule"),children:s("playlistManager.addRule","Rule")}),a<3&&r.jsx(ie.NiceButton,{size:"sm",variant:"outline",leftIcon:r.jsx(B.NtdPlus,{size:14}),onClick:c,title:s("playlistManager.addGroupHint","Add nested group"),children:s("playlistManager.addGroup","Group")}),n&&r.jsx(ie.NiceButton,{size:"sm",variant:"ghost",leftIcon:r.jsx(B.NtdClose,{size:14}),ariaLabel:s("playlistManager.removeGroup","Remove group"),title:s("playlistManager.removeGroup","Remove group"),onClick:n,children:null})]})]}),e.rules.map((p,g)=>zf(p)?r.jsx(wl,{group:p,onChange:y=>i(g,y),onRemove:()=>o(g),depth:a+1},p.id):r.jsx(Ff,{rule:p,onChange:y=>i(g,y),onRemove:()=>o(g)},p.id))]})},Of=({rules:e,onChange:t,limit:n,onLimitChange:a})=>{const{t:s}=xe(),[i]=d.useState(kl),o=e??i;return r.jsxs("div",{className:at.editor,children:[r.jsxs("h6",{className:at.heading,children:[r.jsx(B.NtdRepeat,{size:14})," ",s("playlistManager.dynamicRules","Dynamic Playlist Rules")]}),r.jsx("p",{className:at.hint,children:s("playlistManager.dynamicRulesHint","Tracks matching these rules will automatically be included in the playlist.")}),r.jsx(wl,{group:o,onChange:t}),a&&r.jsx("div",{className:at.limit,children:r.jsx(ie.NiceNumberInput,{size:"sm",className:at.limitInput,label:s("playlistManager.maxTracksLabel","Max tracks"),min:1,step:1,value:n??null,onChange:l=>a(l===null||l<=0?void 0:Math.round(l)),helperText:s("playlistManager.leaveEmptyForAllHint","Leave empty for unlimited")})})]})},si=e=>{if(!e)return"--:--";const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${String(n).padStart(2,"0")}`},Bf={spotify:"var(--source-spotify, #1db954)",tidal:"var(--source-tidal, #000000)",youtube:"var(--source-youtube, #ff0000)",musicbrainz:"var(--source-musicbrainz, #ba478f)"},Gf=({source:e})=>{if(e==="import")return r.jsx(B.NtdDownload,{size:12});if(e==="manual")return r.jsx(B.NtdEdit,{size:12});const t=Bf[e];return t?r.jsx(B.NtdCircle,{size:10,style:{color:t}}):r.jsx(B.NtdMusic,{size:12})},Cl=({tracks:e,tags:t,selectedTrackIds:n,onSelectionChange:a,onPlay:s,onRemove:i,onReorder:o,onTagTracks:l,onRateTracks:c,sortField:u,sortDir:h,onSortChange:p,filterText:g,onFilterChange:y,compact:m=!1,draggable:x=!1,onDragStart:b,dropTarget:f=!1,onDrop:j})=>{const{t:v}=xe(),[C,N]=d.useState(null),[M,k]=d.useState(null),T=d.useRef(null),E=d.useMemo(()=>{let w=e??[];if(g.trim()){const R=g.toLowerCase();w=w.filter(S=>{var F,Y;return S.title.toLowerCase().includes(R)||S.artist.toLowerCase().includes(R)||((F=S.album)==null?void 0:F.toLowerCase().includes(R))||((Y=S.genre)==null?void 0:Y.toLowerCase().includes(R))})}return[...w].sort((R,S)=>{const F=h==="asc"?1:-1;switch(u){case"title":return F*R.title.localeCompare(S.title);case"artist":return F*R.artist.localeCompare(S.artist);case"album":return F*(R.album??"").localeCompare(S.album??"");case"duration":return F*((R.duration??0)-(S.duration??0));case"year":return F*((R.year??0)-(S.year??0));case"rating":return F*((R.rating??0)-(S.rating??0));case"addedDate":return F*(R.addedAt??"").localeCompare(S.addedAt??"");case"custom":return F*((R.customOrder??0)-(S.customOrder??0));default:return 0}})},[e,g,u,h]),A=d.useCallback((w,R)=>{const S=E[w];if(S){if(R.ctrlKey||R.metaKey){const F=new Set(n);F.has(S.id)?F.delete(S.id):F.add(S.id),a(F)}else if(R.shiftKey&&T.current!==null){const F=Math.min(T.current,w),Y=Math.max(T.current,w),O=new Set(n);for(let U=F;U<=Y;U++)O.add(E[U].id);a(O)}else a(new Set([S.id]));T.current=w}},[E,n,a]),I=d.useCallback(()=>{n.size===E.length?a(new Set):a(new Set(E.map(w=>w.id)))},[E,n,a]),L=({field:w,label:R,width:S})=>{const F=u===w;return r.jsxs("div",{role:"button",tabIndex:0,onKeyDown:ve.clickOnActivationKey,style:{width:S,flex:S?void 0:1,cursor:"pointer",userSelect:"none",fontWeight:F?700:500,fontSize:"0.72rem",textTransform:"uppercase",letterSpacing:"0.04em",opacity:F?1:.6,display:"flex",alignItems:"center",gap:4},onClick:()=>{F?p(w,h===dn.Asc?dn.Desc:dn.Asc):p(w,dn.Asc)},children:[R,F&&(h==="asc"?r.jsx(B.NtdArrowUp,{size:10}):r.jsx(B.NtdArrowDown,{size:10}))]})},P=d.useCallback((w,R)=>{const S=n.has(w.id)?Array.from(n):[w.id];R.dataTransfer.setData("trackIds",JSON.stringify(S)),R.dataTransfer.effectAllowed="move",b==null||b(S,R)},[n,b]),_=d.useCallback((w,R)=>{R.preventDefault(),R.dataTransfer.dropEffect="move",N(w)},[]),ee=d.useCallback((w,R)=>{R.preventDefault(),N(null);try{const S=R.dataTransfer.getData("trackIds");if(S&&o){const F=JSON.parse(S),Y=E.filter($=>!F.includes($.id)),O=E.filter($=>F.includes($.id)),U=Math.min(w,Y.length);Y.splice(U,0,...O),o(Y.map($=>$.id))}}catch{}},[E,o]),K=d.useCallback(w=>{w.preventDefault(),N(null),j==null||j(w)},[j]),z=d.useMemo(()=>new Map(t.map(w=>[w.id,w])),[t]),V=w=>w.replace(/[^a-z0-9_-]/gi,"-"),W=m?36:48,H={display:"flex",alignItems:"center",gap:8,padding:"6px 12px",borderBottom:"1px solid var(--nice-border-color, #e5e7eb)",color:"var(--nice-text-secondary, #6b7280)"},G=(w,R)=>({display:"flex",alignItems:"center",gap:8,padding:m?"4px 12px":"6px 12px",height:W,cursor:"pointer",background:R?"var(--nice-color-accent-light, #dbeafe)":w?"var(--nice-selected-bg, #eff6ff)":"transparent",borderBottom:"1px solid var(--nice-border-light, #f3f4f6)",transition:"background 0.1s"}),Z=E.length>0&&n.size===E.length;return r.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",overflow:"hidden"},onDragOver:f?w=>{w.preventDefault(),w.dataTransfer.dropEffect="copy"}:void 0,onDrop:f?K:void 0,children:[r.jsxs("div",{style:{padding:"8px 12px",borderBottom:"1px solid var(--nice-border-color, #e5e7eb)",display:"flex",gap:8,alignItems:"center"},children:[r.jsx("input",{type:"text",value:g,onChange:w=>y(w.target.value),placeholder:v("playlistManager.filterTracks","Filter tracks..."),style:{flex:1,fontSize:"0.82rem",padding:"6px 10px",borderRadius:6,border:"1px solid var(--nice-border-color, #d1d5db)",background:"var(--nice-input-bg, #f9fafb)",color:"var(--nice-text-primary, #1f2937)"}}),r.jsxs("span",{style:{fontSize:"0.72rem",opacity:.5},children:[E.length,"/",(e??[]).length]}),n.size>0&&i&&r.jsxs("button",{style:{fontSize:"0.72rem",padding:"4px 8px",borderRadius:4,border:"1px solid var(--nice-color-error, #ef4444)",background:"transparent",color:"var(--nice-color-error, #ef4444)",cursor:"pointer"},onClick:()=>i(Array.from(n)),"aria-label":v("playlistManager.removeSelected","Remove selected"),children:[r.jsx(B.NtdTrash,{size:12})," ",n.size]})]}),r.jsxs("div",{style:H,children:[r.jsx("div",{style:{width:28},children:r.jsx("input",{type:"checkbox",checked:Z,onChange:I,style:{cursor:"pointer"}})}),r.jsx("div",{style:{width:20},children:"#"}),!m&&r.jsx("div",{style:{width:44}}),r.jsx(L,{field:"title",label:v("playlistManager.colTitle","Title")}),r.jsx(L,{field:"artist",label:v("playlistManager.colArtist","Artist")}),!m&&r.jsx(L,{field:"album",label:v("playlistManager.colAlbum","Album")}),r.jsx(L,{field:"duration",label:v("playlistManager.colDuration","Duration"),width:60}),!m&&r.jsx(L,{field:"year",label:v("playlistManager.colYear","Year"),width:50}),r.jsx("div",{style:{width:30}})," ",!m&&r.jsx("div",{style:{width:60}})," ",r.jsx("div",{style:{width:24}})," "]}),r.jsxs("div",{style:{flex:1,overflow:"auto"},children:[E.length===0&&r.jsx("div",{style:{padding:24,textAlign:"center",opacity:.4,fontSize:"0.85rem"},children:e.length===0?v("playlistManager.emptyPlaylist","This playlist is empty"):v("playlistManager.noMatchingTracks","No tracks match the filter")}),E.map((w,R)=>{const S=n.has(w.id),F=C===R;return r.jsxs("div",{role:"button",tabIndex:0,onKeyDown:ve.clickOnActivationKey,style:G(S,F),onClick:Y=>A(R,Y),onDoubleClick:()=>s==null?void 0:s(w),draggable:x,onDragStart:Y=>P(w,Y),onDragOver:Y=>_(R,Y),onDrop:Y=>ee(R,Y),onDragLeave:()=>N(null),children:[r.jsx("div",{style:{width:28},children:r.jsx("input",{type:"checkbox",checked:S,onChange:()=>{const Y=new Set(n);S?Y.delete(w.id):Y.add(w.id),a(Y)},onClick:Y=>Y.stopPropagation(),style:{cursor:"pointer"}})}),r.jsx("div",{style:{width:20,fontSize:"0.7rem",opacity:.4},children:R+1}),!m&&r.jsx("div",{style:{width:44,height:36,flexShrink:0},children:w.coverUrl?r.jsx("img",{src:w.coverUrl,alt:w.title||v("common.coverArt","Cover art"),style:{width:36,height:36,borderRadius:4,objectFit:"cover"},loading:"lazy"}):r.jsx("div",{style:{width:36,height:36,borderRadius:4,background:"var(--nice-color-surface, #f3f4f6)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"0.9rem"},children:r.jsx(B.NtdMusic,{size:16})})}),r.jsx("div",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontSize:"0.82rem",fontWeight:500},children:w.title}),r.jsx("div",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontSize:"0.82rem",opacity:.7},children:w.artist}),!m&&r.jsx("div",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontSize:"0.78rem",opacity:.5},children:w.album}),r.jsx("div",{style:{width:60,fontSize:"0.78rem",opacity:.5,textAlign:"right"},children:si(w.duration)}),!m&&r.jsx("div",{style:{width:50,fontSize:"0.72rem",opacity:.4,textAlign:"center"},children:w.year||""}),r.jsx("div",{style:{width:30,textAlign:"center",fontSize:"0.75rem"},title:w.source,children:r.jsx(Gf,{source:w.source})}),!m&&r.jsxs("div",{style:{width:60,display:"flex",gap:2,overflow:"hidden"},children:[w.tags.slice(0,2).map(Y=>{const O=z.get(Y);if(!O)return null;const U=`--tag-${V(Y)}`;return r.jsx("span",{style:{fontSize:"0.6rem",padding:"1px 5px",borderRadius:8,background:`var(${U}-bg, ${O.color}22)`,color:`var(${U}, ${O.color})`,whiteSpace:"nowrap"},children:O.name},Y)}),w.tags.length>2&&r.jsxs("span",{style:{fontSize:"0.6rem",opacity:.4},children:["+",w.tags.length-2]})]}),r.jsxs("div",{style:{width:24,display:"flex",alignItems:"center"},children:[r.jsx("button",{style:{background:"none",border:"none",cursor:"pointer",fontSize:"0.75rem",padding:2,opacity:.5,position:"relative"},onClick:Y=>{Y.stopPropagation(),k(M===w.id?null:w.id)},title:v("playlistManager.morActions","More actions"),"aria-label":v("playlistManager.morActions","More actions"),children:r.jsx(B.NtdTag,{size:12})}),M===w.id&&t.length>0&&r.jsxs("div",{style:{position:"absolute",right:12,marginTop:4,background:"var(--nice-bg-elevated, #fff)",border:"1px solid var(--nice-border-color, #e5e7eb)",borderRadius:8,padding:8,zIndex:100,boxShadow:"0 4px 12px var(--nice-overlay-10, rgba(0, 0, 0, 0.1))",minWidth:140},children:[r.jsx("div",{style:{fontSize:"0.7rem",fontWeight:600,marginBottom:4,opacity:.6},children:v("playlistManager.assignTag","Assign tag")}),t.map(Y=>{const O=w.tags.includes(Y.id);return r.jsxs("div",{role:"button",tabIndex:0,onKeyDown:ve.clickOnActivationKey,style:{padding:"4px 8px",borderRadius:4,cursor:"pointer",fontSize:"0.78rem",display:"flex",alignItems:"center",gap:6,background:O?`var(--tag-${V(Y.id)}-bg, ${Y.color}22)`:"transparent"},onClick:U=>{U.stopPropagation();const $=n.size>0?Array.from(n):[w.id];O||l==null||l($,[Y.id]),k(null)},children:[r.jsx("span",{style:{width:10,height:10,borderRadius:"50%",background:`var(--tag-${V(Y.id)}, ${Y.color})`,flexShrink:0}}),r.jsx("span",{children:Y.name}),O&&r.jsx(B.NtdCheck,{size:12,style:{marginLeft:"auto"}})]},Y.id)})]})]})]},w.id)})]}),r.jsxs("div",{style:{padding:"6px 12px",borderTop:"1px solid var(--nice-border-color, #e5e7eb)",fontSize:"0.72rem",opacity:.5,display:"flex",gap:16},children:[r.jsxs("span",{children:[E.length," ",v("playlistManager.tracks","tracks")]}),r.jsx("span",{children:si(E.reduce((w,R)=>w+(R.duration??0),0))}),n.size>0&&r.jsxs("span",{children:[n.size," ",v("playlistManager.selected","selected")]})]})]})},ii=e=>({playlistId:e,selectedTrackIds:new Set,sortField:"custom",sortDir:"asc",filterText:""}),Wf=({playlists:e=[],tags:t=[],onCopyTracks:n=()=>{},onMoveTracks:a=()=>{},onRemoveTracks:s=()=>{},onReorderTracks:i=()=>{},onPlay:o=()=>{},onTagTracks:l=()=>{},initialLeftId:c,initialRightId:u})=>{const{t:h}=xe(),[p,g]=d.useState(()=>ii(c??null)),[y,m]=d.useState(()=>ii(u??null)),[x,b]=d.useState("left"),[f,j]=d.useState(null),[v,C]=d.useState(50),[N,M]=d.useState(!1),k=d.useMemo(()=>e.find(w=>w.id===p.playlistId),[e,p.playlistId]),T=d.useMemo(()=>e.find(w=>w.id===y.playlistId),[e,y.playlistId]),E=d.useCallback((w,R)=>{w==="left"?g(S=>({...S,...R})):m(S=>({...S,...R}))},[]),A=d.useCallback(w=>w==="left"?p:y,[p,y]),I=w=>w==="left"?"right":"left",L=d.useCallback(w=>{const R=A(w),S=A(I(w));!R.playlistId||!S.playlistId||R.selectedTrackIds.size===0||(n(R.playlistId,S.playlistId,Array.from(R.selectedTrackIds)),E(w,{selectedTrackIds:new Set}))},[A,n,E]),P=d.useCallback(w=>{const R=A(w),S=A(I(w));!R.playlistId||!S.playlistId||R.selectedTrackIds.size===0||(a(R.playlistId,S.playlistId,Array.from(R.selectedTrackIds)),E(w,{selectedTrackIds:new Set}))},[A,a,E]),_=d.useCallback(w=>{const R=A(w);!R.playlistId||R.selectedTrackIds.size===0||j({operation:"copy",sourcePlaylistId:R.playlistId,trackIds:Array.from(R.selectedTrackIds)})},[A]),ee=d.useCallback(w=>{const R=A(w);!R.playlistId||R.selectedTrackIds.size===0||j({operation:"cut",sourcePlaylistId:R.playlistId,trackIds:Array.from(R.selectedTrackIds)})},[A]),K=d.useCallback(w=>{const R=A(w);!f||!R.playlistId||(f.operation==="copy"?n(f.sourcePlaylistId,R.playlistId,f.trackIds):a(f.sourcePlaylistId,R.playlistId,f.trackIds),j(null))},[f,A,n,a]),z=d.useRef(!1),V=d.useCallback(w=>{if(w.key==="Tab"&&z.current){z.current=!1;return}["Shift","Control","Alt","Meta"].includes(w.key)||(z.current=w.key==="Escape"),w.key==="Tab"&&!w.shiftKey&&(w.preventDefault(),b(R=>I(R))),(w.ctrlKey||w.metaKey)&&w.key==="c"&&_(x),(w.ctrlKey||w.metaKey)&&w.key==="x"&&ee(x),(w.ctrlKey||w.metaKey)&&w.key==="v"&&K(x)},[x,_,ee,K]),W=d.useCallback(()=>M(!0),[]),H=d.useCallback(w=>{if(!N)return;const R=w.currentTarget.getBoundingClientRect(),S=(w.clientX-R.left)/R.width*100;C(Math.max(20,Math.min(80,S)))},[N]),G=d.useCallback(()=>M(!1),[]),Z=w=>{const R=A(w),S=w==="left"?k:T,F=x===w,O=!!A(I(w)).playlistId;return r.jsxs("div",{role:"presentation",style:{display:"flex",flexDirection:"column",height:"100%",border:F?"2px solid var(--nice-color-accent, #3b82f6)":"2px solid transparent",borderRadius:8,overflow:"hidden",background:"var(--nice-bg-elevated, #fff)"},onClick:()=>b(w),children:[r.jsx("div",{style:{padding:"8px 12px",background:F?"var(--nice-color-accent, #3b82f6)":"var(--nice-color-surface, #f3f4f6)",color:F?"var(--nice-text-on-accent, #fff)":"var(--nice-text-primary, #1f2937)",display:"flex",alignItems:"center",gap:8},children:r.jsxs("select",{value:R.playlistId??"",onChange:U=>E(w,{playlistId:U.target.value||null,selectedTrackIds:new Set}),style:{flex:1,fontSize:"0.82rem",padding:"4px 8px",borderRadius:6,border:"1px solid var(--nice-border-color, #d1d5db)",background:F?"var(--nice-overlay-light-20, #ffffff30)":"var(--nice-input-bg, #fff)",color:F?"var(--nice-text-on-accent, #fff)":"var(--nice-text-primary, #1f2937)"},children:[r.jsx("option",{value:"",children:h("playlistManager.selectPlaylist","Select a playlist")}),e.map(U=>r.jsxs("option",{value:U.id,children:[U.name," (",U.trackCount,")"]},U.id))]})}),r.jsxs("div",{style:{display:"flex",gap:4,padding:"4px 8px",borderBottom:"1px solid var(--nice-border-color, #e5e7eb)",flexWrap:"wrap"},children:[r.jsxs("button",{style:ra(!1),onClick:()=>L(w),disabled:!R.playlistId||!O||R.selectedTrackIds.size===0,title:h("playlistManager.copyToOther","Copy to the other playlist"),children:[w==="left"?r.jsxs(r.Fragment,{children:[r.jsx(B.NtdCopy,{size:12}),r.jsx(B.NtdChevronRight,{size:12})]}):r.jsxs(r.Fragment,{children:[r.jsx(B.NtdChevronLeft,{size:12}),r.jsx(B.NtdCopy,{size:12})]})," ",h("playlistManager.copy","Copy")]}),r.jsxs("button",{style:ra(!1),onClick:()=>P(w),disabled:!R.playlistId||!O||R.selectedTrackIds.size===0,title:h("playlistManager.moveToOther","Move to the other playlist"),children:[w==="left"?r.jsxs(r.Fragment,{children:[r.jsx(B.NtdMove,{size:12}),r.jsx(B.NtdChevronRight,{size:12})]}):r.jsxs(r.Fragment,{children:[r.jsx(B.NtdChevronLeft,{size:12}),r.jsx(B.NtdMove,{size:12})]})," ",h("playlistManager.move","Move")]}),r.jsx("div",{style:{flex:1}}),f&&r.jsxs("button",{style:ra(!0),onClick:()=>K(w),disabled:!R.playlistId,children:[r.jsx(B.NtdClipboard,{size:12})," ",h("playlistManager.paste","Paste")," (",f.trackIds.length,")"]})]}),S?r.jsx(Cl,{tracks:S.tracks,tags:t,selectedTrackIds:R.selectedTrackIds,onSelectionChange:U=>E(w,{selectedTrackIds:U}),onPlay:o,onRemove:U=>s(S.id,U),onReorder:U=>i(S.id,U),onTagTracks:l,sortField:R.sortField,sortDir:R.sortDir,onSortChange:(U,$)=>E(w,{sortField:U,sortDir:$}),filterText:R.filterText,onFilterChange:U=>E(w,{filterText:U}),compact:!0,draggable:!0}):r.jsx("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",opacity:.3,fontSize:"0.85rem"},children:h("playlistManager.selectPlaylistPrompt","Select a playlist to see its tracks")})]})};return r.jsxs("div",{style:{display:"flex",height:"100%",userSelect:N?"none":"auto"},onKeyDown:V,onMouseMove:H,onMouseUp:G,tabIndex:0,children:[r.jsx("div",{style:{width:`${v}%`,minWidth:200},children:Z("left")}),r.jsx("div",{style:{width:6,cursor:"col-resize",background:N?"var(--nice-color-accent, #3b82f6)":"var(--nice-border-color, #e5e7eb)",transition:N?"none":"background 0.15s",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},onMouseDown:W,children:r.jsx("div",{style:{width:2,height:40,borderRadius:1,background:N?"var(--nice-color-accent, #3b82f6)":"var(--nice-bg-tertiary, #9ca3af)"}})}),r.jsx("div",{style:{flex:1,minWidth:200},children:Z("right")})]})},ra=e=>({background:e?"var(--nice-color-accent, #3b82f6)":"transparent",color:e?"var(--nice-text-on-accent, #fff)":"var(--nice-text-secondary, #6b7280)",border:e?"none":"1px solid var(--nice-border-color, #d1d5db)",borderRadius:6,padding:"3px 8px",fontSize:"0.72rem",cursor:"pointer",whiteSpace:"nowrap"}),jl="av:local-playlists";function Uf(){try{const e=localStorage.getItem(jl);return e?JSON.parse(e):[]}catch{return[]}}function Vf(e){const t=JSON.stringify(e);try{localStorage.setItem(jl,t)}catch{}}function es(){const[e,t]=d.useState(()=>Uf()),n=d.useRef(!1);return d.useEffect(()=>{n.current=!0},[]),d.useEffect(()=>{Vf(e)},[e]),d.useMemo(()=>({list:()=>e,get:s=>e.find(i=>i.id===s),create:s=>{const i=new Date().toISOString(),o={id:ve.createId(),name:s,items:[],updatedAt:i};return t(l=>[o,...l]),o},rename:(s,i)=>t(o=>o.map(l=>l.id===s?{...l,name:i,updatedAt:new Date().toISOString()}:l)),remove:s=>t(i=>i.filter(o=>o.id!==s)),replaceItems:(s,i)=>t(o=>o.map(l=>l.id===s?{...l,items:i,updatedAt:new Date().toISOString()}:l)),addItems:(s,i)=>t(o=>o.map(l=>l.id===s?{...l,items:[...l.items,...i],updatedAt:new Date().toISOString()}:l))}),[e])}const qf=st.scoped("PlaylistList"),Hf={border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:8,background:"var(--nice-bg, #fff)"},Kf=(function(){return{...Hf,padding:"8px 10px",cursor:"pointer"}})(),Ml={border:"1px solid var(--nice-border-light, #d1d5db)",borderRadius:8,padding:"6px 10px",background:"var(--nice-bg, #fff)",cursor:"pointer"},Yf=(function(){return{...Ml,background:"var(--nice-color-primary, #4f46e5)",borderColor:"var(--nice-color-primary, #4f46e5)",color:"var(--nice-text-on-primary, #fff)"}})(),ts=({selectedId:e,onSelect:t,onCreateRemote:n})=>{const{t:a}=xe(),s=es(),[i,o]=d.useState(""),l=d.useMemo(()=>s.list(),[s]);return r.jsxs("div",{style:{display:"grid",gap:10},children:[r.jsxs("div",{style:{display:"flex",gap:8},children:[r.jsx("input",{placeholder:a("playlistList.playlistName","Playlist name"),value:i,onChange:c=>o(c.target.value),style:{flex:1,border:"1px solid var(--nice-border, #d1d5db)",borderRadius:8,padding:"6px 10px"},"aria-label":a("playlistList.playlistName","Playlist name")}),r.jsxs("button",{type:"button",disabled:!i.trim(),style:i.trim()?Yf:{...Ml,cursor:"not-allowed",color:"var(--nice-text-muted, #9ca3af)",background:"var(--nice-bg-tertiary, #f3f4f6)"},onClick:async()=>{const c=s.create(i.trim());if(o(""),n)try{await n({platform:"tidal",name:c.name,songs:c.items})}catch(u){qf.error("Remote playlist create failed:",u)}t==null||t(c)},children:["+ ",a("common.add","Add")]})]}),r.jsxs("div",{style:{display:"grid",gap:6},children:[l.map(c=>{const u=c.id===e;return r.jsxs("button",{onClick:()=>t==null?void 0:t(c),style:{...Kf,background:u?"var(--nice-selected-bg, #eef2ff)":"var(--nice-bg, #fff)"},children:[r.jsx("div",{style:{fontWeight:600},children:c.name}),r.jsxs("div",{style:{color:"var(--nice-text-dim, #64748b)",fontSize:12},children:[c.items.length+" "+a("playlistList.songs","songs")," ","• ",new Date(c.updatedAt).toLocaleString()]})]},c.id)}),!l.length&&r.jsx("div",{style:{color:"var(--nice-text-muted, #6b7280)"},children:a("playlistList.emptyState","No playlists. Add the first one ↑")})]})]})},Zf=st.scoped("PlaylistBrowser"),oi={display:"grid",gap:12},li=e=>({artist:(e.artists??[]).join(", "),title:e.title}),Xf=({renderLibrarySearch:e,renderLibrarySearchResult:t,renderLibraryList:n,tracks:a,view:s,onSelect:i,onPlay:o})=>{var b;const{t:l}=xe(),c=es(),[u,h]=d.useState(null),[p,g]=d.useState(""),[,y]=d.useState([]),m=u==null?void 0:u.id,x=(f,j)=>{if("addItems"in c){c.addItems(f.id,j);const C=c.list().find(N=>N.id===f.id)||f;h(C);return}const v=c;if("update"in c&&typeof v.update=="function"){const C=Array.from([...f.items||[],...j]);v.update({...f,items:C});const N=c.list().find(M=>M.id===f.id)||{...f,items:C};h(N);return}Zf.warn("useLocalPlaylists: missing addItems/update method — update hook implementation.")};return r.jsxs("div",{style:{display:"grid",gridTemplateColumns:"minmax(min(200px, 100%), 320px) 1fr",gap:16},children:[r.jsxs("div",{style:oi,children:[r.jsx("h3",{style:{margin:0},children:l("playlistBrowser.playlists","Playlists")}),r.jsx(ts,{selectedId:m,onSelect:h}),u&&r.jsxs("div",{style:{fontSize:12,color:"var(--nice-text-dim, #64748b)"},children:[l("playlistBrowser.selected","Selected"),": ",r.jsx("strong",{children:u.name})," ·"," ",((b=u.items)==null?void 0:b.length)??0," ",l("playlistBrowser.tracks","tracks")]})]}),r.jsxs("div",{style:oi,children:[r.jsx("h3",{style:{margin:0},children:l("playlistBrowser.library","Library")}),r.jsxs("div",{children:[e==null?void 0:e({placeholder:l("playlistBrowser.searchAndAdd","Search and add to playlist..."),onSelect:f=>{u&&x(u,[li(f)])}}),r.jsx("input",{placeholder:l("playlistBrowser.fullSearch","Full search (Enter does not add, full list below)"),value:p,onChange:f=>g(f.target.value),style:{width:"100%",border:"1px solid var(--nice-border, #d1d5db)",borderRadius:8,padding:"6px 10px",marginTop:10}})]}),t==null?void 0:t({query:p,onSelect:f=>{u&&x(u,[li(f)])}}),n==null?void 0:n({onPlayNow:f=>y(f),onAddToQueue:f=>y(j=>[...j,...f]),onAddDescriptors:f=>u&&x(u,f)})]})]})};var Kt=(e=>(e[e.None=0]="None",e[e.Spotify=1]="Spotify",e[e.Tidal=2]="Tidal",e[e.YouTube=4]="YouTube",e[e.All=7]="All",e))(Kt||{});const Rl=(e,t=null)=>e.filter(n=>n.parentId===t).sort((n,a)=>n.sortOrder-a.sortOrder).map(n=>({...n,children:Rl(e,n.id)})),Qf={[Kt.Spotify]:{label:"Spotify",color:"var(--source-spotify, #1DB954)",bg:"var(--source-spotify-bg, #1DB95418)"},[Kt.Tidal]:{label:"Tidal",color:"var(--source-tidal, #000000)",bg:"var(--source-tidal-bg, #00000010)"},[Kt.YouTube]:{label:"YouTube",color:"var(--source-youtube, #FF0000)",bg:"var(--source-youtube-bg, #FF000010)"}},Jf=({folders:e,playlists:t,tags:n,services:a,activeFolderId:s,activePlaylistId:i,onSelectFolder:o,onSelectPlaylist:l,onCreateFolder:c,onRenameFolder:u,onDeleteFolder:h,onCreatePlaylist:p,onConnectService:g,onDisconnectService:y,onDragPlaylistToFolder:m,collapsed:x=!1,onToggleCollapse:b})=>{const{t:f}=xe(),[j,v]=d.useState(new Set),[C,N]=d.useState(!1),[M,k]=d.useState(""),[T,E]=d.useState(null),[A,I]=d.useState(!1),[L,P]=d.useState(""),[_,ee]=d.useState("static"),[K,z]=d.useState(null),[V,W]=d.useState(""),[H,G]=d.useState(null),[Z,w]=d.useState(!1),R=d.useMemo(()=>Rl(e),[e]),S=d.useCallback(ne=>{v(pe=>{const fe=new Set(pe);return fe.has(ne)?fe.delete(ne):fe.add(ne),fe})},[]),F=d.useCallback(()=>{M.trim()&&(c(M.trim(),T),k(""),N(!1))},[M,T,c]),Y=d.useCallback(()=>{L.trim()&&(p(L.trim(),_,s),P(""),I(!1))},[L,_,s,p]),O=d.useCallback(ne=>{V.trim()&&(u(ne,V.trim()),z(null),W(""))},[V,u]),U=d.useCallback((ne,pe)=>{ne.preventDefault(),ne.dataTransfer.dropEffect="move",G(pe)},[]),$=d.useCallback((ne,pe)=>{ne.preventDefault();const fe=ne.dataTransfer.getData("playlistId");fe&&m&&m(fe,pe),G(null)},[m]),q=d.useCallback(()=>G(null),[]),X=d.useCallback(ne=>t.filter(pe=>(pe.folderId??null)===ne),[t]),re={width:x?48:280,minWidth:x?48:280,background:"var(--nice-bg-secondary, #f8f9fa)",borderRight:"1px solid var(--nice-border-color, #e5e7eb)",display:"flex",flexDirection:"column",transition:"width 0.2s, min-width 0.2s",overflow:"hidden",height:"100%"},oe={padding:"8px 12px",borderBottom:"1px solid var(--nice-border-color, #e5e7eb)"},se=(ne,pe=!1)=>({padding:"6px 12px",borderRadius:6,cursor:"pointer",display:"flex",alignItems:"center",gap:8,fontSize:"0.82rem",background:pe?"var(--nice-color-accent-light, #dbeafe)":ne?"var(--nice-color-accent, #3b82f6)":"transparent",color:ne?"var(--btn-text, #fff)":"var(--nice-text-primary, #1f2937)",transition:"background 0.15s",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}),D={background:"none",border:"none",cursor:"pointer",fontSize:"0.75rem",padding:"2px 6px",borderRadius:4,color:"var(--nice-text-secondary, #6b7280)"},J={fontSize:"0.8rem",padding:"4px 8px",borderRadius:6,border:"1px solid var(--nice-border-color, #d1d5db)",background:"var(--nice-input-bg, #fff)",color:"var(--nice-text-primary, #1f2937)",width:"100%"},ae=(ne,pe)=>{var je,Pe;const fe=j.has(ne.id),ge=s===ne.id,he=H===ne.id,we=X(ne.id);return r.jsxs("div",{children:[r.jsxs("div",{role:"button",tabIndex:0,onKeyDown:ve.clickOnActivationKey,style:{...se(ge,he),paddingLeft:12+pe*16},onClick:()=>{o(ne.id),ne.children&&ne.children.length>0&&S(ne.id)},onDragOver:$e=>U($e,ne.id),onDrop:$e=>$($e,ne.id),onDragLeave:q,children:[r.jsx("span",{style:{width:14,textAlign:"center",flexShrink:0,fontSize:"0.7rem"},children:(((je=ne.children)==null?void 0:je.length)||0)>0||we.length>0?fe?r.jsx(B.NtdChevronDown,{size:10}):r.jsx(B.NtdChevronRight,{size:10}):null}),K===ne.id?r.jsx("input",{value:V,onChange:$e=>W($e.target.value),onKeyDown:$e=>{$e.key==="Enter"&&O(ne.id),$e.key==="Escape"&&z(null)},onBlur:()=>O(ne.id),autoFocus:!0,style:{...J,flex:1},onClick:$e=>$e.stopPropagation()}):r.jsxs(r.Fragment,{children:[r.jsx("span",{style:{display:"inline-flex"},children:ne.icon??r.jsx(B.NtdFolder,{size:14})}),r.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:ne.name}),r.jsx("span",{style:{fontSize:"0.65rem",opacity:.5},children:we.length}),r.jsx("button",{style:D,onClick:$e=>{$e.stopPropagation(),z(ne.id),W(ne.name)},title:f("common.rename","Rename"),"aria-label":f("common.rename","Rename"),children:r.jsx(B.NtdEdit,{size:12})}),r.jsx("button",{style:{...D,color:"var(--nice-color-error, #ef4444)"},onClick:$e=>{$e.stopPropagation(),h(ne.id)},title:f("common.delete","Delete"),"aria-label":f("common.delete","Delete"),children:r.jsx(B.NtdTrash,{size:12})})]})]}),fe&&r.jsxs(r.Fragment,{children:[we.map($e=>ce($e,pe+1)),(Pe=ne.children)==null?void 0:Pe.map($e=>ae($e,pe+1))]})]},ne.id)},ce=(ne,pe)=>{const fe=i===ne.id;return r.jsxs("div",{role:"button",tabIndex:0,onKeyDown:ve.clickOnActivationKey,style:{...se(fe),paddingLeft:12+pe*16+22},onClick:()=>l(ne.id),draggable:!0,onDragStart:ge=>{ge.dataTransfer.setData("playlistId",ne.id),ge.dataTransfer.effectAllowed="move"},children:[r.jsx("span",{style:{display:"inline-flex"},children:ne.type==="dynamic"?r.jsx(B.NtdLightning,{size:12}):r.jsx(B.NtdMusic,{size:12})}),r.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:ne.name}),r.jsx("span",{style:{fontSize:"0.65rem",opacity:.5},children:ne.trackCount})]},ne.id)};if(x)return r.jsx("div",{style:re,children:r.jsx("button",{style:{...D,padding:"12px 0",fontSize:"1.1rem",width:"100%"},onClick:b,title:f("playlistManager.expandSidebar","Expand sidebar"),"aria-label":f("playlistManager.expandSidebar","Expand sidebar"),children:r.jsx(B.NtdChevronRight,{size:16})})});const le=X(null);return r.jsxs("div",{style:re,children:[r.jsxs("div",{style:{...oe,display:"flex",alignItems:"center",justifyContent:"space-between"},children:[r.jsxs("span",{style:{fontWeight:700,fontSize:"0.85rem",display:"inline-flex",alignItems:"center",gap:6},children:[r.jsx(B.NtdMusic,{size:14})," ",f("playlistManager.title","Playlists")]}),r.jsx("button",{style:D,onClick:b,title:f("playlistManager.collapseSidebar","Collapse sidebar"),"aria-label":f("playlistManager.collapseSidebar","Collapse sidebar"),children:r.jsx(B.NtdChevronLeft,{size:16})})]}),r.jsxs("div",{style:{...oe,display:"flex",gap:4,flexWrap:"wrap"},children:[r.jsxs("button",{style:{...D,background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",borderRadius:6,padding:"4px 10px"},onClick:()=>I(!0),children:["+ ",f("playlistManager.newPlaylist","New playlist")]}),r.jsxs("button",{style:{...D,border:"1px solid var(--nice-border-color, #d1d5db)",borderRadius:6,padding:"4px 10px"},onClick:()=>{N(!0),E(s)},children:[r.jsx(B.NtdFolder,{size:12})," ",f("playlistManager.newFolder","New folder")]})]}),A&&r.jsxs("div",{style:{...oe,display:"flex",flexDirection:"column",gap:6},children:[r.jsx("input",{value:L,onChange:ne=>P(ne.target.value),placeholder:f("playlistManager.playlistName","Playlist name"),style:J,autoFocus:!0,onKeyDown:ne=>{ne.key==="Enter"&&Y(),ne.key==="Escape"&&I(!1)}}),r.jsxs("div",{style:{display:"flex",gap:6,alignItems:"center"},children:[r.jsxs("label",{style:{fontSize:"0.75rem",display:"flex",gap:4,alignItems:"center",cursor:"pointer"},children:[r.jsx("input",{type:"radio",checked:_==="static",onChange:()=>ee("static")}),f("playlistManager.static","Static")]}),r.jsxs("label",{style:{fontSize:"0.75rem",display:"flex",gap:4,alignItems:"center",cursor:"pointer"},children:[r.jsx("input",{type:"radio",checked:_==="dynamic",onChange:()=>ee("dynamic")}),r.jsx(B.NtdLightning,{size:12})," ",f("playlistManager.dynamic","Dynamic")]}),r.jsx("div",{style:{flex:1}}),r.jsx("button",{style:{...D,background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",borderRadius:4,padding:"3px 8px"},onClick:Y,"aria-label":f("playlistManager.confirmCreatePlaylist","Confirm create playlist"),children:r.jsx(B.NtdCheck,{size:12})}),r.jsx("button",{style:D,onClick:()=>I(!1),"aria-label":f("playlistManager.cancelCreatePlaylist","Cancel create playlist"),children:r.jsx(B.NtdClose,{size:12})})]})]}),C&&r.jsxs("div",{style:{...oe,display:"flex",gap:6},children:[r.jsx("input",{value:M,onChange:ne=>k(ne.target.value),placeholder:f("playlistManager.folderName","Folder name"),style:{...J,flex:1},autoFocus:!0,onKeyDown:ne=>{ne.key==="Enter"&&F(),ne.key==="Escape"&&N(!1)}}),r.jsx("button",{style:{...D,background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",borderRadius:4,padding:"3px 8px"},onClick:F,"aria-label":f("playlistManager.confirmCreateFolder","Confirm create folder"),children:r.jsx(B.NtdCheck,{size:12})}),r.jsx("button",{style:D,onClick:()=>N(!1),"aria-label":f("playlistManager.cancelCreateFolder","Cancel create folder"),children:r.jsx(B.NtdClose,{size:12})})]}),r.jsxs("div",{style:{flex:1,overflow:"auto",padding:"4px 0"},children:[r.jsxs("div",{role:"button",tabIndex:0,onKeyDown:ve.clickOnActivationKey,style:se(s===null&&i===null,H==="__root__"),onClick:()=>o(null),onDragOver:ne=>U(ne,null),onDrop:ne=>$(ne,null),onDragLeave:q,children:[r.jsx(B.NtdHome,{size:14}),r.jsx("span",{style:{flex:1},children:f("playlistManager.allPlaylists","All playlists")}),r.jsx("span",{style:{fontSize:"0.65rem",opacity:.5},children:t.length})]}),le.map(ne=>ce(ne,0)),R.map(ne=>ae(ne,0))]}),n.length>0&&r.jsxs("div",{style:oe,children:[r.jsx("div",{style:{fontSize:"0.7rem",fontWeight:600,marginBottom:4,opacity:.6},children:f("playlistManager.tags","Tags")}),r.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:4},children:n.map(ne=>r.jsxs("span",{style:{fontSize:"0.7rem",padding:"2px 8px",borderRadius:12,background:ne.color+"22",color:ne.color,border:`1px solid ${ne.color}44`,cursor:"pointer"},children:[r.jsx(Sa,{icon:ne.icon,size:10}),ne.icon?" ":"",ne.name]},ne.id))})]}),r.jsxs("div",{style:oe,children:[r.jsxs("div",{role:"button",tabIndex:0,"aria-expanded":Z,onKeyDown:ve.clickOnActivationKey,style:{display:"flex",alignItems:"center",justifyContent:"space-between",cursor:"pointer",fontSize:"0.7rem",fontWeight:600,opacity:.6},onClick:()=>w(!Z),children:[r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(B.NtdLink,{size:12})," ",f("playlistManager.services","Services")]}),Z?r.jsx(B.NtdChevronUp,{size:12}):r.jsx(B.NtdChevronDown,{size:12})]}),Z&&r.jsx("div",{style:{marginTop:6,display:"flex",flexDirection:"column",gap:4},children:[Kt.Spotify,Kt.Tidal,Kt.YouTube].map(ne=>{const pe=Qf[ne],fe=a.find(ge=>ge.platform===ne);return r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"4px 8px",borderRadius:6,border:"1px solid var(--nice-border-color, #e5e7eb)",fontSize:"0.78rem"},children:[r.jsx(B.NtdCircle,{size:10,style:{color:pe.color}}),r.jsx("span",{style:{flex:1},children:pe.label}),fe!=null&&fe.connected?r.jsxs(r.Fragment,{children:[r.jsx("span",{style:{fontSize:"0.65rem",opacity:.6},children:fe.username??f("playlistManager.connected","Connected")}),r.jsx("button",{style:{...D,color:"var(--nice-danger, #ef4444)"},onClick:()=>y(ne),"aria-label":f("playlistManager.disconnect","Disconnect"),children:r.jsx(B.NtdClose,{size:12})})]}):r.jsx("button",{style:{...D,background:pe.color,color:"var(--nice-color-white, #fff)",borderRadius:4,padding:"2px 8px"},onClick:()=>g(ne),children:f("playlistManager.connect","Connect")})]},ne)})})]})]})},em=({playlist:e,tags:t,onPlay:n,selectedTrackIds:a,onSelectionChange:s})=>{const{t:i}=xe(),o=d.useCallback(l=>{const c=new Set(a);c.has(l)?c.delete(l):c.add(l),s(c)},[a,s]);return e.tracks.length===0?r.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",padding:60,opacity:.3},children:[r.jsx("span",{style:{marginBottom:8,display:"inline-flex"},children:r.jsx(B.NtdMusic,{size:32})}),r.jsx("span",{style:{fontSize:"0.82rem"},children:i("playlistManager.emptyPlaylist","This playlist is empty")})]}):r.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(160px, 1fr))",gap:10},children:e.tracks.map(l=>{const c=a.has(l.id);return r.jsxs("div",{role:"button",tabIndex:0,"aria-pressed":c,onKeyDown:ve.clickOnActivationKey,onClick:()=>o(l.id),onDoubleClick:()=>n(l),style:{border:c?"2px solid var(--nice-color-accent, #3b82f6)":"1px solid var(--nice-border-color, #e5e7eb)",borderRadius:10,padding:10,cursor:"pointer",background:c?"var(--nice-accent-tint-10, #eff6ff)":"var(--nice-bg-elevated, #fff)",transition:"all 0.12s"},children:[r.jsx("div",{style:{width:"100%",aspectRatio:"1",borderRadius:6,background:"linear-gradient(135deg, var(--playlist-track-bg1, #6366f140), var(--playlist-track-bg2, #6366f110))",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"1.5rem",marginBottom:6},children:r.jsx(B.NtdMusic,{size:24})}),r.jsx("div",{style:{fontWeight:500,fontSize:"0.78rem",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:l.title}),r.jsx("div",{style:{fontSize:"0.68rem",opacity:.5,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:l.artist})]},l.id)})})},tm=d.memo(em),ci=e=>e.replace(/[^a-z0-9_-]/gi,"-"),di={background:"none",border:"none",cursor:"pointer",fontSize:"0.78rem",padding:"2px 4px",opacity:.4},nm=({playlists:e,folders:t,tags:n,activeFolderId:a,onSelectPlaylist:s,onDeletePlaylist:i,onDuplicatePlaylist:o})=>{const{t:l}=xe(),c=d.useMemo(()=>a?e.filter(u=>u.folderId===a):e,[e,a]);return c.length===0?r.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:60,opacity:.4},children:[r.jsx("span",{style:{marginBottom:12,display:"inline-flex"},children:r.jsx(B.NtdMusic,{size:40})}),r.jsx("span",{style:{fontSize:"0.85rem"},children:l("playlistManager.emptyState","No playlists yet")})]}):r.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(240px, 1fr))",gap:12},children:c.map(u=>{var p;const h=t.find(g=>g.id===u.folderId);return r.jsxs("div",{role:"button",tabIndex:0,onKeyDown:ve.clickOnActivationKey,onClick:()=>s(u.id),style:{border:"1px solid var(--nice-border-color, #e5e7eb)",borderRadius:12,padding:16,cursor:"pointer",background:"var(--nice-bg-elevated, #fff)",transition:"box-shadow 0.15s, transform 0.15s"},onMouseEnter:g=>{g.currentTarget.style.boxShadow="0 4px 12px var(--nice-overlay-8, rgba(0, 0, 0, 0.08))",g.currentTarget.style.transform="translateY(-1px)"},onMouseLeave:g=>{g.currentTarget.style.boxShadow="none",g.currentTarget.style.transform="none"},children:[r.jsx("div",{style:{width:"100%",aspectRatio:"1",borderRadius:8,background:"linear-gradient(135deg, var(--playlist-cover-bg1, #6366f140), var(--playlist-cover-bg2, #6366f110))",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"2.5rem",marginBottom:10},children:u.type===Ja.Dynamic?r.jsx(B.NtdLightning,{size:40}):r.jsx(B.NtdMusic,{size:40})}),r.jsx("div",{style:{fontWeight:600,fontSize:"0.85rem",marginBottom:2},children:u.name}),r.jsxs("div",{style:{fontSize:"0.72rem",opacity:.5},children:[u.trackCount," ",l("playlistManager.tracks","tracks"),h&&r.jsxs(r.Fragment,{children:[" — ",r.jsx(B.NtdFolder,{size:11})," ",h.name]})]}),((p=u.tags)==null?void 0:p.length)>0&&r.jsx("div",{style:{display:"flex",gap:4,marginTop:6,flexWrap:"wrap"},children:u.tags.slice(0,3).map(g=>{const y=n.find(m=>m.id===g);return y?r.jsx("span",{style:{padding:"1px 8px",borderRadius:12,background:`var(--tag-${ci(g)}-bg, ${y.color}18)`,color:`var(--tag-${ci(g)}, ${y.color})`,fontSize:"0.65rem",fontWeight:500},children:y.name},g):null})}),r.jsxs("div",{style:{display:"flex",gap:4,marginTop:8},children:[r.jsx("button",{onClick:g=>{g.stopPropagation(),o(u.id)},style:di,title:l("playlistManager.duplicate","Duplicate"),"aria-label":l("playlistManager.duplicate","Duplicate"),children:r.jsx(B.NtdCopy,{size:14})}),r.jsx("button",{onClick:g=>{g.stopPropagation(),i(u.id)},style:di,title:l("playlistManager.delete","Delete"),"aria-label":l("playlistManager.delete","Delete"),children:r.jsx(B.NtdTrash,{size:14})})]})]},u.id)})})},rm=d.memo(nm),ui=[{value:xt.Library,label:"Library",hex:"var(--nice-info, #6366f1)",css:"var(--source-library, #6366f1)",cssBg:"var(--source-library-bg, #6366f118)"},{value:xt.Spotify,label:"Spotify",hex:"var(--nice-success, #1db954)",css:"var(--source-spotify, #1db954)",cssBg:"var(--source-spotify-bg, #1db95418)"},{value:xt.Tidal,label:"Tidal",hex:"var(--nice-text, #000000)",css:"var(--source-tidal, #000000)",cssBg:"var(--source-tidal-bg, #00000018)"},{value:xt.YouTube,label:"YouTube",hex:"var(--nice-danger, #ff0000)",css:"var(--source-youtube, #ff0000)",cssBg:"var(--source-youtube-bg, #ff000018)"},{value:xt.MusicBrainz,label:"MusicBrainz",hex:"var(--source-musicbrainz, #ba478f)",css:"var(--source-musicbrainz, #ba478f)",cssBg:"var(--source-musicbrainz-bg, #ba478f18)"}],am=({onSearch:e,results:t,isSearching:n,onAddToPlaylist:a,onPlayPreview:s})=>{const{t:i}=xe(),[o,l]=d.useState(""),[c,u]=d.useState(new Set([xt.Library,xt.Spotify,xt.Tidal,xt.YouTube])),[h,p]=d.useState(new Set),[g,y]=d.useState(!1),m=d.useRef(null),x=d.useCallback(k=>{u(T=>{const E=new Set(T);return E.has(k)?E.delete(k):E.add(k),E})},[]),b=d.useCallback(k=>{l(k),m.current&&clearTimeout(m.current),k.trim().length>=2&&(m.current=setTimeout(()=>{e(k.trim(),Array.from(c))},350))},[c,e]),f=d.useCallback(k=>{k.preventDefault(),o.trim().length>=2&&e(o.trim(),Array.from(c))},[o,c,e]),j=d.useCallback(k=>{p(T=>{const E=new Set(T);return E.has(k)?E.delete(k):E.add(k),E})},[]),v=d.useCallback(()=>{h.size===t.length?p(new Set):p(new Set(t.map(k=>k.id)))},[h,t]),C=d.useCallback(()=>{const k=t.filter(T=>h.has(T.id));k.length>0&&(a(k),p(new Set))},[t,h,a]),N=k=>{if(!k)return"--:--";const T=Math.floor(k/60),E=k%60;return`${T}:${E.toString().padStart(2,"0")}`},M=k=>{const T=ui.find(E=>E.value===k);return r.jsx(B.NtdCircle,{size:10,style:{color:T?T.css:"var(--nice-text-secondary, #6b7280)"}})};return r.jsxs("div",{style:{border:"1px solid var(--nice-border-color, #e5e7eb)",borderRadius:10,background:"var(--nice-bg-elevated, #fff)",overflow:"hidden"},children:[r.jsxs("div",{role:"button",tabIndex:0,"aria-expanded":g,onKeyDown:ve.clickOnActivationKey,style:{display:"flex",alignItems:"center",padding:"8px 12px",gap:8,cursor:"pointer",background:"var(--nice-color-surface, #f9fafb)"},onClick:()=>y(!g),children:[r.jsx(B.NtdSearch,{size:16}),r.jsx("span",{style:{fontWeight:600,fontSize:"0.85rem"},children:i("playlistManager.search","Search")}),r.jsx("span",{style:{marginLeft:"auto",fontSize:"0.75rem",opacity:.5},children:g?r.jsx(B.NtdChevronUp,{size:12}):r.jsx(B.NtdChevronDown,{size:12})})]}),g&&r.jsxs("div",{style:{padding:"0 12px 12px"},children:[r.jsx("div",{style:{display:"flex",gap:6,marginBottom:8,flexWrap:"wrap"},children:ui.map(k=>{const T=c.has(k.value);return r.jsxs("button",{onClick:()=>x(k.value),style:{padding:"4px 10px",borderRadius:20,border:T?`2px solid ${k.css}`:"1px solid var(--nice-border-color, #d1d5db)",background:T?k.cssBg:"transparent",color:T?k.css:"var(--nice-text-secondary, #6b7280)",fontSize:"0.72rem",cursor:"pointer",fontWeight:T?600:400,transition:"all 0.15s"},children:[r.jsx(B.NtdCircle,{size:8,style:{color:k.css}})," ",k.label]},k.value)})}),r.jsxs("form",{onSubmit:f,style:{display:"flex",gap:6,marginBottom:8},children:[r.jsx("input",{type:"text",value:o,onChange:k=>b(k.target.value),placeholder:i("playlistManager.searchPlaceholder","Search tracks, artists, albums..."),style:{flex:1,padding:"6px 12px",borderRadius:8,border:"1px solid var(--nice-border-color, #d1d5db)",background:"var(--nice-input-bg, #fff)",color:"var(--nice-text-primary, #1f2937)",fontSize:"0.82rem"}}),r.jsx("button",{type:"submit",disabled:o.trim().length<2||n,style:{padding:"6px 14px",borderRadius:8,border:"none",background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",fontSize:"0.82rem",cursor:"pointer",opacity:o.trim().length<2?.5:1},"aria-label":i("playlistManager.search","Search"),children:n?r.jsx(B.NtdClock,{size:14}):r.jsx(B.NtdSearch,{size:14})})]}),t.length>0&&r.jsxs("div",{children:[r.jsxs("div",{style:{display:"flex",gap:6,marginBottom:4,alignItems:"center"},children:[r.jsxs("label",{style:{fontSize:"0.72rem",display:"flex",alignItems:"center",gap:4,cursor:"pointer"},children:[r.jsx("input",{type:"checkbox",checked:h.size===t.length&&t.length>0,onChange:v}),i("playlistManager.selectAll","Select all")]}),r.jsxs("span",{style:{fontSize:"0.72rem",opacity:.5},children:[t.length," ",i("playlistManager.results","results")]}),r.jsx("div",{style:{flex:1}}),h.size>0&&r.jsxs("button",{onClick:C,style:{padding:"3px 10px",borderRadius:6,border:"none",background:"var(--nice-color-accent, #3b82f6)",color:"var(--btn-text, #fff)",fontSize:"0.72rem",cursor:"pointer"},children:[r.jsx(B.NtdPlus,{size:12})," ",i("playlistManager.addSelected","Add selected")," (",h.size,")"]})]}),r.jsx("div",{style:{maxHeight:300,overflowY:"auto",borderRadius:6,border:"1px solid var(--nice-border-color, #e5e7eb)"},children:t.map(k=>r.jsxs("div",{role:"button",tabIndex:0,"aria-pressed":h.has(k.id),onKeyDown:ve.clickOnActivationKey,style:{display:"flex",alignItems:"center",gap:8,padding:"6px 10px",borderBottom:"1px solid var(--nice-border-color, #f3f4f6)",background:h.has(k.id)?"var(--nice-accent-tint-10, #eff6ff)":"transparent",cursor:"pointer",fontSize:"0.78rem"},onClick:()=>j(k.id),children:[r.jsx("input",{type:"checkbox",checked:h.has(k.id),readOnly:!0}),M(k.source),k.imageUrl&&r.jsx("img",{src:k.imageUrl,alt:k.title||i("common.coverArt","Cover art"),style:{width:28,height:28,borderRadius:4,objectFit:"cover"}}),r.jsxs("div",{style:{flex:1,minWidth:0},children:[r.jsx("div",{style:{fontWeight:500,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:k.title}),r.jsxs("div",{style:{fontSize:"0.7rem",opacity:.6,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:[k.artist,k.album?` — ${k.album}`:""]})]}),r.jsx("span",{style:{opacity:.5,fontSize:"0.7rem",flexShrink:0},children:N(k.duration)}),s&&r.jsx("button",{onClick:T=>{T.stopPropagation(),s(k)},style:{background:"none",border:"none",cursor:"pointer",fontSize:"0.85rem"},title:i("playlistManager.preview","Preview"),"aria-label":i("playlistManager.preview","Preview"),children:r.jsx(B.NtdPlay,{size:14})})]},k.id))})]}),n&&r.jsxs("div",{style:{textAlign:"center",padding:20,opacity:.5,fontSize:"0.82rem"},children:[r.jsx(B.NtdClock,{size:14})," ",i("playlistManager.searching","Searching"),"..."]}),!n&&o.trim().length>=2&&t.length===0&&r.jsx("div",{style:{textAlign:"center",padding:20,opacity:.4,fontSize:"0.82rem"},children:i("playlistManager.noResults","No results")})]})]})},sm=[{value:1,label:"Spotify",icon:r.jsx(B.NtdMusic,{size:16}),color:"var(--source-spotify, #1db954)"},{value:2,label:"Tidal",icon:r.jsx(B.NtdMusic,{size:16}),color:"var(--source-tidal, #000000)"},{value:3,label:"Apple Music",icon:r.jsx(B.NtdMusic,{size:16}),color:"var(--source-apple, #fa243c)"},{value:4,label:"YouTube",icon:r.jsx(B.NtdMusic,{size:16}),color:"var(--source-youtube, #ff0000)"},{value:99,label:"Manual Paste",icon:r.jsx(B.NtdMusic,{size:16}),color:"var(--source-manual, #6366f1)"}],im={display:"flex",flexDirection:"column",gap:16,padding:24,borderRadius:12,background:"var(--nice-bg-primary, #ffffff)",border:"1px solid var(--nice-border, #e2e8f0)",maxWidth:640,minHeight:400},om={display:"flex",justifyContent:"space-between",alignItems:"center"},lm={display:"flex",gap:4,marginBottom:8},Ln={padding:"8px 20px",borderRadius:6,border:"none",background:"var(--nice-color-accent, #6366f1)",color:"var(--nice-text-on-primary, #fff)",cursor:"pointer",fontWeight:600},sr=(function(){return{...Ln,background:"transparent",color:"var(--nice-text-primary, #334155)",border:"1px solid var(--nice-border, #e2e8f0)"}})(),hi={padding:12,borderRadius:8,border:"1px solid var(--nice-border, #e2e8f0)",cursor:"pointer",transition:"border-color 0.15s"},Nl=["connect","browse","tracks","options","importing","done"];function cm(e){return Nl.indexOf(e)}function dm(e){if(!e)return"--:--";const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`}const um=({connections:e=[],onConnect:t=()=>{},onDisconnect:n=()=>{},onFetchPlaylists:a=async()=>[],onFetchTracks:s=async()=>[],onImport:i=async()=>({playlistName:"",imported:0,skipped:0,failed:0,failedTracks:[]}),onClose:o=()=>{},targetFolders:l,sources:c})=>{const{t:u}=xe(),[h,p]=d.useState("connect"),[g,y]=d.useState(null),[m,x]=d.useState([]),[b,f]=d.useState(null),[j,v]=d.useState([]),[C,N]=d.useState(new Set),[M,k]=d.useState(!1),[T,E]=d.useState(null),[A,I]=d.useState(null),[L,P]=d.useState(null),[_,ee]=d.useState({mergeTags:!0,mergeFolders:!0,overwriteExisting:!1}),[K,z]=d.useState(""),V=d.useMemo(()=>new Set(e.filter(D=>D.connected).map(D=>D.platform)),[e]),W=d.useCallback(D=>e.find(J=>J.platform===D),[e]),H=d.useCallback(D=>{if(y(D),D===99){p("tracks"),z(""),v([]),k(!1);return}V.has(D)?(p("browse"),k(!0),P(null),a(D).then(J=>{x(J),k(!1)}).catch(J=>{P(String(J)),k(!1)})):t(D)},[V,t,a]),G=d.useCallback(D=>{f(D),p("tracks"),k(!0),P(null),s(D).then(J=>{v(J),N(new Set(J.map(ae=>ae.externalId))),k(!1)}).catch(J=>{P(String(J)),k(!1)})},[s]),Z=d.useCallback(D=>{N(J=>{const ae=new Set(J);return ae.has(D)?ae.delete(D):ae.add(D),ae})},[]),w=d.useCallback(()=>{N(D=>D.size===j.length?new Set:new Set(j.map(J=>J.externalId)))},[j]),R=d.useCallback(async()=>{if(!b)return;const D=j.filter(J=>C.has(J.externalId));if(D.length!==0){p("importing"),E({total:D.length,imported:0,skipped:0,failed:0}),P(null);try{const J=await i(b,D,_),ae=J&&typeof J=="object"&&"imported"in J?J:{playlistName:b.name,imported:D.length,skipped:0,failed:0,failedTracks:[]};I(ae),p("done")}catch(J){P(String(J)),p("options")}}},[b,j,C,_,i]),S=h!=="connect"&&h!=="importing"&&h!=="done",F=d.useCallback(()=>{switch(h){case"browse":p("connect");break;case"tracks":p("browse");break;case"options":p("tracks");break}},[h]),Y=()=>r.jsx("div",{style:lm,children:Nl.map((D,J)=>r.jsx("div",{style:{flex:1,height:4,borderRadius:2,background:J<=cm(h)?"var(--nice-color-accent, #6366f1)":"var(--nice-border, #e2e8f0)",transition:"background 0.2s"}},D))}),O=()=>r.jsxs("div",{style:{display:"grid",gap:12},children:[r.jsx("p",{style:{margin:0,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.selectPlatform","Select a music platform to import from")}),sm.map(D=>{const J=W(D.value),ae=V.has(D.value);return r.jsxs("div",{style:{...hi,display:"flex",alignItems:"center",gap:12,borderColor:ae?D.color:void 0},onClick:()=>H(D.value),role:"button",tabIndex:0,onKeyDown:ce=>ce.key==="Enter"&&H(D.value),children:[r.jsx("span",{style:{color:D.color,display:"inline-flex"},"aria-hidden":"true",children:D.icon}),r.jsxs("div",{style:{flex:1},children:[r.jsx("strong",{children:D.label}),(J==null?void 0:J.username)&&r.jsx("div",{style:{fontSize:12,color:"var(--nice-text-dim, #64748b)"},children:J.username})]}),ae?r.jsxs("span",{style:{color:D.color,fontSize:12,fontWeight:600},children:[u("importWizard.connected","Connected")," ",r.jsx(B.NtdCheck,{size:12})]}):r.jsx("span",{style:{fontSize:12,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.clickToConnect","Click to connect")})]},D.value)})]}),U=()=>r.jsxs("div",{style:{display:"grid",gap:12},children:[r.jsx("p",{style:{margin:0,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.selectPlaylist","Select a playlist to import")}),M?r.jsx("div",{style:{textAlign:"center",padding:32,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.loading","Loading playlists…")}):r.jsxs("div",{style:{display:"grid",gap:8,maxHeight:320,overflowY:"auto"},children:[m.map(D=>r.jsxs("div",{style:{...hi,display:"flex",alignItems:"center",gap:12},onClick:()=>G(D),role:"button",tabIndex:0,onKeyDown:J=>J.key==="Enter"&&G(D),children:[D.coverUrl&&r.jsx("img",{src:D.coverUrl,alt:"",style:{width:48,height:48,borderRadius:6,objectFit:"cover"}}),r.jsxs("div",{style:{flex:1,minWidth:0},children:[r.jsx("div",{style:{fontWeight:600,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:D.name}),D.description&&r.jsx("div",{style:{fontSize:12,color:"var(--nice-text-dim, #64748b)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:D.description})]}),r.jsxs("span",{style:{fontSize:12,color:"var(--nice-text-dim, #64748b)",whiteSpace:"nowrap"},children:[D.trackCount," ",u("importWizard.tracks","tracks")]})]},D.id)),m.length===0&&r.jsx("div",{style:{textAlign:"center",padding:24,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.noPlaylists","No playlists found")})]})]}),$=d.useCallback(D=>{const ae=D.split(`
69
+ `).map(ce=>ce.trim()).filter(Boolean).map((ce,le)=>{const ne=ce.match(/^(.+?)\s*[-–—]\s*(.+)$/);return ne?{externalId:`paste-${le}`,title:ne[2].trim(),artist:ne[1].trim(),album:void 0,duration:0}:{externalId:`paste-${le}`,title:ce,artist:"",album:void 0,duration:0}});v(ae),N(new Set(ae.map(ce=>ce.externalId)))},[]),q=()=>r.jsxs("div",{style:{display:"grid",gap:12},children:[g===99&&j.length===0&&r.jsxs("div",{style:{display:"grid",gap:8},children:[r.jsx("p",{style:{margin:0,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.pasteInstructions",'Paste your track list below (one track per line). Use "Artist - Title" format for best results.')}),r.jsx("textarea",{value:K,onChange:D=>z(D.target.value),placeholder:`Daft Punk - Get Lucky
70
70
  The Weeknd - Blinding Lights
71
- Tame Impala - Let It Happen`,rows:10,style:{width:"100%",padding:12,borderRadius:6,border:"1px solid var(--nice-border, #e2e8f0)",fontFamily:"monospace",fontSize:13,resize:"vertical"}}),r.jsx("button",{style:{...Ln,opacity:Y.trim().length===0?.5:1},disabled:Y.trim().length===0,onClick:()=>E(Y),type:"button",children:u("importWizard.parseTracks","Parse Tracks")})]}),(g!==99||k.length>0)&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[r.jsxs("p",{style:{margin:0,fontWeight:600},children:[b==null?void 0:b.name," — ",w.size,"/",k.length," ",u("importWizard.selected","selected")]}),r.jsx("button",{style:sr,onClick:C,type:"button",children:w.size===k.length?u("importWizard.deselectAll","Deselect All"):u("importWizard.selectAll","Select All")})]}),M?r.jsx("div",{style:{textAlign:"center",padding:32,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.loadingTracks","Loading tracks…")}):r.jsx("div",{style:{maxHeight:320,overflowY:"auto"},children:r.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13},children:[r.jsx("thead",{children:r.jsxs("tr",{style:{borderBottom:"1px solid var(--nice-border, #e2e8f0)",textAlign:"left"},children:[r.jsx("th",{style:{padding:"4px 8px",width:32}}),r.jsx("th",{style:{padding:"4px 8px"},children:u("importWizard.colTitle","Title")}),r.jsx("th",{style:{padding:"4px 8px"},children:u("importWizard.artist","Artist")}),r.jsx("th",{style:{padding:"4px 8px"},children:u("importWizard.album","Album")}),r.jsx("th",{style:{padding:"4px 8px",textAlign:"right"},children:u("importWizard.duration","Duration")})]})}),r.jsx("tbody",{children:k.map(D=>{const J=w.has(D.externalId);return r.jsxs("tr",{style:{borderBottom:"1px solid var(--nice-border, #e2e8f0)",opacity:J?1:.5,cursor:"pointer"},onClick:()=>W(D.externalId),children:[r.jsx("td",{style:{padding:"6px 8px"},children:r.jsx("input",{type:"checkbox",checked:J,readOnly:!0})}),r.jsx("td",{style:{padding:"6px 8px",fontWeight:500},children:D.title}),r.jsx("td",{style:{padding:"6px 8px",color:"var(--nice-text-dim, #64748b)"},children:D.artist}),r.jsx("td",{style:{padding:"6px 8px",color:"var(--nice-text-dim, #64748b)"},children:D.album??"—"}),r.jsx("td",{style:{padding:"6px 8px",textAlign:"right",color:"var(--nice-text-dim, #64748b)"},children:dm(D.duration)})]},D.externalId)})})]})}),r.jsx("div",{style:{display:"flex",justifyContent:"flex-end"},children:r.jsxs("button",{style:{...Ln,opacity:w.size===0?.5:1},disabled:w.size===0,onClick:()=>p("options"),type:"button",children:[u("importWizard.next","Next")," ",r.jsx(F.NtdArrowRight,{size:12})]})})]})]}),X=()=>r.jsxs("div",{style:{display:"grid",gap:16},children:[r.jsx("p",{style:{margin:0,fontWeight:600},children:u("importWizard.importOptions","Import options")}),r.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,cursor:"pointer"},children:[r.jsx("input",{type:"checkbox",checked:_.mergeTags,onChange:D=>ee(J=>({...J,mergeTags:D.target.checked}))}),u("importWizard.mergeTags","Merge tags from source playlist")]}),r.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,cursor:"pointer"},children:[r.jsx("input",{type:"checkbox",checked:_.mergeFolders,onChange:D=>ee(J=>({...J,mergeFolders:D.target.checked}))}),u("importWizard.mergeFolders","Merge into existing folder structure")]}),r.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,cursor:"pointer"},children:[r.jsx("input",{type:"checkbox",checked:_.overwriteExisting,onChange:D=>ee(J=>({...J,overwriteExisting:D.target.checked}))}),u("importWizard.overwrite","Overwrite existing tracks (match by ISRC)")]}),l&&l.length>0&&r.jsxs("div",{style:{display:"grid",gap:4},children:[r.jsx("label",{style:{fontSize:13,fontWeight:500},children:u("importWizard.targetFolder","Target folder")}),r.jsxs("select",{style:{padding:"6px 10px",borderRadius:6,border:"1px solid var(--nice-border, #e2e8f0)"},value:_.targetFolderId??"",onChange:D=>ee(J=>({...J,targetFolderId:D.target.value||void 0})),children:[r.jsx("option",{value:"",children:u("importWizard.root","— Root —")}),l.map(D=>r.jsx("option",{value:D.id,children:D.name},D.id))]})]}),r.jsx("div",{style:{marginTop:8,padding:12,borderRadius:8,background:"var(--nice-info-bg, #eff6ff)",fontSize:13},children:u("importWizard.summary",'Ready to import {count} tracks from "{name}"').replace("{count}",String(w.size)).replace("{name}",(b==null?void 0:b.name)??"")}),r.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:8},children:[r.jsxs("button",{style:sr,onClick:B,type:"button",children:[r.jsx(F.NtdArrowLeft,{size:12})," ",u("importWizard.back","Back")]}),r.jsx("button",{style:Ln,onClick:$,type:"button",children:u("importWizard.startImport","Start Import")})]})]}),re=()=>{const D=T?Math.round(T.imported/T.total*100):0;return r.jsxs("div",{style:{display:"grid",gap:16,textAlign:"center",padding:24},children:[r.jsx("p",{style:{margin:0,fontWeight:600,fontSize:18},children:u("importWizard.importing","Importing…")}),r.jsx("div",{style:{height:8,borderRadius:4,background:"var(--nice-border, #e2e8f0)",overflow:"hidden"},children:r.jsx("div",{style:{height:"100%",width:`${D}%`,background:"var(--nice-color-accent, #6366f1)",borderRadius:4,transition:"width 0.3s"}})}),T&&r.jsxs("div",{style:{fontSize:13,color:"var(--nice-text-dim, #64748b)"},children:[T.imported," / ",T.total," ",u("importWizard.tracks","tracks"),T.currentTrack&&r.jsxs("div",{style:{marginTop:4},children:[r.jsx(F.NtdMusic,{size:12})," ",T.currentTrack]})]})]})},oe=()=>r.jsxs("div",{style:{display:"grid",gap:16,textAlign:"center",padding:24},children:[r.jsx("span",{style:{display:"inline-flex",justifyContent:"center"},"aria-hidden":"true",children:r.jsx(F.NtdCheck,{size:48})}),r.jsx("p",{style:{margin:0,fontWeight:600,fontSize:18},children:u("importWizard.complete","Import Complete")}),A&&r.jsxs("div",{style:{display:"grid",gap:4,fontSize:14},children:[r.jsxs("div",{children:[r.jsx("strong",{children:A.imported})," ",u("importWizard.imported","imported")]}),A.skipped>0&&r.jsxs("div",{style:{color:"var(--nice-color-warning, #f59e0b)"},children:[A.skipped," ",u("importWizard.skipped","skipped (duplicates)")]}),A.failed>0&&r.jsxs("div",{style:{color:"var(--nice-color-error, #ef4444)"},children:[A.failed," ",u("importWizard.failed","failed")]}),A.failedTracks.length>0&&r.jsxs("details",{style:{textAlign:"left",marginTop:8,fontSize:12,color:"var(--nice-text-dim, #64748b)"},children:[r.jsx("summary",{style:{cursor:"pointer"},children:u("importWizard.showFailed","Show failed tracks")}),r.jsx("ul",{style:{marginTop:4,paddingLeft:20},children:A.failedTracks.map((D,J)=>r.jsx("li",{children:D},J))})]})]}),r.jsx("button",{style:Ln,onClick:o,type:"button",children:u("importWizard.done","Done")})]}),se={connect:u("importWizard.stepConnect","Connect"),browse:u("importWizard.stepBrowse","Browse"),tracks:u("importWizard.stepTracks","Select Tracks"),options:u("importWizard.stepOptions","Options"),importing:u("importWizard.stepImporting","Importing"),done:u("importWizard.stepDone","Done")};return r.jsxs("div",{style:im,children:[H(),r.jsxs("div",{style:om,children:[r.jsxs("h2",{style:{margin:0,fontSize:18},children:[u("importWizard.title","Import Playlist")," — ",se[h]]}),S&&r.jsxs("button",{style:sr,onClick:B,type:"button",children:[r.jsx(F.NtdArrowLeft,{size:12})," ",u("importWizard.back","Back")]}),h==="connect"&&r.jsx("button",{style:sr,onClick:o,type:"button","aria-label":u("importWizard.close","Close"),title:u("importWizard.close","Close"),children:r.jsx(F.NtdClose,{size:14})})]}),L&&r.jsx("div",{style:{padding:12,borderRadius:8,background:"var(--nice-error-bg, #fef2f2)",color:"var(--nice-color-error, #ef4444)",fontSize:13},children:L}),h==="connect"&&z(),h==="browse"&&Z(),h==="tracks"&&q(),h==="options"&&X(),h==="importing"&&re(),h==="done"&&oe()]})},hm=[{id:"concert-harp",name:"Concert Harp",description:"Warm concert harp",icon:"music",dir:"concert-harp",attribution:"ConcertHarp SoundFont — source: musical-artifacts.com/artifacts/375"},{id:"celtic-harp",name:"Celtic Harp",description:"Bright celtic harp",icon:"leaf",dir:"celtic-harp"},{id:"triangle",name:"Triangle",description:"Metallic percussion triangle",icon:"triangle",dir:"triangle",attribution:"Triangle SoundFont — source: polyphone.io/en/soundfonts/unpitched-percussion/298-triangle"},{id:"synth",name:"Celesta",description:"Synthesized celesta / music-box",icon:"sparkle",dir:"synth"},{id:"none",name:"Silent",description:"No sound on click",icon:"volumeMute",dir:null}],pm="concert-harp",ns=Object.fromEntries(hm.map(e=>[e.id,e])),fm="nice2dev-note-sound-set";function Tl(){try{const e=localStorage.getItem(fm);if(e&&ns[e])return e}catch{}return pm}const Ir=["quarter","eighth","sixteenth","beamed"];function Pl(e,t,n){const a=n*.2,s=n*.15,i=Math.max(1,n*.07),o=n*.72,l=n*.34,c=new Path2D,u=h=>{c.moveTo(h+a,l),c.ellipse(h,l,a,s,-.4,0,Math.PI*2),c.rect(h+a-i,l-o,i,o)};if(t==="beamed"){const h=-n*.24,p=n*.24;u(h),u(p),c.rect(h+a-i,l-o,p-h+i,n*.12)}else{const h=-a*.5;u(h);const p=t==="eighth"?1:t==="sixteenth"?2:0,g=h+a;for(let y=0;y<p;y++){const m=l-o+y*n*.2;c.moveTo(g,m),c.quadraticCurveTo(g+n*.32,m+n*.14,g+n*.18,m+n*.42),c.quadraticCurveTo(g+n*.2,m+n*.22,g,m+n*.14),c.closePath()}}e.stroke(c),e.fill(c)}function pi(e){return getComputedStyle(document.documentElement).getPropertyValue(e).trim()}function El(e){if(!e)return null;const t=document.createElement("canvas").getContext("2d");if(!t)return null;t.fillStyle=e;const n=t.fillStyle;if(n.startsWith("#")){const s=parseInt(n.slice(1),16);return{r:s>>16&255,g:s>>8&255,b:s&255}}const a=n.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);return a?{r:+a[1],g:+a[2],b:+a[3]}:null}function aa(e,t){const n=El(e);return n?`rgba(${n.r},${n.g},${n.b},${t})`:`rgba(255,255,255,${t})`}function mm(e){const t=El(e);return t?(.299*t.r+.587*t.g+.114*t.b)/255:1}function $l(){const e=pi("--text-primary")||ke.resolveCssColor("var(--nice-overlay-light-95, rgba(255, 255, 255, 0.95))"),t=pi("--nav-active")||"goldenrod",n=document.documentElement.getAttribute("data-theme")==="dark",s=mm(e)<.45;return{base:aa(e,.92),staffLine:aa(e,.22),outline:ke.resolveCssColor(s?"var(--nice-overlay-light-75, rgba(255, 255, 255, 0.75))":"var(--nice-overlay-55, rgba(0, 0, 0, 0.55))"),accents:[aa(t,.95)],isDark:n,notesDark:s}}const Gr=typeof navigator<"u"&&/Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent),Al=46,St=5,mr=4,gm=(Al-(St-1)*mr)/2,ym=6,vm=18,bm=110,xm=50,Wr=Gr?xm:bm,Sm=Gr?4:2,km=Gr?2:4,fi=Gr?1:0,wm=180,mi=2.8,gi=40,Cm=14,yi=1.2,jm=16,sa=[64,67,71,74,77],ln=64,_n=77;function Mm(e){const t=Math.max(0,Math.min(St-1,e)),n=Math.floor(t),a=Math.min(n+1,St-1),s=t-n;return Math.round(sa[n]+(sa[a]-sa[n])*s)}function Rm(e){return(Math.max(ln-1*(_n-ln)/(St-1),Math.min(_n+1*(_n-ln)/(St-1),e))-ln)/(_n-ln)*(St-1)}const vi=2.5,bi=.72,Nm=.55,zn=new Map;let gr=null;async function Tm(e){const t=e??Tl(),n=ns[t];if(!n||!n.dir){zn.clear(),gr=t;return}if(gr===t&&zn.size>0)return;zn.clear(),gr=t;const a=qn(),s=[];for(let i=ln;i<=_n;i++)s.push(fetch(`/assets/soundfonts/notes/${n.dir}/note-${i}.mp3`).then(o=>o.arrayBuffer()).then(o=>a.decodeAudioData(o)).then(o=>{zn.set(i,o)}).catch(()=>{}));await Promise.all(s)}function xi(e){const t=zn.get(e);if(!t)return;const n=qn(),a=n.createBufferSource();a.buffer=t;const s=n.createGain();s.gain.value=.7,a.connect(s).connect(n.destination),a.start()}function Pm(e){return()=>{e|=0,e=e+1831565813|0;let t=Math.imul(e^e>>>15,1|e);return t=t+Math.imul(t^t>>>7,61|t)^t,((t^t>>>14)>>>0)/4294967296}}function Em(e){const t=Pm(42),n=[];for(let a=0;a<e;a++){const i=t()<.15?0:-1;n.push({x:t(),lineIdx:t()*(St+1)-.5,shape:Ir[Math.floor(t()*Ir.length)],rot:(t()-.5)*50,size:10+t()*4,colorIdx:i})}return n.sort((a,s)=>a.x-s.x),n}const ut=Em(Wr),Cn=new Float32Array(Wr),ir=new Float32Array(Wr),Dn=new Float32Array(Wr);let wa=!1;const $m=(St-1)/2;function Am(){if(!wa){wa=!0;for(let e=0;e<ut.length;e++)Dn[e]=ut[e].lineIdx}}let Ca=[],Si="";function Im(e){return`${e.base}|${e.outline}|${e.accents.join(",")}`}function Lm(e){const t=Im(e);t===Si&&Ca.length===ut.length||(Si=t,Ca=ut.map(n=>{const a=Math.ceil(n.size*1.6),s=a*2,i=document.createElement("canvas");i.width=s,i.height=s;const o=i.getContext("2d");return o.translate(a,a),o.rotate(n.rot*Math.PI/180),o.lineWidth=1.8,o.strokeStyle=e.outline,o.fillStyle=n.colorIdx<0?e.base:e.accents[n.colorIdx%e.accents.length],Pl(o,n.shape,n.size*1.3),{canvas:i,ox:a,oy:a}}))}function _m({pitchMidiRef:e}={}){const{t}=xe(),n=d.useRef(null),a=d.useRef(0),s=d.useRef(0),i=d.useRef(0),o=d.useRef(null),l=d.useRef(0),c=d.useRef(0),u=d.useRef(null),h=d.useRef(null),p=d.useRef(!1),g=d.useCallback((b,f,k)=>{const v=gm+b*mr,w=f/k*Math.PI*2;return v+Math.sin(w)*ym},[]),y=d.useCallback(b=>{const f=n.current;if(!f)return;if(c.current++,fi>0&&c.current%(fi+1)!==0){i.current=b,a.current=requestAnimationFrame(y);return}const k=f.getContext("2d");if(!k)return;const v=Math.min(window.devicePixelRatio||1,km),w=f.getBoundingClientRect(),R=w.width,M=w.height;(f.width!==Math.round(R*v)||f.height!==Math.round(M*v))&&(f.width=Math.round(R*v),f.height=Math.round(M*v),k.setTransform(v,0,0,v,0,0));const j=i.current?(b-i.current)/1e3:0;i.current=b,s.current=(s.current+vm*j)%R,k.clearRect(0,0,R,M),l.current++,(!o.current||l.current%60===0)&&(o.current=$l());const T=o.current;Lm(T),k.strokeStyle=T.staffLine,k.lineWidth=.7;for(let L=0;L<St;L++){k.beginPath();for(let N=0;N<=R;N+=Sm){const _=g(L,N,R);N===0?k.moveTo(N,_):k.lineTo(N,_)}k.stroke()}const P=s.current,A=(e==null?void 0:e.current)??null;if(A!==null){Am();const L=Rm(A),N=vi*j;for(let _=0;_<ut.length;_++){const Y=(ut[_].lineIdx-$m)*Nm,U=L*bi+(L+Y)*(1-bi)-Dn[_];Dn[_]+=U>0?Math.min(N,U):Math.max(-N,U)}}else if(wa){const L=vi*.4*j;for(let N=0;N<ut.length;N++){const ee=ut[N].lineIdx-Dn[N];Dn[N]+=ee>0?Math.min(L,ee):Math.max(-L,ee)}}const I=u.current;I&&(I.timer-=j,I.timer<=0&&(u.current=null));for(let L=0;L<ut.length;L++){const N=ut[L];if(ir[L]>0){ir[L]-=j;const Y=Math.max(0,ir[L]/mi);Cn[L]+=wm*Y*j,Cn[L]>R&&(Cn[L]-=R)}const _=Ca[L];if(!_)continue;const ee=N.lineIdx;for(let Y=0;Y<2;Y++){let U=((N.x*R-P-Cn[L]+Y*R)%R+R)%R;const V=g(Math.max(0,Math.min(St-1,Math.round(ee))),U,R),K=(ee-Math.round(ee))*mr;let G=V+K;if(I&&I.timer>0){const W=U-I.x,C=G-I.y,$=Math.sqrt(W*W+C*C);if($<gi&&$>.1){const S=I.timer/yi,B=Cm*(1-$/gi)*S;U+=W/$*B,G+=C/$*B}}k.drawImage(_.canvas,U-_.ox,G-_.oy)}}a.current=requestAnimationFrame(y)},[g,e]),m=d.useCallback(b=>{const f=n.current;if(!f)return;const k=f.getBoundingClientRect(),v=b.clientX-k.left,w=b.clientY-k.top,R=k.width,M=s.current;let j=1/0,T=-1;for(let P=0;P<ut.length;P++){const A=ut[P],L=((A.x*R-M-Cn[P])%R+R)%R,N=g(Math.max(0,Math.min(St-1,Math.round(A.lineIdx))),L,R),_=(A.lineIdx-Math.round(A.lineIdx))*mr,ee=N+_,Y=L-v,O=ee-w,U=Y*Y+O*O;U<j&&(j=U,T=P)}if(T>=0&&Math.sqrt(j)<jm){ir[T]=mi;const P=ut[T],A=Mm(P.lineIdx);try{Yt();const I=Tl(),L=ns[I];L!=null&&L.dir&&(gr!==I||!p.current?(p.current=!0,Tm(I).then(()=>xi(A))):xi(A))}catch{}}u.current={x:v,y:w,timer:yi}},[g]),x=d.useCallback(b=>{const f=n.current;if(!f)return;const k=f.getBoundingClientRect(),v=b.clientX-k.left,w=b.clientY-k.top;h.current={x:v,y:w},u.current&&u.current.timer>0&&(u.current.x=v,u.current.y=w)},[]);return d.useEffect(()=>(a.current=requestAnimationFrame(y),()=>cancelAnimationFrame(a.current)),[y]),r.jsx("canvas",{ref:n,"aria-hidden":"true",role:"img","aria-label":t("noteRiver.noteRiverAnimationCanvas","Note river animation canvas"),onClick:m,onMouseMove:x,style:{display:"block",width:"100%",height:Al,marginBottom:5,cursor:"pointer",background:"transparent"}})}const zm=14,Dm=.9,Fm=320,Om=160,Bm=6,ki=8,Gm=14;function Wm(){const{t:e}=xe(),t=d.useRef(null),n=d.useRef([]),a=d.useRef(0),s=d.useRef(0),i=d.useRef([]),o=d.useRef(null),l=d.useRef(0),c=d.useCallback((h,p)=>{for(let g=0;g<zm;g++){const y=Math.random()*Math.PI*2,m=Om*(.4+Math.random()*.6),x=Dm*(.6+Math.random()*.4),b=Math.random()<.15?0:-1;n.current.push({x:h,y:p,vx:Math.cos(y)*m,vy:Math.sin(y)*m-60,rot:Math.random()*Math.PI*2,vr:(Math.random()-.5)*Bm*2,size:ki+Math.random()*(Gm-ki),shape:Ir[Math.floor(Math.random()*Ir.length)],life:x,maxLife:x,colorIdx:b})}},[]),u=d.useCallback(h=>{const p=t.current;if(!p){a.current=requestAnimationFrame(u);return}const g=p.getContext("2d");if(!g){a.current=requestAnimationFrame(u);return}const y=window.devicePixelRatio||1,m=window.innerWidth,x=window.innerHeight;(p.width!==Math.round(m*y)||p.height!==Math.round(x*y))&&(p.width=Math.round(m*y),p.height=Math.round(x*y),p.style.width=`${m}px`,p.style.height=`${x}px`,g.setTransform(y,0,0,y,0,0));const b=s.current?Math.min((h-s.current)/1e3,.05):0;s.current=h,g.clearRect(0,0,m,x),l.current++,(!o.current||l.current%60===0)&&(o.current=$l());const f=o.current;if(navigator.getGamepads){const v=navigator.getGamepads();for(let w=0;w<v.length;w++){const R=v[w];if(R)for(let M=0;M<R.buttons.length;M++){const j=w*100+M,T=R.buttons[M].pressed;T&&!i.current[j]&&c(m/2,x/2),i.current[j]=T}}}const k=[];for(const v of n.current){if(v.life-=b,v.life<=0)continue;v.vy+=Fm*b,v.x+=v.vx*b,v.y+=v.vy*b,v.rot+=v.vr*b;const w=Math.max(0,v.life/v.maxLife),R=.5+.5*w;g.save(),g.globalAlpha=w,g.translate(v.x,v.y),g.rotate(v.rot),g.lineWidth=1.4,g.strokeStyle=f.notesDark?`rgba(255,255,255,${w*.8})`:`rgba(0,0,0,${w*.55})`;const M=v.colorIdx<0?f.base:f.accents[v.colorIdx%f.accents.length];g.fillStyle=M.replace(/[\d.]+\)$/,`${w})`),Pl(g,v.shape,v.size*R*1.3),g.restore(),k.push(v)}n.current=k,a.current=requestAnimationFrame(u)},[c]);return d.useEffect(()=>{const h=g=>{c(g.clientX,g.clientY)},p=g=>{if(g.key!=="Enter")return;const y=document.activeElement;if(y){const m=y.getBoundingClientRect();c(m.left+m.width/2,m.top+m.height/2)}else c(window.innerWidth/2,window.innerHeight/2)};return window.addEventListener("click",h,!0),window.addEventListener("keydown",p,!0),a.current=requestAnimationFrame(u),()=>{window.removeEventListener("click",h,!0),window.removeEventListener("keydown",p,!0),cancelAnimationFrame(a.current)}},[u,c]),r.jsx("canvas",{ref:t,"aria-hidden":"true",role:"img","aria-label":e("noteParticles.noteParticlesAnimationCanvas","Note particles animation canvas"),style:{position:"fixed",inset:0,zIndex:99999,pointerEvents:"none"}})}const yr={type:"gain",enabled:!0,mix:1,gain:0},Fn={type:"compressor",enabled:!0,mix:1,threshold:-24,ratio:4,attack:10,release:100,knee:6,makeupGain:0},On={type:"reverb",enabled:!0,mix:.3,decay:2,preDelay:10,damping:.5,roomSize:.5},Bn={type:"delay",enabled:!0,mix:.3,time:250,feedback:.4,pingPong:!1,highCut:8e3},vr={type:"chorus",enabled:!0,mix:.5,rate:1.5,depth:.5,delay:7,voices:3},br={type:"eq",enabled:!0,mix:1,bands:[{frequency:60,gain:0,q:1,type:"lowshelf"},{frequency:250,gain:0,q:1,type:"peaking"},{frequency:1e3,gain:0,q:1,type:"peaking"},{frequency:4e3,gain:0,q:1,type:"peaking"},{frequency:12e3,gain:0,q:1,type:"highshelf"}]},xr={type:"filter",enabled:!0,mix:1,filterType:"lowpass",frequency:1e3,q:1,gain:0},Sr={type:"distortion",enabled:!0,mix:.5,drive:.5,tone:.5,curve:"soft"},kr={type:"tremolo",enabled:!0,mix:1,rate:5,depth:.5,waveform:"sine"},wr={type:"phaser",enabled:!0,mix:.5,rate:.5,depth:.5,feedback:.5,stages:4,frequency:1e3},Vm=(function(){return{gain:{unity:{...yr,gain:0},boost:{...yr,gain:6},cut:{...yr,gain:-6}},compressor:{gentle:{...Fn,threshold:-20,ratio:2,attack:30,release:200},moderate:{...Fn,threshold:-24,ratio:4,attack:10,release:100},aggressive:{...Fn,threshold:-30,ratio:8,attack:1,release:50},limiter:{...Fn,threshold:-3,ratio:20,attack:.1,release:100}},reverb:{small_room:{...On,decay:.5,roomSize:.2,damping:.7},large_hall:{...On,decay:3,roomSize:.8,damping:.3},plate:{...On,decay:1.5,roomSize:.5,damping:.4},cathedral:{...On,decay:5,roomSize:.9,damping:.2,mix:.4}},delay:{slapback:{...Bn,time:80,feedback:.1,mix:.3},quarter_note:{...Bn,time:500,feedback:.4,mix:.3},dotted_eighth:{...Bn,time:375,feedback:.5,mix:.3},long_ambient:{...Bn,time:750,feedback:.6,highCut:3e3,mix:.4}},chorus:{subtle:{...vr,rate:.5,depth:.2,voices:2,mix:.3},vintage:{...vr,rate:1,depth:.4,voices:2,delay:10,mix:.4},ensemble:{...vr,rate:2,depth:.6,voices:4,mix:.5}},eq:{vocal_presence:{...br,bands:[{frequency:80,gain:-3,q:1,type:"highpass"},{frequency:250,gain:-2,q:1,type:"peaking"},{frequency:3e3,gain:3,q:1.5,type:"peaking"},{frequency:8e3,gain:2,q:1,type:"highshelf"}]},bass_boost:{...br,bands:[{frequency:60,gain:6,q:1,type:"lowshelf"},{frequency:200,gain:2,q:1,type:"peaking"}]},brightness:{...br,bands:[{frequency:4e3,gain:3,q:1,type:"peaking"},{frequency:1e4,gain:4,q:1,type:"highshelf"}]}},filter:{low_pass_warm:{...xr,filterType:"lowpass",frequency:2e3,q:.7},high_pass_clean:{...xr,filterType:"highpass",frequency:100,q:.7},telephone:{...xr,filterType:"bandpass",frequency:1500,q:2}},distortion:{overdrive:{...Sr,drive:.3,tone:.6,curve:"soft",mix:.7},crunch:{...Sr,drive:.5,tone:.5,curve:"tube",mix:.8},fuzz:{...Sr,drive:.8,tone:.4,curve:"fuzz",mix:1}},tremolo:{slow:{...kr,rate:3,depth:.4,waveform:"sine"},fast:{...kr,rate:8,depth:.6,waveform:"sine"},choppy:{...kr,rate:6,depth:.9,waveform:"square"}},phaser:{subtle:{...wr,rate:.3,depth:.3,feedback:.3,stages:4},jet:{...wr,rate:.1,depth:.8,feedback:.7,stages:8},rotary:{...wr,rate:1,depth:.5,feedback:.4,stages:6}}}})();function wi(e){return Math.pow(10,e/20)}function Um(e,t,n,a){const s=e.sampleRate,i=Math.floor(s*t),o=e.createBuffer(2,i,s);for(let l=0;l<2;l++){const c=o.getChannelData(l);for(let u=0;u<i;u++){const h=u/s,p=Math.exp(-h/n),g=1-a*(u/i);c[u]=(Math.random()*2-1)*p*g}}return o}function qm(e,t){const a=new Float32Array(44100),s=Math.PI/180;for(let i=0;i<44100;i++){const o=i*2/44100-1;switch(t){case"soft":a[i]=(3+e*10)*o*20*s/(Math.PI+e*10*Math.abs(o));break;case"hard":a[i]=Math.tanh(o*(1+e*5));break;case"fuzz":a[i]=Math.sign(o)*Math.pow(Math.abs(o),1/(1+e*3));break;case"tube":o>=0?a[i]=1-Math.pow(1-o,1+e*2):a[i]=-(1-Math.pow(1+o,1+e*2));break}}return a}class Hm{constructor(t){this.effects=[],this.bypass=!1,this.audioContext=t,this.inputNode=t.createGain(),this.outputNode=t.createGain(),this.inputNode.connect(this.outputNode)}get input(){return this.inputNode}get output(){return this.outputNode}addEffect(t,n){const a=`effect_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,s=this.createEffectInstance(a,t);return n!==void 0&&n>=0&&n<this.effects.length?this.effects.splice(n,0,s):this.effects.push(s),this.reconnectChain(),a}removeEffect(t){const n=this.effects.findIndex(s=>s.id===t);if(n===-1)return!1;const a=this.effects[n];for(const s of a.nodes)s.disconnect();return this.effects.splice(n,1),this.reconnectChain(),!0}updateEffect(t,n){const a=this.effects.find(l=>l.id===t);if(!a)return!1;const s={...a.params,...n},i=this.effects.indexOf(a);for(const l of a.nodes)l.disconnect();const o=this.createEffectInstance(t,s);return this.effects[i]=o,this.reconnectChain(),!0}reorderEffects(t,n){if(t<0||t>=this.effects.length||n<0||n>=this.effects.length)return!1;const[a]=this.effects.splice(t,1);return this.effects.splice(n,0,a),this.reconnectChain(),!0}setBypass(t){this.bypass=t,this.reconnectChain()}getEffects(){return[...this.effects]}clear(){for(const t of this.effects)for(const n of t.nodes)n.disconnect();this.effects=[],this.reconnectChain()}createEffectInstance(t,n){const{audioContext:a}=this,s=[];let i,o;switch(n.type){case"gain":{const l=a.createGain();l.gain.value=wi(n.gain),s.push(l),i=o=l;break}case"compressor":{const l=a.createDynamicsCompressor();l.threshold.value=n.threshold,l.ratio.value=n.ratio,l.attack.value=n.attack/1e3,l.release.value=n.release/1e3,l.knee.value=n.knee;const c=a.createGain();c.gain.value=wi(n.makeupGain),l.connect(c),s.push(l,c),i=l,o=c;break}case"reverb":{const l=a.createConvolver();l.buffer=Um(a,n.decay,n.decay,n.damping);const c=a.createGain(),u=a.createGain(),h=a.createGain(),p=a.createGain();c.gain.value=n.mix,u.gain.value=1-n.mix,h.connect(l),h.connect(u),l.connect(c),c.connect(p),u.connect(p),s.push(h,l,c,u,p),i=h,o=p;break}case"delay":{const l=a.createDelay(5);l.delayTime.value=n.time/1e3;const c=a.createGain();c.gain.value=n.feedback;const u=a.createBiquadFilter();u.type="lowpass",u.frequency.value=n.highCut;const h=a.createGain(),p=a.createGain(),g=a.createGain(),y=a.createGain();h.gain.value=n.mix,p.gain.value=1-n.mix,g.connect(l),g.connect(p),l.connect(u),u.connect(c),c.connect(l),u.connect(h),h.connect(y),p.connect(y),s.push(g,l,u,c,h,p,y),i=g,o=y;break}case"eq":{const l=[];let c=null;for(const u of n.bands){const h=a.createBiquadFilter();h.type=u.type,h.frequency.value=u.frequency,h.Q.value=u.q,h.gain.value=u.gain,c&&c.connect(h),c=h,l.push(h)}s.push(...l),i=l[0]||a.createGain(),o=l[l.length-1]||i;break}case"filter":{const l=a.createBiquadFilter();l.type=n.filterType,l.frequency.value=n.frequency,l.Q.value=n.q,l.gain.value=n.gain,s.push(l),i=o=l;break}case"distortion":{const l=a.createWaveShaper();l.curve=qm(n.drive,n.curve),l.oversample="4x";const c=a.createBiquadFilter();c.type="lowpass",c.frequency.value=1e3+n.tone*1e4;const u=a.createGain(),h=a.createGain(),p=a.createGain(),g=a.createGain();u.gain.value=n.mix,h.gain.value=1-n.mix,p.connect(l),p.connect(h),l.connect(c),c.connect(u),u.connect(g),h.connect(g),s.push(p,l,c,u,h,g),i=p,o=g;break}case"tremolo":{const l=a.createOscillator();l.type=n.waveform,l.frequency.value=n.rate;const c=a.createGain();c.gain.value=n.depth*.5;const u=a.createGain();u.gain.value=1-n.depth*.5,l.connect(c),c.connect(u.gain),l.start(),s.push(l,c,u),i=o=u;break}case"phaser":{const l=[],c=a.createOscillator();c.type="sine",c.frequency.value=n.rate;const u=a.createGain();u.gain.value=n.depth*n.frequency;let h=null;for(let x=0;x<n.stages;x++){const b=a.createBiquadFilter();b.type="allpass",b.frequency.value=n.frequency,b.Q.value=.5,c.connect(u),u.connect(b.frequency),h&&h.connect(b),h=b,l.push(b)}const p=a.createGain(),g=a.createGain(),y=a.createGain(),m=a.createGain();p.gain.value=n.mix,g.gain.value=1-n.mix,y.connect(l[0]),y.connect(g),l[l.length-1].connect(p),p.connect(m),g.connect(m),c.start(),s.push(c,u,...l,p,g,y,m),i=y,o=m;break}default:throw new Error(`Unknown effect type: ${n.type}`)}return{id:t,params:n,nodes:s,input:i,output:o}}reconnectChain(){this.inputNode.disconnect();for(const n of this.effects)n.output.disconnect();if(this.bypass||this.effects.length===0){this.inputNode.connect(this.outputNode);return}let t=this.inputNode;for(const n of this.effects)n.params.enabled&&(t.connect(n.input),t=n.output);t.connect(this.outputNode)}dispose(){this.clear(),this.inputNode.disconnect(),this.outputNode.disconnect()}}const Il={gain:r.jsx(F.NtdVolume,{size:16}),compressor:r.jsx(F.NtdSettings,{size:16}),reverb:r.jsx(F.NtdMountain,{size:16}),delay:r.jsx(F.NtdStopwatch,{size:16}),chorus:r.jsx(F.NtdSparkle,{size:16}),eq:r.jsx(F.NtdBarChart,{size:16}),filter:r.jsx(F.NtdFilter,{size:16}),distortion:r.jsx(F.NtdLightning,{size:16}),tremolo:r.jsx(F.NtdWave,{size:16}),phaser:r.jsx(F.NtdMagicWand,{size:16})},Ll={gain:"Gain",compressor:"Compressor",reverb:"Reverb",delay:"Delay",chorus:"Chorus",eq:"EQ",filter:"Filter",distortion:"Distortion",tremolo:"Tremolo",phaser:"Phaser"},Km={gain:yr,compressor:Fn,reverb:On,delay:Bn,chorus:vr,eq:br,filter:xr,distortion:Sr,tremolo:kr,phaser:wr},Ym=["gain","compressor","reverb","delay","chorus","eq","filter","distortion","tremolo","phaser"],Fe=({value:e,min:t,max:n,step:a=1,label:s,unit:i="",onChange:o,disabled:l})=>{const c=d.useRef(null),[u,h]=d.useState(!1),p=d.useRef(0),g=d.useRef(e),y=d.useCallback(x=>{l||(x.preventDefault(),h(!0),p.current=x.clientY,g.current=e)},[l,e]);d.useEffect(()=>{if(!u)return;const x=f=>{const k=p.current-f.clientY,v=n-t,R=k/200*v,M=Math.min(n,Math.max(t,g.current+R));o(a<1?M:Math.round(M/a)*a)},b=()=>{h(!1)};return document.addEventListener("mousemove",x),document.addEventListener("mouseup",b),()=>{document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",b)}},[u,t,n,a,o]);const m=(e-t)/(n-t)*270-135;return r.jsxs("div",{className:`nice-fx-knob ${l?"nice-fx-knob--disabled":""}`,ref:c,children:[r.jsx("div",{className:`nice-fx-knob__dial ${u?"nice-fx-knob__dial--active":""}`,onMouseDown:y,style:{transform:`rotate(${m}deg)`},children:r.jsx("div",{className:"nice-fx-knob__indicator"})}),r.jsx("div",{className:"nice-fx-knob__label",children:s}),r.jsxs("div",{className:"nice-fx-knob__value",children:[typeof e=="number"&&a<1?e.toFixed(2):e,i]})]})};function Zm({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsx(Fe,{value:e.gain,min:-60,max:12,step:.1,label:u("audioEffectsRack.gain","Gain"),unit:"dB",onChange:h=>t({...e,gain:h}),disabled:!e.enabled})})}function Xm({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsxs("div",{className:"nice-fx-card__controls",children:[r.jsx(Fe,{value:e.threshold,min:-60,max:0,label:u("audioEffectsRack.threshold","Threshold"),unit:"dB",onChange:h=>t({...e,threshold:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.ratio,min:1,max:20,label:u("audioEffectsRack.ratio","Ratio"),onChange:h=>t({...e,ratio:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.attack,min:.1,max:200,label:u("audioEffectsRack.attack","Attack"),unit:"ms",onChange:h=>t({...e,attack:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.release,min:10,max:1e3,label:u("audioEffectsRack.release","Release"),unit:"ms",onChange:h=>t({...e,release:h}),disabled:!e.enabled}),!c&&r.jsxs(r.Fragment,{children:[r.jsx(Fe,{value:e.knee,min:0,max:40,label:u("audioEffectsRack.knee","Knee"),unit:"dB",onChange:h=>t({...e,knee:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.makeupGain,min:0,max:24,label:u("audioEffectsRack.makeup","Makeup"),unit:"dB",onChange:h=>t({...e,makeupGain:h}),disabled:!e.enabled})]})]})})}function Qm({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsxs("div",{className:"nice-fx-card__controls",children:[r.jsx(Fe,{value:e.decay,min:.1,max:10,step:.1,label:u("audioEffectsRack.decay","Decay"),unit:"s",onChange:h=>t({...e,decay:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.damping,min:0,max:1,step:.01,label:u("audioEffectsRack.damping","Damping"),onChange:h=>t({...e,damping:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.roomSize,min:0,max:1,step:.01,label:u("audioEffectsRack.room","Room"),onChange:h=>t({...e,roomSize:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:u("audioEffectsRack.mix","Mix"),onChange:h=>t({...e,mix:h}),disabled:!e.enabled})]})})}function Jm({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsxs("div",{className:"nice-fx-card__controls",children:[r.jsx(Fe,{value:e.time,min:0,max:2e3,label:u("audioEffectsRack.time","Time"),unit:"ms",onChange:h=>t({...e,time:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.feedback,min:0,max:1,step:.01,label:u("audioEffectsRack.feedback","Feedback"),onChange:h=>t({...e,feedback:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.highCut,min:200,max:2e4,label:u("audioEffectsRack.hicut","HiCut"),unit:"Hz",onChange:h=>t({...e,highCut:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:u("audioEffectsRack.mix","Mix"),onChange:h=>t({...e,mix:h}),disabled:!e.enabled})]})})}function e0({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsxs("div",{className:"nice-fx-card__controls",children:[r.jsx(Fe,{value:e.drive,min:0,max:1,step:.01,label:u("audioEffectsRack.drive","Drive"),onChange:h=>t({...e,drive:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.tone,min:0,max:1,step:.01,label:u("audioEffectsRack.tone","Tone"),onChange:h=>t({...e,tone:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:u("audioEffectsRack.mix","Mix"),onChange:h=>t({...e,mix:h}),disabled:!e.enabled})]})})}function kt({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:u}){const{t:h}=xe(),[p,g]=d.useState(!1);return r.jsxs("div",{className:`nice-fx-card ${e.enabled?"":"nice-fx-card--disabled"} ${i?"nice-fx-card--drop-target":""} ${c?"nice-fx-card--compact":""}`,draggable:!0,onDragStart:a,onDragEnd:s,children:[r.jsxs("div",{className:"nice-fx-card__header",children:[r.jsx("span",{className:"nice-fx-card__icon",children:Il[e.type]}),r.jsx("span",{className:"nice-fx-card__title",children:Ll[e.type]}),r.jsx("button",{type:"button",className:`nice-fx-card__toggle ${e.enabled?"nice-fx-card__toggle--active":""}`,onClick:()=>t({...e,enabled:!e.enabled}),title:e.enabled?h("audioEffectsRack.disable","Disable"):h("audioEffectsRack.enable","Enable"),"aria-pressed":e.enabled,children:r.jsx("span",{className:"nice-fx-card__toggle-dot","aria-hidden":"true"})}),l&&Object.keys(o).length>0&&r.jsxs("div",{className:"nice-fx-card__presets",children:[r.jsx("button",{type:"button",className:"nice-fx-card__preset-btn",onClick:()=>g(!p),"aria-label":h("audioEffectsRack.presets","Presets"),children:r.jsx(F.NtdChevronDown,{size:12})}),p&&r.jsx("div",{className:"nice-fx-card__preset-menu",children:Object.entries(o).map(([y,m])=>r.jsx("button",{type:"button",className:"nice-fx-card__preset-item",onClick:()=>{t({...m,enabled:e.enabled}),g(!1)},children:y.replace(/_/g," ")},y))})]}),r.jsx("button",{type:"button",className:"nice-fx-card__remove",onClick:n,title:h("audioEffectsRack.remove","Remove"),children:r.jsx(ke.NiceIcon,{name:"close",size:14})})]}),r.jsx("div",{className:"nice-fx-card__body",children:u})]})}function t0({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsx("div",{className:"nice-fx-card__generic",children:r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:u("audioEffectsRack.mix","Mix"),onChange:h=>t({...e,mix:h}),disabled:!e.enabled})})})}function n0({effect:e,onChange:t,...n}){const{t:a}=xe(),s=e.params||{},i=(o,l)=>t({...e,params:{...s,[o]:l}});return r.jsx(kt,{effect:e,onChange:t,...n,children:r.jsxs("div",{className:"nice-fx-card__row",children:[r.jsx(Fe,{value:s.rate??1.5,min:.1,max:10,step:.1,label:a("audioEffectsRack.rate","Rate"),onChange:o=>i("rate",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.depth??.5,min:0,max:1,step:.01,label:a("audioEffectsRack.depth","Depth"),onChange:o=>i("depth",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.feedback??.3,min:0,max:.95,step:.01,label:a("audioEffectsRack.feedback","Feedback"),onChange:o=>i("feedback",o),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:a("audioEffectsRack.mix","Mix"),onChange:o=>t({...e,mix:o}),disabled:!e.enabled})]})})}function r0({effect:e,onChange:t,...n}){const{t:a}=xe(),s=e.params||{},i=(o,l)=>t({...e,params:{...s,[o]:l}});return r.jsx(kt,{effect:e,onChange:t,...n,children:r.jsxs("div",{className:"nice-fx-card__row",children:[r.jsx(Fe,{value:s.low??0,min:-12,max:12,step:.5,label:a("audioEffectsRack.low","Low"),onChange:o=>i("low",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.mid??0,min:-12,max:12,step:.5,label:a("audioEffectsRack.mid","Mid"),onChange:o=>i("mid",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.high??0,min:-12,max:12,step:.5,label:a("audioEffectsRack.high","High"),onChange:o=>i("high",o),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:a("audioEffectsRack.mix","Mix"),onChange:o=>t({...e,mix:o}),disabled:!e.enabled})]})})}function a0({effect:e,onChange:t,...n}){const{t:a}=xe(),s=e.params||{},i=(o,l)=>t({...e,params:{...s,[o]:l}});return r.jsx(kt,{effect:e,onChange:t,...n,children:r.jsxs("div",{className:"nice-fx-card__row",children:[r.jsx(Fe,{value:s.frequency??1e3,min:20,max:2e4,step:1,label:a("audioEffectsRack.freq","Freq"),onChange:o=>i("frequency",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.Q??1,min:.1,max:20,step:.1,label:"Q",onChange:o=>i("Q",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.gain??0,min:-24,max:24,step:.5,label:a("audioEffectsRack.gain","Gain"),onChange:o=>i("gain",o),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:a("audioEffectsRack.mix","Mix"),onChange:o=>t({...e,mix:o}),disabled:!e.enabled})]})})}function s0({effect:e,onChange:t,...n}){const{t:a}=xe(),s=e.params||{},i=(o,l)=>t({...e,params:{...s,[o]:l}});return r.jsx(kt,{effect:e,onChange:t,...n,children:r.jsxs("div",{className:"nice-fx-card__row",children:[r.jsx(Fe,{value:s.rate??5,min:.1,max:20,step:.1,label:a("audioEffectsRack.rate","Rate"),onChange:o=>i("rate",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.depth??.5,min:0,max:1,step:.01,label:a("audioEffectsRack.depth","Depth"),onChange:o=>i("depth",o),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:a("audioEffectsRack.mix","Mix"),onChange:o=>t({...e,mix:o}),disabled:!e.enabled})]})})}function i0({effect:e,onChange:t,...n}){const{t:a}=xe(),s=e.params||{},i=(o,l)=>t({...e,params:{...s,[o]:l}});return r.jsx(kt,{effect:e,onChange:t,...n,children:r.jsxs("div",{className:"nice-fx-card__row",children:[r.jsx(Fe,{value:s.rate??.5,min:.01,max:8,step:.01,label:a("audioEffectsRack.rate","Rate"),onChange:o=>i("rate",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.depth??.7,min:0,max:1,step:.01,label:a("audioEffectsRack.depth","Depth"),onChange:o=>i("depth",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.feedback??.5,min:0,max:.95,step:.01,label:a("audioEffectsRack.feedback","Feedback"),onChange:o=>i("feedback",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.stages??4,min:2,max:12,step:2,label:a("audioEffectsRack.stages","Stages"),onChange:o=>i("stages",o),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:a("audioEffectsRack.mix","Mix"),onChange:o=>t({...e,mix:o}),disabled:!e.enabled})]})})}const o0=({audioContext:e,chain:t,effects:n,onChange:a,onChainUpdate:s,maxEffects:i=10,availableEffects:o=Ym,showPresets:l=!0,compact:c=!1,className:u=""})=>{const{t:h}=xe(),[p,g]=d.useState((n==null?void 0:n.map(P=>P.params))||[]),[y,m]=d.useState({isDragging:!1,dragIndex:-1,dropIndex:-1}),[x,b]=d.useState(!1),f=d.useMemo(()=>t||(e?new Hm(e):null),[e,t]),k=d.useCallback((P,A)=>{const I=[...p];I[P]=A,g(I),a==null||a(I),f&&(s==null||s(f))},[p,a,f,s]),v=d.useCallback(P=>{if(p.length>=i)return;const A={...Km[P]},I=[...p,A];g(I),a==null||a(I),b(!1)},[p,i,a]),w=d.useCallback(P=>{const A=p.filter((I,L)=>L!==P);g(A),a==null||a(A)},[p,a]),R=d.useCallback(P=>{m({isDragging:!0,dragIndex:P,dropIndex:-1})},[]),M=d.useCallback(()=>{if(y.dragIndex!==-1&&y.dropIndex!==-1&&y.dragIndex!==y.dropIndex){const P=[...p],[A]=P.splice(y.dragIndex,1);P.splice(y.dropIndex,0,A),g(P),a==null||a(P)}m({isDragging:!1,dragIndex:-1,dropIndex:-1})},[y,p,a]),j=d.useCallback((P,A)=>{P.preventDefault(),y.isDragging&&m(I=>({...I,dropIndex:A}))},[y.isDragging]),T=(P,A)=>{const I={onRemove:()=>w(A),onDragStart:()=>R(A),onDragEnd:M,isDragTarget:y.dropIndex===A,presets:Vm[P.type]||{},showPresets:l,compact:c};switch(P.type){case"gain":return r.jsx(Zm,{effect:P,onChange:L=>k(A,L),...I},A);case"compressor":return r.jsx(Xm,{effect:P,onChange:L=>k(A,L),...I},A);case"reverb":return r.jsx(Qm,{effect:P,onChange:L=>k(A,L),...I},A);case"delay":return r.jsx(Jm,{effect:P,onChange:L=>k(A,L),...I},A);case"distortion":return r.jsx(e0,{effect:P,onChange:L=>k(A,L),...I},A);case"chorus":return r.jsx(n0,{effect:P,onChange:L=>k(A,L),...I},A);case"eq":return r.jsx(r0,{effect:P,onChange:L=>k(A,L),...I},A);case"filter":return r.jsx(a0,{effect:P,onChange:L=>k(A,L),...I},A);case"tremolo":return r.jsx(s0,{effect:P,onChange:L=>k(A,L),...I},A);case"phaser":return r.jsx(i0,{effect:P,onChange:L=>k(A,L),...I},A);default:return r.jsx(t0,{effect:P,onChange:L=>k(A,L),...I},A)}};return r.jsxs("div",{className:`nice-fx-rack ${c?"nice-fx-rack--compact":""} ${u}`,children:[r.jsxs("div",{className:"nice-fx-rack__header",children:[r.jsx("h3",{className:"nice-fx-rack__title",children:h("audioEffectsRack.effectsChain","Effects Chain")}),r.jsxs("span",{className:"nice-fx-rack__count",children:[p.length,"/",i]})]}),r.jsx("div",{className:"nice-fx-rack__chain",children:p.length===0?r.jsx("div",{className:"nice-fx-rack__empty",children:h("audioEffectsRack.noEffectsClickToAdd","No effects. Click + to add.")}):p.map((P,A)=>r.jsxs("div",{className:"nice-fx-rack__slot",onDragOver:I=>j(I,A),children:[T(P,A),A<p.length-1&&r.jsx("div",{className:"nice-fx-rack__connector","aria-hidden":"true",children:r.jsx(F.NtdArrowRight,{size:14})})]},A))}),p.length<i&&r.jsxs("div",{className:"nice-fx-rack__add",children:[r.jsx("button",{type:"button",className:"nice-fx-rack__add-btn",onClick:()=>b(!x),children:h("audioEffectsRack.addEffect","+ Add Effect")}),x&&r.jsx("div",{className:"nice-fx-rack__add-menu",children:o.map(P=>r.jsxs("button",{type:"button",className:"nice-fx-rack__add-item",onClick:()=>v(P),children:[r.jsx("span",{className:"nice-fx-rack__add-icon",children:Il[P]}),r.jsx("span",{className:"nice-fx-rack__add-label",children:Ll[P]})]},P))})]})]})},_l=[{type:"chipmunk",enabled:!1,intensity:60,label:"Chipmunk",icon:"sparkle"},{type:"helium",enabled:!1,intensity:80,label:"Helium",icon:"sparkle"},{type:"deep",enabled:!1,intensity:50,label:"Deep Voice",icon:"music"},{type:"demon",enabled:!1,intensity:70,label:"Demon",icon:"skull"},{type:"robot",enabled:!1,intensity:50,label:"Robot",icon:"robot"},{type:"alien",enabled:!1,intensity:60,label:"Alien",icon:"ghost"},{type:"echo",enabled:!1,intensity:50,label:"Echo",icon:"mountain"},{type:"cave",enabled:!1,intensity:60,label:"Cave",icon:"mountain"},{type:"reverb",enabled:!1,intensity:50,label:"Reverb",icon:"wave"},{type:"chorus",enabled:!1,intensity:50,label:"Chorus",icon:"music"},{type:"flanger",enabled:!1,intensity:50,label:"Flanger",icon:"wave"},{type:"distortion",enabled:!1,intensity:40,label:"Distortion",icon:"lightning"},{type:"telephone",enabled:!1,intensity:80,label:"Telephone",icon:"phone"},{type:"megaphone",enabled:!1,intensity:60,label:"Megaphone",icon:"megaphone"},{type:"radio",enabled:!1,intensity:70,label:"AM Radio",icon:"wave"},{type:"underwater",enabled:!1,intensity:50,label:"Underwater",icon:"wave"},{type:"whisper",enabled:!1,intensity:60,label:"Whisper",icon:"volume-mute"},{type:"tremolo",enabled:!1,intensity:50,label:"Tremolo",icon:"wave"},{type:"autotune",enabled:!1,intensity:60,label:"Auto-Tune",icon:"microphone"},{type:"vocoder",enabled:!1,intensity:50,label:"Vocoder",icon:"volume"}];function Ci(e,t,n){const a=e.sampleRate,s=Math.round(a*t),i=e.createBuffer(2,s,a);for(let o=0;o<2;o++){const l=i.getChannelData(o);for(let c=0;c<s;c++)l[c]=(Math.random()*2-1)*Math.pow(1-c/s,n)}return i}function or(e){const t=Math.max(1,e),n=44100,a=new Float32Array(n),s=Math.PI/180;for(let i=0;i<n;i++){const o=i*2/n-1;a[i]=(3+t)*o*20*s/(Math.PI+t*Math.abs(o))}return a}class zl{constructor(){this.audioCtx=null,this.mediaStream=null,this.sourceNode=null,this.inputGain=null,this.outputGain=null,this.activeEffects=new Map,this.effectOrder=[],this.monitoring=!0,this._volume=1,this._inputVolume=1,this.started=!1,this.externalStream=!1,this.analyser=null}get isStarted(){return this.started}get context(){return this.audioCtx}get activeEffectTypes(){return[...this.effectOrder]}async start(t){this.started||(this.audioCtx=new AudioContext,this.mediaStream=await navigator.mediaDevices.getUserMedia({audio:{deviceId:t||void 0,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}}),this.sourceNode=this.audioCtx.createMediaStreamSource(this.mediaStream),this.inputGain=this.audioCtx.createGain(),this.inputGain.gain.value=this._inputVolume,this.sourceNode.connect(this.inputGain),this.outputGain=this.audioCtx.createGain(),this.outputGain.gain.value=this.monitoring?this._volume:0,this.analyser=this.audioCtx.createAnalyser(),this.analyser.fftSize=2048,this.inputGain.connect(this.outputGain),this.outputGain.connect(this.analyser),this.analyser.connect(this.audioCtx.destination),this.started=!0)}async startWithStream(t){this.started||(this.externalStream=!0,this.audioCtx=new AudioContext,this.mediaStream=t,this.sourceNode=this.audioCtx.createMediaStreamSource(t),this.inputGain=this.audioCtx.createGain(),this.inputGain.gain.value=this._inputVolume,this.sourceNode.connect(this.inputGain),this.outputGain=this.audioCtx.createGain(),this.outputGain.gain.value=this.monitoring?this._volume:0,this.analyser=this.audioCtx.createAnalyser(),this.analyser.fftSize=2048,this.inputGain.connect(this.outputGain),this.outputGain.connect(this.analyser),this.analyser.connect(this.audioCtx.destination),this.started=!0)}stop(){var t,n,a,s,i,o;this.clearAllEffects();try{(t=this.analyser)==null||t.disconnect()}catch{}try{(n=this.outputGain)==null||n.disconnect()}catch{}try{(a=this.inputGain)==null||a.disconnect()}catch{}try{(s=this.sourceNode)==null||s.disconnect()}catch{}try{(i=this.audioCtx)==null||i.close()}catch{}if(!this.externalStream)try{(o=this.mediaStream)==null||o.getTracks().forEach(l=>l.stop())}catch{}this.audioCtx=null,this.mediaStream=null,this.sourceNode=null,this.inputGain=null,this.outputGain=null,this.analyser=null,this.started=!1}setMonitoring(t){this.monitoring=t,this.outputGain&&(this.outputGain.gain.value=t?this._volume:0)}setVolume(t){this._volume=Math.max(0,Math.min(2,t)),this.outputGain&&this.monitoring&&(this.outputGain.gain.value=this._volume)}setInputGain(t){this._inputVolume=Math.max(0,Math.min(3,t)),this.inputGain&&(this.inputGain.gain.value=this._inputVolume)}getLevel(){if(!this.analyser)return 0;const t=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(t);let n=0;for(let a=0;a<t.length;a++){const s=(t[a]-128)/128;n+=s*s}return Math.sqrt(n/t.length)}addEffect(t,n=50){if(!this.audioCtx||!this.inputGain||!this.outputGain||this.activeEffects.has(t))return;const a=this.buildEffectChain(t,n);a&&(this.activeEffects.set(t,a),this.effectOrder.push(t),this.reconnectChain())}removeEffect(t){const n=this.activeEffects.get(t);if(n){for(const a of n.nodes)try{a.disconnect()}catch{}this.activeEffects.delete(t),this.effectOrder=this.effectOrder.filter(a=>a!==t),this.reconnectChain()}}toggleEffect(t,n=50){return this.activeEffects.has(t)?(this.removeEffect(t),!1):(this.addEffect(t,n),!0)}updateIntensity(t,n){this.activeEffects.has(t)&&(this.removeEffect(t),this.addEffect(t,n))}clearAllEffects(){for(const[t]of this.activeEffects){const n=this.activeEffects.get(t);if(n)for(const a of n.nodes)try{a.disconnect()}catch{}}this.activeEffects.clear(),this.effectOrder=[],this.reconnectChain()}reconnectChain(){if(!this.inputGain||!this.outputGain)return;try{this.inputGain.disconnect()}catch{}for(const[,n]of this.activeEffects)try{n.output.disconnect()}catch{}if(this.effectOrder.length===0){this.inputGain.connect(this.outputGain);return}let t=this.inputGain;for(const n of this.effectOrder){const a=this.activeEffects.get(n);a&&(t.connect(a.input),t=a.output)}t.connect(this.outputGain)}buildEffectChain(t,n){const a=this.audioCtx,s=n/100;switch(t){case"chipmunk":return this.buildPitchShift(a,1+s*.8,s);case"helium":return this.buildPitchShift(a,1.5+s*1,s);case"deep":return this.buildPitchShift(a,1/(1+s*.5),s);case"demon":return this.buildDemon(a,s);case"robot":return this.buildRobot(a,s);case"alien":return this.buildAlien(a,s);case"echo":return this.buildDelay(a,.15+s*.35,.3+s*.4,s);case"cave":return this.buildCave(a,s);case"reverb":return this.buildReverb(a,1.5+s*3,2+s*4,s);case"chorus":return this.buildChorus(a,s);case"flanger":return this.buildFlanger(a,s);case"distortion":return this.buildDistortion(a,20+s*100,s);case"telephone":return this.buildBandpass(a,400,3500,s);case"megaphone":return this.buildMegaphone(a,s);case"radio":return this.buildRadio(a,s);case"underwater":return this.buildUnderwater(a,s);case"whisper":return this.buildWhisper(a,s);case"tremolo":return this.buildTremolo(a,s);case"autotune":return this.buildAutotune(a,s);case"vocoder":return this.buildVocoder(a,s);default:return null}}buildPitchShift(t,n,a){const s=t.createGain();s.gain.value=1;const i=t.createGain();i.gain.value=1;const o=t.createGain();o.gain.value=.7+a*.3;const l=t.createGain();l.gain.value=1-a*.5;const c=t.createDelay(1),u=t.createDelay(1),h=t.createOscillator(),p=t.createOscillator(),g=t.createGain(),y=t.createGain(),m=n-1,x=Math.abs(m)*5+2,b=Math.abs(m)*.015;h.type="sawtooth",h.frequency.value=x,g.gain.value=b,h.connect(g),g.connect(c.delayTime),c.delayTime.value=.02,p.type="sawtooth",p.frequency.value=x,y.gain.value=b,p.connect(y),y.connect(u.delayTime),u.delayTime.value=.02+b;const f=t.createGain();f.gain.value=.5;const k=t.createGain();return k.gain.value=.5,s.connect(c),s.connect(u),c.connect(f),u.connect(k),f.connect(o),k.connect(o),s.connect(l),o.connect(i),l.connect(i),h.start(),p.start(),{type:"chipmunk",nodes:[s,c,u,h,p,g,y,f,k,o,l,i],input:s,output:i}}buildRobot(t,n){const a=t.createGain(),s=t.createGain(),i=t.createGain();i.gain.value=.6+n*.4;const o=t.createGain();o.gain.value=1-n*.6;const l=t.createOscillator();l.type="square",l.frequency.value=50+n*200;const c=t.createGain();return c.gain.value=0,l.connect(c.gain),a.connect(c),c.connect(i),a.connect(o),i.connect(s),o.connect(s),l.start(),{type:"robot",nodes:[a,l,c,i,o,s],input:a,output:s}}buildAlien(t,n){const a=t.createGain(),s=t.createGain(),i=t.createOscillator();i.type="sine",i.frequency.value=300+n*700;const o=t.createGain();o.gain.value=0,i.connect(o.gain),a.connect(o);const l=t.createDelay(.1);l.delayTime.value=.005;const c=t.createOscillator();c.type="sine",c.frequency.value=3+n*10;const u=t.createGain();u.gain.value=.004,c.connect(u),u.connect(l.delayTime),o.connect(l),l.connect(s);const h=t.createGain();return h.gain.value=.3,a.connect(h),h.connect(s),i.start(),c.start(),{type:"alien",nodes:[a,i,o,l,c,u,h,s],input:a,output:s}}buildDelay(t,n,a,s){const i=t.createGain(),o=t.createGain(),l=t.createDelay(2);l.delayTime.value=n;const c=t.createGain();c.gain.value=Math.min(.85,a);const u=t.createGain();u.gain.value=.5+s*.5;const h=t.createGain();return h.gain.value=1,i.connect(l),l.connect(c),c.connect(l),l.connect(u),i.connect(h),u.connect(o),h.connect(o),{type:"echo",nodes:[i,l,c,u,h,o],input:i,output:o}}buildCave(t,n){const a=t.createGain(),s=t.createGain(),i=t.createDelay(2);i.delayTime.value=.2+n*.3;const o=t.createDelay(2);o.delayTime.value=.35+n*.25;const l=t.createDelay(2);l.delayTime.value=.55+n*.3;const c=t.createGain();c.gain.value=.5;const u=t.createGain();u.gain.value=.35;const h=t.createGain();h.gain.value=.25;const p=t.createConvolver();p.buffer=Ci(t,2+n*3,3);const g=t.createGain();g.gain.value=.3+n*.3,a.connect(i),i.connect(c),c.connect(i),a.connect(o),o.connect(u),u.connect(o),a.connect(l),l.connect(h),h.connect(l),i.connect(g),o.connect(g),l.connect(g),a.connect(p),p.connect(g);const y=t.createGain();return y.gain.value=.7,a.connect(y),y.connect(s),g.connect(s),{type:"cave",nodes:[a,i,o,l,c,u,h,p,g,y,s],input:a,output:s}}buildReverb(t,n,a,s){const i=t.createGain(),o=t.createGain(),l=t.createConvolver();l.buffer=Ci(t,n,a);const c=t.createGain();c.gain.value=.4+s*.5;const u=t.createGain();return u.gain.value=1,i.connect(l),l.connect(c),i.connect(u),c.connect(o),u.connect(o),{type:"reverb",nodes:[i,l,c,u,o],input:i,output:o}}buildChorus(t,n){const a=t.createGain(),s=t.createGain(),i=[{delayMs:20,lfoFreq:.5,depth:.003},{delayMs:25,lfoFreq:.7,depth:.004},{delayMs:30,lfoFreq:1.1,depth:.005}],o=[a,s],l=t.createGain();l.gain.value=.7,a.connect(l),l.connect(s),o.push(l);for(const c of i){const u=t.createDelay(.1);u.delayTime.value=c.delayMs/1e3;const h=t.createOscillator();h.type="sine",h.frequency.value=c.lfoFreq;const p=t.createGain();p.gain.value=c.depth*(.5+n),h.connect(p),p.connect(u.delayTime);const g=t.createGain();g.gain.value=.3+n*.2,a.connect(u),u.connect(g),g.connect(s),h.start(),o.push(u,h,p,g)}return{type:"chorus",nodes:o,input:a,output:s}}buildFlanger(t,n){const a=t.createGain(),s=t.createGain(),i=t.createDelay(.02);i.delayTime.value=.005;const o=t.createOscillator();o.type="sine",o.frequency.value=.2+n*2;const l=t.createGain();l.gain.value=.003+n*.002,o.connect(l),l.connect(i.delayTime);const c=t.createGain();c.gain.value=.5+n*.35;const u=t.createGain();u.gain.value=.5+n*.3;const h=t.createGain();return h.gain.value=1,a.connect(i),i.connect(c),c.connect(i),i.connect(u),a.connect(h),u.connect(s),h.connect(s),o.start(),{type:"flanger",nodes:[a,i,o,l,c,u,h,s],input:a,output:s}}buildDistortion(t,n,a){const s=t.createGain(),i=t.createGain(),o=t.createWaveShaper();o.curve=or(n),o.oversample="4x";const l=t.createGain();l.gain.value=.6+a*.4;const c=t.createGain();return c.gain.value=1-a*.4,s.connect(o),o.connect(l),s.connect(c),l.connect(i),c.connect(i),{type:"distortion",nodes:[s,o,l,c,i],input:s,output:i}}buildBandpass(t,n,a,s){const i=t.createGain(),o=t.createGain(),l=t.createBiquadFilter();l.type="highpass",l.frequency.value=n,l.Q.value=.7;const c=t.createBiquadFilter();return c.type="lowpass",c.frequency.value=a,c.Q.value=.7,i.connect(l),l.connect(c),c.connect(o),{type:"telephone",nodes:[i,l,c,o],input:i,output:o}}buildMegaphone(t,n){const a=t.createGain(),s=t.createGain(),i=t.createBiquadFilter();i.type="highpass",i.frequency.value=500;const o=t.createBiquadFilter();o.type="lowpass",o.frequency.value=4e3;const l=t.createWaveShaper();l.curve=or(15+n*30),l.oversample="2x";const c=t.createBiquadFilter();return c.type="peaking",c.frequency.value=2e3,c.gain.value=6+n*6,c.Q.value=1,a.connect(i),i.connect(o),o.connect(l),l.connect(c),c.connect(s),{type:"megaphone",nodes:[a,i,o,l,c,s],input:a,output:s}}buildRadio(t,n){const a=t.createGain(),s=t.createGain(),i=t.createBiquadFilter();i.type="highpass",i.frequency.value=300+n*200;const o=t.createBiquadFilter();o.type="lowpass",o.frequency.value=3e3-n*500;const l=t.createBiquadFilter();l.type="peaking",l.frequency.value=1500,l.gain.value=8,l.Q.value=2;const c=t.createWaveShaper();return c.curve=or(10),a.connect(i),i.connect(o),o.connect(l),l.connect(c),c.connect(s),{type:"radio",nodes:[a,i,o,l,c,s],input:a,output:s}}buildUnderwater(t,n){const a=t.createGain(),s=t.createGain(),i=t.createBiquadFilter();i.type="lowpass",i.frequency.value=300+(1-n)*400,i.Q.value=5+n*10;const o=t.createOscillator();o.type="sine",o.frequency.value=.5+n*2;const l=t.createGain();l.gain.value=100+n*200,o.connect(l),l.connect(i.frequency);const c=t.createGain();c.gain.value=.7+n*.3;const u=t.createGain();return u.gain.value=.3-n*.2,a.connect(i),i.connect(c),a.connect(u),c.connect(s),u.connect(s),o.start(),{type:"underwater",nodes:[a,i,o,l,c,u,s],input:a,output:s}}buildWhisper(t,n){const a=t.createGain(),s=t.createGain(),i=t.createBiquadFilter();i.type="highpass",i.frequency.value=500+n*500,i.Q.value=.5;const o=t.createWaveShaper(),l=new Float32Array(256);for(let u=0;u<256;u++){const h=u/255*2-1;l[u]=Math.sign(h)*Math.pow(Math.abs(h),.3+n*.5)}o.curve=l;const c=t.createBiquadFilter();return c.type="highshelf",c.frequency.value=3e3,c.gain.value=6+n*6,a.connect(i),i.connect(o),o.connect(c),c.connect(s),{type:"whisper",nodes:[a,i,o,c,s],input:a,output:s}}buildDemon(t,n){const a=t.createGain(),s=t.createGain(),i=t.createDelay(.1);i.delayTime.value=.03;const o=t.createOscillator();o.type="sawtooth",o.frequency.value=2+n*3;const l=t.createGain();l.gain.value=.02+n*.015,o.connect(l),l.connect(i.delayTime);const c=t.createWaveShaper();c.curve=or(20+n*50),c.oversample="2x";const u=t.createBiquadFilter();u.type="lowshelf",u.frequency.value=200,u.gain.value=8+n*8;const h=t.createGain();h.gain.value=.7+n*.3;const p=t.createGain();return p.gain.value=.3,a.connect(i),i.connect(c),c.connect(u),u.connect(h),a.connect(p),h.connect(s),p.connect(s),o.start(),{type:"demon",nodes:[a,i,o,l,c,u,h,p,s],input:a,output:s}}buildTremolo(t,n){const a=t.createGain(),s=t.createGain(),i=t.createGain();i.gain.value=1;const o=t.createOscillator();o.type="sine",o.frequency.value=3+n*12;const l=t.createGain();return l.gain.value=.3+n*.5,o.connect(l),l.connect(i.gain),a.connect(i),i.connect(s),o.start(),{type:"tremolo",nodes:[a,i,o,l,s],input:a,output:s}}buildAutotune(t,n){const a=t.createGain(),s=t.createGain(),i=t.createDelay(.05);i.delayTime.value=.005;const o=t.createOscillator();o.type="sine",o.frequency.value=6+n*8;const l=t.createGain();l.gain.value=.002+n*.002,o.connect(l),l.connect(i.delayTime);const c=[],u=[261.6,293.7,329.6,349.2,392,440,493.9,523.3],h=t.createGain();h.gain.value=.15;for(const y of u){const m=t.createBiquadFilter();m.type="peaking",m.frequency.value=y,m.Q.value=8+n*15,m.gain.value=4+n*8,a.connect(m),m.connect(h),c.push(m)}const p=t.createGain();p.gain.value=.7;const g=t.createGain();return g.gain.value=.5+n*.3,a.connect(i),i.connect(g),h.connect(g),a.connect(p),g.connect(s),p.connect(s),o.start(),{type:"autotune",nodes:[a,i,o,l,...c,h,g,p,s],input:a,output:s}}buildVocoder(t,n){const a=t.createGain(),s=t.createGain(),i=t.createOscillator();i.type="sawtooth",i.frequency.value=110+n*110;const o=t.createGain();o.gain.value=0;const l=8,c=[a,s,i,o],u=t.createGain();u.gain.value=.5+n*.5,c.push(u);for(let p=0;p<l;p++){const g=200*Math.pow(2,p*.5),y=t.createBiquadFilter();y.type="bandpass",y.frequency.value=g,y.Q.value=4;const m=t.createBiquadFilter();m.type="bandpass",m.frequency.value=g,m.Q.value=4;const x=t.createGain();x.gain.value=0,a.connect(y),y.connect(x.gain),i.connect(m),m.connect(x),x.connect(u),c.push(y,m,x)}u.connect(s);const h=t.createGain();return h.gain.value=.3-n*.2,a.connect(h),h.connect(s),c.push(h),i.start(),{type:"vocoder",nodes:c,input:a,output:s}}}const l0={sparkle:F.NtdSparkle,music:F.NtdMusic,skull:F.NtdSkull,robot:F.NtdRobot,ghost:F.NtdGhost,mountain:F.NtdMountain,wave:F.NtdWave,lightning:F.NtdLightning,phone:F.NtdPhone,megaphone:F.NtdMegaphone,"volume-mute":F.NtdVolumeMute,microphone:F.NtdMicrophone,volume:F.NtdVolume},c0=({deviceId:e,mediaStream:t,compact:n=!1,t:a,className:s,style:i,id:o,accessMode:l,"data-testid":c})=>{const{t:u}=xe(),h=a??u,p=d.useRef(null),[g,y]=d.useState(!1),[m,x]=d.useState(()=>_l.map(O=>({...O}))),[b,f]=d.useState(!0),[k,v]=d.useState(80),[w,R]=d.useState(100),[M,j]=d.useState(0),T=d.useRef(0),P=d.useCallback(()=>{const O=()=>{var U;(U=p.current)!=null&&U.isStarted&&(j(p.current.getLevel()),T.current=requestAnimationFrame(O))};T.current=requestAnimationFrame(O)},[]),A=d.useCallback(()=>{T.current&&cancelAnimationFrame(T.current)},[]),I=d.useCallback(async()=>{const O=new zl;p.current=O;try{t?await O.startWithStream(t):await O.start(e),O.setMonitoring(b),O.setVolume(k/100),O.setInputGain(w/100);for(const U of m)U.enabled&&O.addEffect(U.type,U.intensity);y(!0),P()}catch(U){typeof console<"u"&&console.warn("[VocalEffectsRack] start error",U)}},[e,t,b,k,w,m,P]),L=d.useCallback(()=>{var O;A(),(O=p.current)==null||O.stop(),p.current=null,y(!1),j(0)},[A]);d.useEffect(()=>()=>{var O;A(),(O=p.current)==null||O.stop(),p.current=null},[A]);const N=d.useCallback(O=>{x(U=>U.map(V=>{var G;if(V.type!==O)return V;const K={...V,enabled:!V.enabled};return(G=p.current)!=null&&G.isStarted&&(K.enabled?p.current.addEffect(O,K.intensity):p.current.removeEffect(O)),K}))},[]),_=d.useCallback((O,U)=>{x(V=>V.map(K=>{var G;return K.type!==O?K:(K.enabled&&((G=p.current)!=null&&G.isStarted)&&p.current.updateIntensity(O,U),{...K,intensity:U})}))},[]);d.useEffect(()=>{var O;(O=p.current)==null||O.setVolume(k/100)},[k]),d.useEffect(()=>{var O;(O=p.current)==null||O.setInputGain(w/100)},[w]),d.useEffect(()=>{var O;(O=p.current)==null||O.setMonitoring(b)},[b]);const ee=d.useCallback(()=>{var O;(O=p.current)==null||O.clearAllEffects(),x(U=>U.map(V=>({...V,enabled:!1})))},[]),Y=m.filter(O=>O.enabled).length;return l==="hidden"?null:r.jsxs("div",{className:`nice-vocal-effects-rack${s?` ${s}`:""}`,style:{border:"1px solid var(--nice-border, #e2e8f0)",borderRadius:12,padding:n?12:20,background:"var(--nice-bg-secondary)",color:"var(--nice-text, inherit)",...i},id:o,"data-testid":c,children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:16,gap:8},children:[r.jsxs("h3",{style:{margin:0,fontSize:n?16:20,display:"flex",alignItems:"center",gap:8},children:[r.jsx(F.NtdMicrophone,{size:n?16:20})," ",h("vocalEffects.title","Vocal effects")]}),r.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[Y>0&&r.jsxs(ie.NiceBadge,{variant:"primary",children:[Y," ",h("vocalEffects.active","active")]}),g?r.jsx(ie.NiceButton,{variant:"danger",size:"sm",onClick:L,children:h("vocalEffects.stop","Stop")}):r.jsx(ie.NiceButton,{variant:"primary",size:"sm",onClick:I,children:h("vocalEffects.start","Start mic")})]})]}),r.jsxs("div",{style:{display:"flex",gap:16,alignItems:"center",marginBottom:16,flexWrap:"wrap"},children:[r.jsx(ie.NiceToggle,{checked:b,onChange:f,label:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(F.NtdVolume,{size:14})," ",h("vocalEffects.monitor","Monitor")]})}),r.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,fontSize:13},children:[h("vocalEffects.volume","Vol"),r.jsx("div",{style:{width:100},children:r.jsx(ie.NiceSlider,{value:k,onChange:v,min:0,max:200})}),r.jsxs("span",{style:{minWidth:36,fontSize:12},children:[k,"%"]})]}),r.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,fontSize:13},children:[h("vocalEffects.gain","Gain"),r.jsx("div",{style:{width:100},children:r.jsx(ie.NiceSlider,{value:w,onChange:R,min:0,max:300})}),r.jsxs("span",{style:{minWidth:36,fontSize:12},children:[w,"%"]})]}),g&&r.jsx("div",{style:{width:80,height:8,borderRadius:4,background:"var(--nice-bg-tertiary)",overflow:"hidden"},children:r.jsx("div",{style:{height:"100%",width:`${Math.min(100,M*300)}%`,background:M>.5?"var(--nice-danger, #ef4444)":M>.2?"var(--nice-warning, #f59e0b)":"var(--nice-success, #4caf50)",transition:"width 0.05s"}})}),Y>0&&r.jsx(ie.NiceButton,{variant:"ghost",size:"sm",onClick:ee,children:h("vocalEffects.clearAll","Clear all")})]}),r.jsx("div",{style:{display:"grid",gridTemplateColumns:`repeat(auto-fill, minmax(${n?130:160}px, 1fr))`,gap:n?6:10},children:m.map(O=>r.jsxs("div",{style:{border:O.enabled?"2px solid var(--nice-accent, #3b82f6)":"1px solid var(--nice-border, #e2e8f0)",borderRadius:10,padding:n?"6px 8px":"10px 12px",background:O.enabled?"var(--nice-accent-tint-10, rgba(59,130,246,0.08))":"transparent",transition:"all 0.15s ease"},children:[r.jsxs("button",{type:"button",onClick:()=>N(O.type),style:{display:"flex",alignItems:"center",gap:6,width:"100%",marginBottom:O.enabled?6:0,background:"transparent",border:"none",cursor:"pointer",color:"inherit",textAlign:"left"},children:[(()=>{const U=l0[O.icon]??F.NtdMusic;return r.jsx(U,{size:n?18:22})})(),r.jsx("span",{style:{fontSize:n?12:14,fontWeight:O.enabled?700:500,color:O.enabled?"var(--nice-accent, #3b82f6)":"inherit"},children:O.label})]}),O.enabled&&r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},onClick:U=>U.stopPropagation(),onKeyDown:U=>{U.key!=="Escape"&&U.stopPropagation()},children:[r.jsx("div",{style:{flex:1},children:r.jsx(ie.NiceSlider,{value:O.intensity,onChange:U=>_(O.type,U),min:0,max:100})}),r.jsx("span",{style:{fontSize:11,minWidth:24,color:"var(--nice-text-muted, #64748b)"},children:O.intensity})]})]},O.type))}),r.jsx("div",{style:{marginTop:12,fontSize:12,color:"var(--nice-text-muted, #94a3b8)",textAlign:"center"},children:h("vocalEffects.hint","Click effects to toggle. Multiple effects can be active at once — adjust intensity with the slider.")})]})},Dl={algorithm:"pitchy",gain:1,rmsThreshold:.02,pitchThreshold:.6,smoothingWindow:3,hysteresisFrames:2,useHanning:!1,offsetMs:0},d0=[{value:"pitchy",label:"Pitchy (fast)"},{value:"autocorrelation",label:"Autocorrelation"},{value:"librosa",label:"Librosa (server)"},{value:"crepe",label:"CREPE (AI, server)"}],u0=({deviceId:e,onDeviceChange:t,settings:n,onSettingsChange:a,audioInputs:s,algorithms:i=d0,showLevelMeter:o=!0,onCalibrate:l,compact:c=!1,t:u})=>{const{t:h}=xe(),p=u??h,g=d.useMemo(()=>({...Dl,...n}),[n]),y=I=>a==null?void 0:a({...g,...I}),[m,x]=d.useState([]);d.useEffect(()=>{var N,_,ee;if(s||!((N=navigator.mediaDevices)!=null&&N.enumerateDevices))return;let I=!1;const L=()=>navigator.mediaDevices.enumerateDevices().then(Y=>!I&&x(Y.filter(O=>O.kind==="audioinput"))).catch(()=>{});return L(),(ee=(_=navigator.mediaDevices).addEventListener)==null||ee.call(_,"devicechange",L),()=>{var Y,O;I=!0,(O=(Y=navigator.mediaDevices).removeEventListener)==null||O.call(Y,"devicechange",L)}},[s]);const b=s??m,f=d.useMemo(()=>b.map((I,L)=>({value:I.deviceId,label:I.label||`${p("audioInput.microphone","Microphone")} ${L+1}`})),[b,p]),[k,v]=d.useState(!1),[w,R]=d.useState(0),M=d.useRef(null),j=()=>{const I=M.current;I&&(cancelAnimationFrame(I.raf),I.stream.getTracks().forEach(L=>L.stop()),I.ctx.close().catch(()=>{}),M.current=null),v(!1),R(0)},T=async()=>{try{const I=await navigator.mediaDevices.getUserMedia({audio:{deviceId:e?{exact:e}:void 0}}),L=new AudioContext,N=L.createMediaStreamSource(I),_=L.createAnalyser();_.fftSize=1024,N.connect(_);const ee=new Float32Array(_.fftSize),Y=()=>{_.getFloatTimeDomainData(ee);let O=0;for(let U=0;U<ee.length;U++)O+=ee[U]*ee[U];R(Math.sqrt(O/ee.length)*(g.gain||1)),M.current.raf=requestAnimationFrame(Y)};M.current={ctx:L,stream:I,raf:requestAnimationFrame(Y)},v(!0)}catch{}};d.useEffect(()=>()=>j(),[]);const P={fontSize:12,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)",marginBottom:4,display:"block"},A=(I,L,N)=>r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10},children:[r.jsx("span",{style:{flex:"0 0 120px",fontSize:13},children:I}),r.jsx("div",{style:{flex:1},children:L}),r.jsx("span",{style:{flex:"0 0 48px",textAlign:"right",fontSize:12,color:"var(--nice-text-muted, #94a3b8)"},children:N})]});return r.jsxs("div",{className:"nice-audio-input-picker",style:{display:"flex",flexDirection:"column",gap:c?8:12,border:"1px solid var(--nice-border, #e2e8f0)",borderRadius:12,padding:c?12:16,color:"var(--nice-text, inherit)"},children:[r.jsxs("div",{style:{display:"flex",gap:12,flexWrap:"wrap"},children:[r.jsxs("div",{style:{flex:"1 1 220px",minWidth:180},children:[r.jsxs("label",{style:{...P,display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(F.NtdMicrophone,{size:13})," ",p("audioInput.device","Microphone")]}),r.jsx(ie.NiceSelect,{options:f,value:e??"",onChange:I=>t==null?void 0:t(typeof I=="string"?I:I[0]),placeholder:p("audioInput.selectDevice","Select microphone"),size:"sm"})]}),r.jsxs("div",{style:{flex:"1 1 200px",minWidth:160},children:[r.jsx("label",{style:P,children:p("audioInput.algorithm","Pitch algorithm")}),r.jsx(ie.NiceSelect,{options:i,value:g.algorithm,onChange:I=>y({algorithm:typeof I=="string"?I:I[0]}),size:"sm"})]})]}),r.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8},children:[A(p("audioInput.gain","Gain"),r.jsx(ie.NiceSlider,{value:Math.round(g.gain*100),onChange:I=>y({gain:I/100}),min:0,max:300}),`${Math.round(g.gain*100)}%`),A(p("audioInput.rmsThreshold","RMS gate"),r.jsx(ie.NiceSlider,{value:Math.round(g.rmsThreshold*1e3),onChange:I=>y({rmsThreshold:I/1e3}),min:0,max:200}),g.rmsThreshold.toFixed(3)),A(p("audioInput.pitchThreshold","Pitch clarity"),r.jsx(ie.NiceSlider,{value:Math.round(g.pitchThreshold*100),onChange:I=>y({pitchThreshold:I/100}),min:0,max:100}),g.pitchThreshold.toFixed(2)),!c&&A(p("audioInput.smoothing","Smoothing"),r.jsx(ie.NiceSlider,{value:g.smoothingWindow,onChange:I=>y({smoothingWindow:I}),min:0,max:12}),`${g.smoothingWindow}`),!c&&A(p("audioInput.hysteresis","Hysteresis"),r.jsx(ie.NiceSlider,{value:g.hysteresisFrames,onChange:I=>y({hysteresisFrames:I}),min:0,max:12}),`${g.hysteresisFrames}`),!c&&A(p("audioInput.offset","Latency"),r.jsx(ie.NiceSlider,{value:g.offsetMs,onChange:I=>y({offsetMs:I}),min:-200,max:500}),`${g.offsetMs}ms`)]}),r.jsxs("div",{style:{display:"flex",gap:12,alignItems:"center",flexWrap:"wrap"},children:[r.jsx(ie.NiceToggle,{checked:g.useHanning,onChange:I=>y({useHanning:I}),label:p("audioInput.hanning","Hanning window")}),o&&r.jsxs(r.Fragment,{children:[r.jsx(ie.NiceButton,{variant:k?"danger":"secondary",size:"sm",onClick:k?j:T,children:k?p("audioInput.stopTest","Stop test"):p("audioInput.testMic","Test mic")}),r.jsx("div",{style:{width:100,height:8,borderRadius:4,background:"var(--nice-bg-tertiary)",overflow:"hidden"},children:r.jsx("div",{style:{height:"100%",width:`${Math.min(100,w*300)}%`,background:w>.5?"var(--nice-danger, #ef4444)":w>.2?"var(--nice-warning, #f59e0b)":"var(--nice-success, #4caf50)",transition:"width 0.05s"}})})]}),l&&e&&r.jsxs(ie.NiceButton,{variant:"ghost",size:"sm",onClick:()=>l(e),children:[r.jsx(F.NtdSettings,{size:14})," ",p("audioInput.calibrate","Calibrate latency")]})]})]})};class Fl{constructor(t,n){this.activeNotes=new Map,this.audioContext=t,this.masterGain=t.createGain(),this.masterGain.gain.value=.3,this.masterGain.connect(n)}applyCC(t,n,a){}midiToFreq(t){return 440*Math.pow(2,(t-69)/12)}playNote(t,n=100,a=1,s="sine"){const i=this.midiToFreq(t),o=this.audioContext.createOscillator(),l=this.audioContext.createGain();o.type=s,o.frequency.value=i;const c=n/127*.8;l.gain.value=c,o.connect(l),l.connect(this.masterGain);const u=this.audioContext.currentTime;return l.gain.setValueAtTime(0,u),l.gain.linearRampToValueAtTime(c,u+.01),l.gain.exponentialRampToValueAtTime(c*.7,u+.1),l.gain.setValueAtTime(c*.7,u+a-.05),l.gain.exponentialRampToValueAtTime(.001,u+a),o.start(u),o.stop(u+a),o.onended=()=>{l.disconnect(),o.disconnect()},{osc:o,gain:l}}scheduleNote(t,n,a,s=100,i="sine"){const o=this.midiToFreq(t),l=this.audioContext.createOscillator(),c=this.audioContext.createGain();l.type=i,l.frequency.value=o;const u=s/127*.8;l.connect(c),c.connect(this.masterGain);const h=n;return c.gain.setValueAtTime(0,h),c.gain.linearRampToValueAtTime(u,h+.01),c.gain.exponentialRampToValueAtTime(u*.7,h+.1),c.gain.setValueAtTime(u*.7,h+a-.05),c.gain.exponentialRampToValueAtTime(.001,h+a),l.start(h),l.stop(h+a),l.onended=()=>{c.disconnect(),l.disconnect()},{osc:l,gain:c}}setVolume(t){this.masterGain.gain.value=Math.max(0,Math.min(1,t))}stopAll(){this.activeNotes.forEach(({osc:t,gain:n})=>{try{t.stop(),n.disconnect(),t.disconnect()}catch{}}),this.activeNotes.clear()}dispose(){this.stopAll(),this.masterGain.disconnect()}}const ji=st.scoped("AudioPlaybackEngine");class h0{constructor(){this.audioContext=null,this.masterGain=null,this.masterFilter=null,this.clips=new Map,this.scheduledSources=new Map,this.midiTracks=new Map,this.synths=new Map,this.isPlaying=!1,this.startTimeOffset=0,this.audioContextStartTime=0,this.currentTime=0,this.loopRegion={start:0,end:0,enabled:!1},this.bpm=120,this.duration=0,this.initAudioContext()}setMidiCCEvents(t,n){const a=this.midiTracks.get(t);a&&(a.ccEvents=n)}getMidiCCEvents(t){const n=this.midiTracks.get(t);return(n==null?void 0:n.ccEvents)||[]}addMidiCCEvent(t,n){const a=this.midiTracks.get(t);a&&(a.ccEvents||(a.ccEvents=[]),a.ccEvents.push(n))}removeMidiCCEvent(t,n){const a=this.midiTracks.get(t);a&&a.ccEvents&&(a.ccEvents=a.ccEvents.filter(s=>s.id!==n))}initAudioContext(){try{this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.masterGain=this.audioContext.createGain(),this.masterFilter=this.audioContext.createBiquadFilter(),this.masterFilter.type="peaking",this.masterFilter.frequency.value=1200,this.masterFilter.Q.value=.7,this.masterFilter.gain.value=0,this.masterGain.connect(this.masterFilter),this.masterFilter.connect(this.audioContext.destination),this.masterGain.gain.value=.8,this.audioContext.state==="suspended"&&this.audioContext.resume()}catch(t){ji.error("Failed to initialize AudioContext:",t)}}createEffectNode(t){if(!this.audioContext||t.bypass)return null;try{switch(t.type){case"eq3":{const n=this.audioContext.createBiquadFilter(),a=this.audioContext.createBiquadFilter(),s=this.audioContext.createBiquadFilter();return n.type="lowshelf",n.frequency.value=t.params.lowFreq||250,n.gain.value=t.params.lowGain||0,a.type="peaking",a.frequency.value=1e3,a.Q.value=1,a.gain.value=t.params.midGain||0,s.type="highshelf",s.frequency.value=t.params.highFreq||4e3,s.gain.value=t.params.highGain||0,n.connect(a),a.connect(s),{input:n,output:s}}case"compressor":{const n=this.audioContext.createDynamicsCompressor();return n.threshold.value=t.params.threshold||-24,n.ratio.value=t.params.ratio||4,n.attack.value=t.params.attack||.003,n.release.value=t.params.release||.25,n.knee.value=t.params.knee||30,n}case"delay":{const n=this.audioContext.createDelay(5);n.delayTime.value=t.params.time||.25;const a=this.audioContext.createGain();a.gain.value=t.params.feedback||.3;const s=this.audioContext.createGain();s.gain.value=t.params.mix||.3;const i=this.audioContext.createGain();return i.gain.value=1-(t.params.mix||.3),n.connect(a),a.connect(n),n.connect(s),{input:n,output:s,dry:i,connect:function(o){s.connect(o),i.connect(o)}}}case"reverb":{const n=this.audioContext.createConvolver(),a=this.audioContext.sampleRate*(t.params.decay||2),s=this.audioContext.createBuffer(2,a,this.audioContext.sampleRate);for(let l=0;l<2;l++){const c=s.getChannelData(l);for(let u=0;u<a;u++)c[u]=(Math.random()*2-1)*Math.pow(1-u/a,2)}n.buffer=s;const i=this.audioContext.createGain();i.gain.value=t.params.mix||.3;const o=this.audioContext.createGain();return o.gain.value=1-(t.params.mix||.3),n.connect(i),{input:n,output:i,dry:o,connect:function(l){i.connect(l),o.connect(l)}}}case"distortion":{const n=this.audioContext.createWaveShaper(),a=t.params.amount||20,s=44100,i=new Float32Array(s),o=Math.PI/180;for(let u=0;u<s;u++){const h=u*2/s-1;i[u]=(3+a)*h*20*o/(Math.PI+a*Math.abs(h))}n.curve=i,n.oversample="4x";const l=this.audioContext.createGain();l.gain.value=t.params.mix||.5;const c=this.audioContext.createGain();return c.gain.value=1-(t.params.mix||.5),n.connect(l),{input:n,output:l,dry:c,connect:function(u){l.connect(u),c.connect(u)}}}default:return null}}catch(n){return ji.error("Failed to create effect node:",t.type,n),null}}addClip(t){this.clips.set(t.id,t),this.updateDuration()}removeClip(t){this.clips.delete(t),this.stopClip(t),this.updateDuration()}updateClip(t,n){const a=this.clips.get(t);a&&(Object.assign(a,n),this.updateDuration())}getClipsByLayer(t){return Array.from(this.clips.values()).filter(n=>n.layerId===t)}setMidiTrack(t,n,a="sine",s=.5){if(this.midiTracks.set(t,{layerId:t,notes:n,instrument:a,volume:s}),!this.synths.has(t)&&this.audioContext&&this.masterGain){const i=new Fl(this.audioContext,this.masterGain);i.setVolume(s),this.synths.set(t,i)}}removeMidiTrack(t){this.midiTracks.delete(t);const n=this.synths.get(t);n&&(n.dispose(),this.synths.delete(t))}updateMidiTrackVolume(t,n){const a=this.midiTracks.get(t);a&&(a.volume=n);const s=this.synths.get(t);s&&s.setVolume(n)}updateDuration(){let t=0;this.clips.forEach(n=>{const a=n.startTime+n.duration;a>t&&(t=a)}),this.duration=t}play(){!this.audioContext||this.isPlaying||(this.audioContext.state==="suspended"&&this.audioContext.resume(),this.isPlaying=!0,this.audioContextStartTime=this.audioContext.currentTime,this.startTimeOffset=this.currentTime,this.scheduleClips(),this.scheduleMidiNotes(),this.startTimeTracking(),this.onPlayStateChange&&this.onPlayStateChange(!0))}pause(){this.isPlaying&&(this.isPlaying=!1,this.stopAllSources(),this.onPlayStateChange&&this.onPlayStateChange(!1))}stop(){this.pause(),this.seek(0)}seek(t){const n=this.isPlaying;n&&this.pause(),this.currentTime=Math.max(0,Math.min(t,this.duration)),this.onTimeUpdate&&this.onTimeUpdate(this.currentTime),n&&this.play()}scheduleClips(){!this.audioContext||!this.masterGain||this.clips.forEach(t=>{if(t.startTime+t.duration<=this.currentTime)return;const a=this.audioContext.createBufferSource();a.buffer=t.buffer,t.stretchFactor&&t.stretchFactor!==1&&(a.playbackRate.value=1/t.stretchFactor);const s=this.audioContext.createGain();s.gain.value=t.volume;const i=this.audioContext.createStereoPanner();i.pan.value=t.pan,a.connect(s);let o=s;if(t.effectChain&&t.effectChain.length>0)for(const h of t.effectChain){const p=this.createEffectNode(h);if(p)if("input"in p&&"output"in p){const g=p;o.connect(g.input),o=g.output,"dry"in p&&s.connect(g.dry)}else o.connect(p),o=p}o.connect(i),i.connect(this.masterGain);const l=t.startTime,c=Math.max(0,this.currentTime-l),u=this.audioContext.currentTime+(l-this.currentTime);u>=this.audioContext.currentTime&&(a.start(u,t.offset+c,t.duration-c),this.scheduledSources.set(t.id,a),a.onended=()=>{this.scheduledSources.delete(t.id)})})}stopClip(t){const n=this.scheduledSources.get(t);if(n){try{n.stop()}catch{}this.scheduledSources.delete(t)}}stopAllSources(){this.scheduledSources.forEach(t=>{try{t.stop()}catch{}}),this.scheduledSources.clear(),this.synths.forEach(t=>t.stopAll())}scheduleMidiNotes(){this.audioContext&&this.midiTracks.forEach(t=>{const n=this.synths.get(t.layerId);if(n&&(t.notes.forEach(a=>{if(a.start+a.duration<=this.currentTime)return;const i=Math.max(0,this.currentTime-a.start),o=this.audioContext.currentTime+(a.start-this.currentTime);o>=this.audioContext.currentTime&&n.scheduleNote(a.pitch,o,a.duration-i,a.velocity,t.instrument)}),t.ccEvents&&Array.isArray(t.ccEvents)&&t.ccEvents.length>0)){const a=[...t.ccEvents].sort((o,l)=>o.time-l.time);let i=a[0];for(let o=1;o<a.length;++o){const l=a[o],c=i.time,u=l.time,h=i.value,p=l.value,g=i.handleType||"linear",y=Math.max(2,Math.ceil((u-c)*20));for(let m=0;m<=y;++m){const x=m/y;let b=h;if(g==="linear")b=h+(p-h)*x;else if(g==="step")b=x<1?h:p;else if(g==="exp"){const w=Math.max(h/127,.001),R=Math.max(p/127,.001);b=w*Math.pow(R/w,x)*127}const f=c+(u-c)*x,k=this.audioContext.currentTime+(f-this.currentTime);k>=this.audioContext.currentTime&&typeof n.applyCC=="function"&&n.applyCC(l.cc,b,k)}i=l}}})}startTimeTracking(){if(!this.audioContext)return;const t=()=>{if(!this.isPlaying||!this.audioContext)return;const n=this.audioContext.currentTime-this.audioContextStartTime;if(this.currentTime=this.startTimeOffset+n,this.loopRegion.enabled&&this.currentTime>=this.loopRegion.end){this.seek(this.loopRegion.start);return}if(this.currentTime>=this.duration){this.stop();return}this.onTimeUpdate&&this.onTimeUpdate(this.currentTime),requestAnimationFrame(t)};requestAnimationFrame(t)}setLoopRegion(t,n,a){this.loopRegion={start:t,end:n,enabled:a}}setBPM(t){this.bpm=Math.max(20,Math.min(300,t))}getBPM(){return this.bpm}setMasterVolume(t){this.masterGain&&(this.masterGain.gain.value=Math.max(0,Math.min(1,t)))}setMasterFilter(t){this.masterFilter&&(t.type&&(this.masterFilter.type=t.type),t.frequency!=null&&(this.masterFilter.frequency.value=Math.max(20,Math.min(2e4,t.frequency))),t.q!=null&&(this.masterFilter.Q.value=Math.max(.1,Math.min(18,t.q))),t.gain!=null&&"gain"in this.masterFilter&&(this.masterFilter.gain.value=Math.max(-40,Math.min(40,t.gain))))}getCurrentTime(){return this.currentTime}getDuration(){return this.duration}getIsPlaying(){return this.isPlaying}setOnTimeUpdate(t){this.onTimeUpdate=t}setOnPlayStateChange(t){this.onPlayStateChange=t}dispose(){this.stop(),this.audioContext&&this.audioContext.close(),this.clips.clear()}}const p0=[{name:"Grand Piano",waveform:"sawtooth",attack:.02,sustain:.7,release:1.2,eq:{C:2,D:1,E:1,F:0,G:0,A:-1,B:-2,C2:-3},category:"Keyboard"},{name:"Electric Piano",waveform:"triangle",attack:.03,sustain:.8,release:1,eq:{C:0,D:1,E:2,F:3,G:1,A:-1,B:-2,C2:-2},category:"Keyboard"},{name:"Harpsichord",waveform:"square",attack:.01,sustain:.5,release:.6,eq:{C:-1,D:-1,E:0,F:2,G:3,A:1,B:0,C2:-1},category:"Keyboard"},{name:"Violin",waveform:"triangle",attack:.3,sustain:1,release:1.5,eq:{C:3,D:2,E:2,F:1,G:-1,A:-2,B:-3,C2:-3},category:"String"},{name:"Acoustic Guitar",waveform:"sawtooth",attack:.2,sustain:.6,release:.9,eq:{C:-1,D:-2,E:0,F:1,G:3,A:2,B:0,C2:-2},category:"String"},{name:"Electric Guitar",waveform:"square",attack:.05,sustain:.7,release:1.2,eq:{C:-2,D:1,E:2,F:2,G:1,A:0,B:-1,C2:-3},category:"String"},{name:"Kick Drum",waveform:"sine",attack:.005,sustain:.1,release:.2,eq:{C:5,D:3,E:0,F:-3,G:-5,A:-7,B:-9,C2:-10},category:"Percussion"},{name:"Snare Drum",waveform:"triangle",attack:.01,sustain:.2,release:.3,eq:{C:-2,D:-1,E:1,F:2,G:3,A:2,B:0,C2:-2},category:"Percussion"},{name:"Hi-Hat",waveform:"square",attack:.002,sustain:.05,release:.1,eq:{C:-5,D:-3,E:0,F:2,G:5,A:7,B:9,C2:10},category:"Percussion"},{name:"Acoustic Bass",waveform:"sine",attack:.08,sustain:.8,release:1.2,eq:{C:4,D:3,E:2,F:1,G:0,A:-1,B:-2,C2:-3},category:"Bass"},{name:"Electric Bass",waveform:"square",attack:.05,sustain:.9,release:1.3,eq:{C:3,D:2,E:1,F:0,G:-1,A:-2,B:-3,C2:-4},category:"Bass"},{name:"Trumpet",waveform:"sawtooth",attack:.1,sustain:.9,release:1.5,eq:{C:2,D:3,E:4,F:5,G:3,A:1,B:-1,C2:-3},category:"Brass"},{name:"Trombone",waveform:"triangle",attack:.2,sustain:1,release:1.7,eq:{C:3,D:4,E:5,F:4,G:2,A:0,B:-2,C2:-4},category:"Brass"},{name:"Saxophone",waveform:"sawtooth",attack:.15,sustain:.8,release:1.3,eq:{C:2,D:3,E:4,F:3,G:1,A:-1,B:-2,C2:-3},category:"Woodwind"},{name:"Clarinet",waveform:"triangle",attack:.18,sustain:.9,release:1.6,eq:{C:3,D:4,E:5,F:4,G:2,A:0,B:-1,C2:-2},category:"Woodwind"},{name:"Saw Synth",waveform:"sawtooth",attack:.05,sustain:.9,release:1.2,eq:{C:2,D:3,E:4,F:3,G:2,A:0,B:-1,C2:-2},category:"Synth"},{name:"Square Lead",waveform:"square",attack:.04,sustain:.85,release:1.1,eq:{C:2,D:3,E:4,F:3,G:1,A:0,B:-1,C2:-3},category:"Synth"}];function Vr(e={}){const{channelFilter:t,sysex:n=!1,onEvent:a,inputNameIncludes:s,onInputsChanged:i}=e,[o,l]=d.useState(null),[c,u]=d.useState(!1),[h,p]=d.useState([]),g=d.useRef(null),y=d.useCallback((m,x)=>{const b=m.data??new Uint8Array(0),f=b[0]??0,k=b[1]??0,v=b[2]??0,w=m.timeStamp,R=f&240,M=f&15,j=x.id,T=x.name??"MIDI Input",P=t===void 0||t===M;if((R===144||R===128)&&P){const A=R===144&&v>0;return{type:A?"noteon":"noteoff",note:k,velocity:A?v:0,channel:M,ts:w,deviceId:j,deviceName:T}}return R===176&&P?{type:"cc",controller:k,value:v,channel:M,ts:w,deviceId:j,deviceName:T}:R===208&&P?{type:"aftertouch",pressure:k,channel:M,ts:w,deviceId:j,deviceName:T}:R===224&&P?{type:"pitchbend",value:(k|v<<7)-8192,channel:M,ts:w,deviceId:j,deviceName:T}:R===192&&P?{type:"program",program:k,channel:M,ts:w,deviceId:j,deviceName:T}:{type:"unknown",status:f,data1:k,data2:v,channel:M,ts:w,deviceId:j,deviceName:T}},[t]);return d.useEffect(()=>{if(!("requestMIDIAccess"in navigator)){l(!1);return}l(!0);let m=!1;return navigator.requestMIDIAccess({sysex:n}).then(x=>{if(m)return;g.current=x,u(!0);const b=()=>{const f=Array.from(x.inputs.values()),k=s?f.filter(v=>(v.name||"").toUpperCase().includes(s.toUpperCase())):f;p(k),i==null||i(k),f.forEach(v=>v.onmidimessage=null),k.forEach(v=>{v.onmidimessage=w=>a==null?void 0:a(y(w,v))})};b(),x.onstatechange=()=>b()}),()=>{m=!0;const x=g.current;x&&(x.inputs.forEach(b=>b.onmidimessage=null),x.onstatechange=null)}},[s,a,i,y,n]),{supported:o,granted:c,inputs:h}}const rs="nice2dev.midiLearn";function f0(){try{const e=localStorage.getItem(rs);return e?JSON.parse(e):{}}catch{return{}}}function Mi(e){const t={};for(const n of e)t[n.id]={id:n.id,type:n.type,number:n.number,channel:n.channel,min:n.min,max:n.max};localStorage.setItem(rs,JSON.stringify(t))}function m0(e){const{parameters:t,onParameterChange:n}=e,[a,s]=d.useState(()=>{const v=f0();return t.map(w=>{const R=v[w.id];return{id:w.id,paramName:w.name,type:(R==null?void 0:R.type)??"cc",number:R==null?void 0:R.number,channel:R==null?void 0:R.channel,min:(R==null?void 0:R.min)??w.min??0,max:(R==null?void 0:R.max)??w.max??127,value:0}})}),[i,o]=d.useState({learning:!1,targetId:null}),[l,c]=d.useState(null),u=d.useRef(a);u.current=a;const h=d.useRef(n);h.current=n;const p=d.useRef(i);p.current=i;const g=d.useCallback(v=>{var R;c(v);const w=p.current;if(w.learning&&w.targetId){if(!u.current.find(T=>T.id===w.targetId))return;let j={};switch(v.type){case"cc":j={type:"cc",number:v.controller,channel:v.channel};break;case"noteon":j={type:"note",number:v.note,channel:v.channel};break;case"pitchbend":j={type:"pitchbend",channel:v.channel};break;case"aftertouch":j={type:"aftertouch",channel:v.channel};break;default:return}s(T=>{const P=T.map(A=>A.id===w.targetId?{...A,...j}:A);return Mi(P),P}),o({learning:!1,targetId:null});return}for(const M of u.current){if(M.number===void 0&&M.type!=="pitchbend"&&M.type!=="aftertouch"||M.channel!==void 0&&v.channel!==M.channel)continue;let j=null,T=127;if(M.type==="cc"&&v.type==="cc"&&v.controller===M.number?j=v.value:M.type==="note"&&v.type==="noteon"&&v.note===M.number?j=v.velocity:M.type==="pitchbend"&&v.type==="pitchbend"?(j=v.value+8192,T=16383):M.type==="aftertouch"&&v.type==="aftertouch"&&(j=v.pressure),j!==null){const P=j/T,A=M.min+P*(M.max-M.min);s(I=>I.map(L=>L.id===M.id?{...L,value:P}:L)),(R=h.current)==null||R.call(h,M.id,A,P)}}},[]),{supported:y,granted:m}=Vr({onEvent:g}),x=d.useCallback(v=>{o({learning:!0,targetId:v})},[]),b=d.useCallback(()=>{o({learning:!1,targetId:null})},[]),f=d.useCallback(v=>{s(w=>{const R=w.map(M=>M.id===v?{...M,type:"cc",number:void 0,channel:void 0}:M);return Mi(R),R})},[]),k=d.useCallback(()=>{s(v=>{const w=v.map(R=>({...R,type:"cc",number:void 0,channel:void 0,value:0}));return localStorage.removeItem(rs),w})},[]);return{bindings:a,startLearn:x,cancelLearn:b,removeBinding:f,clearAll:k,learnState:i,midiSupported:y,midiGranted:m,lastEvent:l}}const g0={masterChannel:0,memberChannels:[1,2,3,4,5,6,7,8,9,10,11,12,13,14],pitchBendRange:48};function y0(e={}){const{lowerZone:t=g0,onNoteExpression:n,onNoteOn:a,onNoteOff:s}=e,[i,o]=d.useState([]),l=d.useRef(new Map),c=d.useRef(n);c.current=n;const u=d.useRef(a);u.current=a;const h=d.useRef(s);h.current=s;const p=d.useRef(new Set(t.memberChannels));d.useEffect(()=>{p.current=new Set(t.memberChannels)},[t.memberChannels]);const g=d.useCallback(x=>{var f,k,v,w,R;if(!p.current.has(x.channel??-1))return;const b=`${x.channel}`;switch(x.type){case"noteon":{const M={note:x.note,channel:x.channel,velocity:x.velocity,pitchBend:0,pressure:0,slide:0,lastUpdate:x.ts};l.current.set(b,M),o(Array.from(l.current.values())),(f=u.current)==null||f.call(u,M);break}case"noteoff":{l.current.delete(b),o(Array.from(l.current.values())),(k=h.current)==null||k.call(h,x.channel,x.note);break}case"pitchbend":{const M=l.current.get(b);M&&(M.pitchBend=x.value,M.lastUpdate=x.ts,(v=c.current)==null||v.call(c,M),o(Array.from(l.current.values())));break}case"aftertouch":{const M=l.current.get(b);M&&(M.pressure=x.pressure,M.lastUpdate=x.ts,(w=c.current)==null||w.call(c,M),o(Array.from(l.current.values())));break}case"cc":{if(x.controller===74){const M=l.current.get(b);M&&(M.slide=x.value,M.lastUpdate=x.ts,(R=c.current)==null||R.call(c,M),o(Array.from(l.current.values())))}break}}},[]),{supported:y,granted:m}=Vr({onEvent:g,sysex:!1});return{activeNotes:i,midiSupported:y,midiGranted:m}}const v0={name:"M-Audio Oxygen 25 (MKIV)",deviceMatch:"OXYGEN",knobs:[{index:1,cc:21,label:"Knob 1"},{index:2,cc:22,label:"Knob 2"},{index:3,cc:23,label:"Knob 3"},{index:4,cc:24,label:"Knob 4"},{index:5,cc:25,label:"Knob 5"},{index:6,cc:26,label:"Knob 6"},{index:7,cc:27,label:"Knob 7"},{index:8,cc:28,label:"Knob 8"}],fader:{cc:7,label:"Fader (Channel Volume)"},pads:[{note:36,label:"Kick C1"},{note:38,label:"Snare D1"},{note:42,label:"HH Closed F#1"},{note:46,label:"HH Open A#1"},{note:48,label:"Tom1 C2"},{note:45,label:"Tom2 A1"},{note:43,label:"Floor G1"},{note:49,label:"Crash C#2"}],transport:{play:115,stop:114,record:117,rew:112,ff:113,loop:116}};function b0(e={},t=v0){const{t:n}=xe(),[a,s]=d.useState(()=>{const m=localStorage.getItem("oxygen25.layout");return m?JSON.parse(m):t}),[i,o]=d.useState([]),l=d.useRef({mode:"idle"}),c=d.useCallback(m=>{s(x=>{const b={...x,...m};return localStorage.setItem("oxygen25.layout",JSON.stringify(b)),b})},[]),u=d.useCallback(m=>{var f,k,v,w,R,M,j,T,P;const x=m.deviceName||"MIDI";o(A=>A.includes(x)?A:[...A,x]);const b=l.current;if(b.mode!=="idle"){if(b.mode==="knob"&&m.type==="cc"){const A=b.index;c({knobs:a.knobs.map(I=>I.index===A?{...I,cc:m.controller}:I)}),l.current={mode:"idle"};return}if(b.mode==="fader"&&m.type==="cc"){c({fader:{cc:m.controller,label:n("useOxygen25.fader","Fader")}}),l.current={mode:"idle"};return}if(b.mode==="pad"&&m.type==="noteon"){const A=a.pads.slice();A[b.padIdx]={...A[b.padIdx],note:m.note},c({pads:A}),l.current={mode:"idle"};return}if(b.mode==="transport"&&m.type==="cc"){const A={...a.transport};A[b.action]=m.controller,c({transport:A}),l.current={mode:"idle"};return}}switch(m.type){case"noteon":{a.pads.findIndex(I=>I.note===m.note)>=0?(f=e.onPad)==null||f.call(e,{note:m.note,velocity:m.velocity,ts:m.ts,device:x}):(k=e.onKey)==null||k.call(e,{note:m.note,velocity:m.velocity,ts:m.ts,device:x});break}case"cc":{if(a.fader&&m.controller===a.fader.cc){(v=e.onFader)==null||v.call(e,{cc:m.controller,value:m.value,ts:m.ts,device:x});break}const A=a.knobs.find(L=>L.cc===m.controller);if(A){(w=e.onKnob)==null||w.call(e,{index:A.index,cc:m.controller,value:m.value,ts:m.ts,device:x});break}const I=Object.keys(a.transport).find(L=>a.transport[L]===m.controller);if(I){(R=e.onTransport)==null||R.call(e,{action:I,value:m.value,ts:m.ts,device:x});break}(M=e.onUnknown)==null||M.call(e,m);break}case"pitchbend":(j=e.onPitchBend)==null||j.call(e,{value:m.value,ts:m.ts,device:x});break;case"aftertouch":(T=e.onAftertouch)==null||T.call(e,{pressure:m.pressure,ts:m.ts,device:x});break;default:(P=e.onUnknown)==null||P.call(e,m)}},[c,e,a,n]),{supported:h,granted:p,inputs:g}=Vr({inputNameIncludes:void 0,onEvent:u,sysex:!1,channelFilter:void 0,onInputsChanged:m=>o(m.map(x=>x.name||"MIDI"))}),y=d.useMemo(()=>({knob:m=>l.current={mode:"knob",index:m},fader:()=>l.current={mode:"fader"},pad:m=>l.current={mode:"pad",padIdx:m},transport:m=>l.current={mode:"transport",action:m},cancel:()=>l.current={mode:"idle"},state:()=>l.current}),[]);return{supported:h,granted:p,inputs:g,layout:a,setLayout:c,learn:y,inputsInfo:i}}const ja={major:[0,2,4,5,7,9,11],minor:[0,2,3,5,7,8,10],dorian:[0,2,3,5,7,9,10],mixolydian:[0,2,4,5,7,9,10],pentatonic:[0,2,4,7,9],minorPenta:[0,3,5,7,10],blues:[0,3,5,6,7,10],chromatic:[0,1,2,3,4,5,6,7,8,9,10,11]},x0=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],Ma={pop:[[0,4,7],[5,9,0],[7,11,2],[5,9,0]],rock:[[0,4,7],[5,9,0],[3,7,10],[5,9,0]],jazz:[[0,4,7,11],[2,5,9,0],[5,9,0,4],[0,4,7,11]],blues12:[[0,4,7],[0,4,7],[0,4,7],[0,4,7],[5,9,0],[5,9,0],[0,4,7],[0,4,7],[7,11,2],[5,9,0],[0,4,7],[7,11,2]]},nn=36,jn=38,Rt=42,rn=51,S0=49,Ra={basic:[{step:0,pitch:nn,vel:110},{step:0,pitch:Rt,vel:80},{step:2,pitch:Rt,vel:70},{step:4,pitch:jn,vel:100},{step:4,pitch:Rt,vel:80},{step:6,pitch:Rt,vel:70},{step:8,pitch:nn,vel:100},{step:10,pitch:Rt,vel:70},{step:12,pitch:jn,vel:100},{step:12,pitch:Rt,vel:80},{step:14,pitch:Rt,vel:70}],rock:[{step:0,pitch:nn,vel:120},{step:0,pitch:S0,vel:90},{step:4,pitch:jn,vel:110},{step:4,pitch:Rt,vel:80},{step:8,pitch:nn,vel:110},{step:8,pitch:Rt,vel:80},{step:10,pitch:nn,vel:90},{step:12,pitch:jn,vel:110},{step:12,pitch:Rt,vel:80}],swing:[{step:0,pitch:rn,vel:90},{step:3,pitch:rn,vel:70},{step:4,pitch:rn,vel:80},{step:8,pitch:rn,vel:90},{step:11,pitch:rn,vel:70},{step:12,pitch:rn,vel:80},{step:4,pitch:nn,vel:80},{step:12,pitch:jn,vel:70}]},Ol={root:0,scale:"pentatonic",tempo:120,bars:8,progression:"pop",drumPattern:"basic",density:.5,octave:4,seed:0};function k0(e){let t=e|0;return()=>{t=t+1831565813|0;let n=Math.imul(t^t>>>15,1|t);return n=n+Math.imul(n^n>>>7,61|n)^n,((n^n>>>14)>>>0)/4294967296}}let Bl=1;const lr=()=>Bl++,Gl=e=>60/e,w0=e=>Gl(e)/4;function ia(e,t,n,a){const s=t.length,i=Math.floor(n/s),o=(n%s+s)%s;return e+t[o]+(a+i)*12}function Wl(e=Ol){Bl=1;const t=e.seed>0?k0(e.seed):Math.random,n=ja[e.scale]??ja.pentatonic,a=Ma[e.progression]??Ma.pop,s=Ra[e.drumPattern]??Ra.basic,i=Gl(e.tempo),o=w0(e.tempo),l=Math.max(1,e.bars),c=16,u=[],h=[],p=[],g=[];let y=0;for(let m=0;m<l;m++){const x=m*4*i,b=m%a.length,f=a[b];for(const v of f)p.push({id:lr(),pitch:ia(e.root,n,v,e.octave-1),start:x,duration:4*i-.01,velocity:70+Math.floor(t()*20)});const k=f[0];for(let v=0;v<4;v++){const w=v===2?k+(t()>.5?2:0):k;h.push({id:lr(),pitch:ia(e.root,n,w,e.octave-2),start:x+v*i,duration:i*.9,velocity:80+Math.floor(t()*30)})}for(let v=0;v<c;v++){if(t()>e.density)continue;const w=x+v*o,R=t()>.8?t()>.5?2:-2:t()>.5?1:-1;y=Math.max(-3,Math.min(n.length+3,y+R));const M=1+Math.floor(t()*3);u.push({id:lr(),pitch:ia(e.root,n,y,e.octave),start:w,duration:M*o*.95,velocity:85+Math.floor(t()*30)})}for(const v of s)g.push({id:lr(),pitch:v.pitch,start:x+v.step*o,duration:o*.8,velocity:v.vel+Math.floor(t()*10-5)})}return{melody:u,bass:h,chords:p,drums:g,config:e}}const C0=Object.keys(ja),j0=Object.keys(Ma),M0=Object.keys(Ra),R0=Wl;function qe(e,t,n){return{cc:e,paramId:n,label:`Knob ${t}`,controlType:"knob",min:0,max:127,inverted:!1}}function Un(e,t,n){return{cc:e,paramId:n,label:t,controlType:"fader",min:0,max:127,inverted:!1}}function an(e,t,n){return{cc:e,paramId:n,label:t,controlType:"button",min:0,max:127,inverted:!1}}const Vl={id:"oxygen25",name:"M-Audio Oxygen 25 (MkIV)",deviceMatch:"OXYGEN",mappings:[qe(21,1,"mixer.volume"),qe(22,2,"mixer.pan"),qe(23,3,"fx.reverb"),qe(24,4,"fx.delay"),qe(25,5,"fx.chorus"),qe(26,6,"fx.filter"),qe(27,7,"fx.drive"),qe(28,8,"fx.eq"),Un(7,"Master Fader","mixer.master"),an(115,"Play","transport.play"),an(114,"Stop","transport.stop"),an(117,"Record","transport.record"),an(112,"Rewind","transport.rewind"),an(113,"Forward","transport.forward"),an(116,"Loop","transport.loop")]},Ul={id:"mpk-mini",name:"Akai MPK Mini",deviceMatch:"MPK",mappings:[qe(1,1,"mixer.volume"),qe(2,2,"mixer.pan"),qe(3,3,"fx.reverb"),qe(4,4,"fx.delay"),qe(5,5,"fx.chorus"),qe(6,6,"fx.filter"),qe(7,7,"fx.drive"),qe(8,8,"fx.eq")]},ql={id:"minilab",name:"Arturia MiniLab",deviceMatch:"Arturia MiniLab",mappings:[qe(7,1,"mixer.volume"),qe(74,2,"mixer.pan"),qe(71,3,"fx.reverb"),qe(76,4,"fx.delay"),qe(77,5,"fx.chorus"),qe(93,6,"fx.filter"),qe(73,7,"fx.drive"),qe(75,8,"fx.eq"),Un(1,"Mod Wheel","mixer.master")]},Hl=(function(){return{id:"launch-control-xl",name:"Novation Launch Control XL",deviceMatch:"Launch Control",mappings:[...Array.from({length:8},(e,t)=>qe(13+t,t+1,`mixer.send${t+1}`)),...Array.from({length:8},(e,t)=>Un(77+t,`Fader ${t+1}`,`mixer.track${t+1}`))]}})(),as={id:"generic",name:"Generic MIDI Controller",deviceMatch:"",mappings:[qe(1,1,"mixer.modWheel"),Un(7,"Volume","mixer.volume"),qe(10,2,"mixer.pan"),Un(11,"Expression","mixer.expression")]},Kl=[Vl,Ul,ql,Hl,as];class N0{constructor(t){this.ccMap=new Map,this.onChange=null,this.profile=t??as,this.rebuildMap()}setProfile(t){this.profile=t,this.rebuildMap()}getProfile(){return this.profile}autoDetect(t){const n=t.toUpperCase(),a=Kl.find(s=>s.deviceMatch&&n.includes(s.deviceMatch.toUpperCase()));return a?(this.setProfile(a),a):null}onMappedChange(t){this.onChange=t}handleCC(t,n){var c;const a=this.ccMap.get(t);if(!a)return null;const i=(a.inverted?127-n:n)/127,o=a.min+i*(a.max-a.min),l={paramId:a.paramId,label:a.label,rawValue:n,scaledValue:o,normalizedValue:i};return(c=this.onChange)==null||c.call(this,l),l}setMapping(t,n,a,s="knob"){const i={cc:t,paramId:n,label:a,controlType:s,min:0,max:127,inverted:!1},o=this.profile.mappings.findIndex(l=>l.cc===t);o>=0?this.profile.mappings[o]=i:this.profile.mappings.push(i),this.ccMap.set(t,i)}removeMapping(t){this.profile.mappings=this.profile.mappings.filter(n=>n.cc!==t),this.ccMap.delete(t)}getMappings(){return[...this.profile.mappings]}getMapping(t){return this.ccMap.get(t)}exportConfig(){return{...this.profile,mappings:this.profile.mappings.map(t=>({...t}))}}importConfig(t){this.profile={...t,mappings:t.mappings.map(n=>({...n}))},this.rebuildMap()}static createCustomProfile(t,n){return{id:`custom-${t.toLowerCase().replace(/\s+/g,"-")}`,name:t,deviceMatch:"",mappings:n.map(a=>({...a,min:0,max:127,inverted:!1}))}}rebuildMap(){this.ccMap.clear();for(const t of this.profile.mappings)this.ccMap.set(t.cc,t)}}function ss(e=60){return{active:!1,note:e,velocity:100,gate:.8,probability:1,slide:!1}}function Zt(e="New Pattern",t=16,n=120){return{name:e,length:t,steps:Array.from({length:t},()=>ss()),bpm:n,swing:0,rootNote:60}}function Yl(e,t){const n=e.steps.map((a,s)=>s===t?{...a,active:!a.active}:a);return{...e,steps:n}}function Zl(e,t,n){const a=e.steps.map((s,i)=>i===t?{...s,note:Math.max(0,Math.min(127,n))}:s);return{...e,steps:a}}function Xl(e,t,n){const a=e.steps.map((s,i)=>i===t?{...s,velocity:Math.max(0,Math.min(127,n))}:s);return{...e,steps:a}}function Ql(e,t,n){const a=e.steps.map((s,i)=>i===t?{...s,gate:Math.max(0,Math.min(1,n))}:s);return{...e,steps:a}}function Jl(e,t,n){const a=e.steps.map((s,i)=>i===t?{...s,probability:Math.max(0,Math.min(1,n))}:s);return{...e,steps:a}}function ec(e,t){const n=e.steps.map((a,s)=>s===t?{...a,slide:!a.slide}:a);return{...e,steps:n}}function tc(e,t){const n=e.steps.map(a=>a.active?{...a,note:Math.max(0,Math.min(127,a.note+t))}:a);return{...e,steps:n,rootNote:Math.max(0,Math.min(127,e.rootNote+t))}}function nc(e){return{...e,steps:[...e.steps].reverse()}}function rc(e,t){const n=e.steps.length,a=(t%n+n)%n,s=[...e.steps.slice(a),...e.steps.slice(0,a)];return{...e,steps:s}}function ac(e,t=60,n=127){const a=e.steps.map(s=>s.active?{...s,velocity:Math.floor(t+Math.random()*(n-t+1))}:s);return{...e,steps:a}}function sc(e){return{...e,steps:e.steps.map(()=>ss(e.rootNote))}}function is(e,t=4){return 60/e/t}function ic(e,t,n=0,a=4){const s=is(t,a),i=e*s;return e%2===1&&n>0?i+s*n*.5:i}function oc(e){return e.active&&Math.random()<e.probability}function T0(){const e=Zt("Kick",16);return[0,4,8,12].forEach(t=>{e.steps[t]={...e.steps[t],active:!0,note:36,velocity:110}}),e}function P0(){const e=Zt("Snare",16);return[4,12].forEach(t=>{e.steps[t]={...e.steps[t],active:!0,note:38,velocity:100}}),e}function E0(){const e=Zt("Hi-Hat",16);for(let t=0;t<16;t+=2)e.steps[t]={...e.steps[t],active:!0,note:42,velocity:80};return e}function $0(e=60){const t=Zt("Arp",16,120);return[0,4,7,12,7,4,0,-5,0,3,7,12,7,3,0,-5].forEach((a,s)=>{t.steps[s]={...t.steps[s],active:!0,note:e+a,velocity:90,gate:.5}}),{...t,rootNote:e}}function A0(e=36){const t=Zt("Bassline",16,120),n=[0,0,7,0,5,5,3,0,0,0,7,12,5,5,3,0],a=[1,0,1,0,1,0,1,1,1,0,1,1,1,0,1,0];return n.forEach((s,i)=>{t.steps[i]={...t.steps[i],active:!!a[i],note:e+s,velocity:100,gate:.7}}),{...t,rootNote:e}}function I0(e){return JSON.stringify(e,null,2)}function L0(e){try{const t=JSON.parse(e);return!t||!Array.isArray(t.steps)?null:t}catch{return null}}function _0(e={}){const{onTrigger:t,onLFOOutput:n,initialPattern:a}=e,[s,i]=d.useState(()=>a??Zt()),[o,l]=d.useState(-1),[c,u]=d.useState(!1),[h,p]=d.useState([]),g=d.useRef(s);g.current=s;const y=d.useRef(h);y.current=h;const m=d.useRef(c);m.current=c;const x=d.useRef(t);x.current=t;const b=d.useRef(n);b.current=n;const f=d.useRef(null),k=d.useRef(0),v=d.useRef(0),w=d.useCallback(()=>{var q,X;if(!m.current)return;const S=g.current,B=k.current%S.length,H=S.steps[B];if(oc(H)){const re=ic(k.current,S.bpm,S.swing);(q=x.current)==null||q.call(x,H,B,re)}const z=(Date.now()-v.current)/1e3;for(let re=0;re<y.current.length;re++){const oe=y.current[re];if(oe.enabled&&oe.targetCC!==void 0){const se=Ia(oe,z,S.bpm);(X=b.current)==null||X.call(b,re,oe.targetCC,se)}}l(B),k.current++;const Z=is(S.bpm)*1e3,E=B%2===0?0:Z*S.swing*.5;f.current=setTimeout(w,Z+E)},[]),R=d.useCallback(()=>{m.current||(k.current=0,v.current=Date.now(),u(!0),m.current=!0,w())},[w]),M=d.useCallback(()=>{u(!1),m.current=!1,l(-1),f.current&&(clearTimeout(f.current),f.current=null)},[]),j=d.useCallback(()=>{m.current?M():R()},[R,M]);d.useEffect(()=>()=>{f.current&&clearTimeout(f.current)},[]);const T=d.useCallback(S=>i(B=>Yl(B,S)),[]),P=d.useCallback((S,B)=>i(H=>Zl(H,S,B)),[]),A=d.useCallback((S,B)=>i(H=>Xl(H,S,B)),[]),I=d.useCallback((S,B)=>i(H=>Ql(H,S,B)),[]),L=d.useCallback((S,B)=>i(H=>Jl(H,S,B)),[]),N=d.useCallback(S=>i(B=>ec(B,S)),[]),_=d.useCallback(S=>i(B=>tc(B,S)),[]),ee=d.useCallback(()=>i(S=>nc(S)),[]),Y=d.useCallback(S=>i(B=>rc(B,S)),[]),O=d.useCallback((S,B)=>i(H=>ac(H,S,B)),[]),U=d.useCallback(()=>i(S=>sc(S)),[]),V=d.useCallback(S=>i(B=>({...B,bpm:Math.max(20,Math.min(300,S))})),[]),K=d.useCallback(S=>i(B=>({...B,swing:Math.max(0,Math.min(1,S))})),[]),G=d.useCallback(S=>{i(B=>{if(B.length===S)return B;const H=Array.from({length:S},(z,Z)=>Z<B.steps.length?B.steps[Z]:{active:!1,note:B.rootNote,velocity:100,gate:.8,probability:1,slide:!1});return{...B,length:S,steps:H}})},[]),W=d.useCallback(S=>{p(B=>[...B,S??_r()])},[]),C=d.useCallback(S=>{p(B=>B.filter((H,z)=>z!==S))},[]),$=d.useCallback((S,B)=>{p(H=>H.map((z,Z)=>Z===S?{...z,...B}:z))},[]);return{pattern:s,currentStep:o,playing:c,lfos:h,play:R,stop:M,togglePlayback:j,toggle:T,setNote:P,setVelocity:A,setGate:I,setProbability:L,toggleSlide:N,transpose:_,reverse:ee,shift:Y,randomizeVel:O,clear:U,setPattern:i,setBpm:V,setSwing:K,setLength:G,addLFO:W,removeLFO:C,updateLFO:$}}function os(e){const t=d.useRef(null),n=d.useRef(new Map),a=d.useRef(1),s=d.useCallback(()=>{if(!t.current){const o=e();o.onmessage=l=>{const{id:c}=l.data,u=n.current.get(c);u&&(n.current.delete(c),u.resolve(l.data))},o.onerror=l=>{console.error("[useWorker] Worker error:",l.message);for(const[c,u]of n.current)u.reject(new Error(`Worker error: ${l.message}`));n.current.clear(),o.terminate(),t.current=null},t.current=o}return t.current},[e]);return d.useEffect(()=>{const o=n.current;return()=>{var l;(l=t.current)==null||l.terminate(),t.current=null;for(const[,c]of o)c.reject(new Error("Worker terminated on unmount"));o.clear()}},[]),d.useCallback((o,l)=>{const c=a.current++,u=s();return new Promise((h,p)=>{n.current.set(c,{resolve:h,reject:p}),u.postMessage({...o,id:c},l??[])})},[s])}function z0(){const e=os(d.useCallback(()=>new Worker(new URL("/assets/pitchWorker-BgAp5Z97.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:vt&&vt.tagName.toUpperCase()==="SCRIPT"&&vt.src||new URL("index.cjs",document.baseURI).href),{type:"module"}),[]));return d.useCallback(async(n,a,s=.01)=>(await e({buffer:n,sampleRate:a,rmsThreshold:s})).hz,[e])}function D0(){const e=os(d.useCallback(()=>new Worker(new URL("/assets/scoringWorker-3JjtDDtu.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:vt&&vt.tagName.toUpperCase()==="SCRIPT"&&vt.src||new URL("index.cjs",document.baseURI).href),{type:"module"}),[]));return d.useCallback(async(n,a,s)=>(await e({notes:n,points:a,params:s})).result,[e])}const F0={fftSize:2048,smoothingTimeConstant:.8,enablePitchDetection:!0,enableBeatDetection:!0,enableLevelMeter:!0,beatThreshold:.15};function lc(){return`
71
+ Tame Impala - Let It Happen`,rows:10,style:{width:"100%",padding:12,borderRadius:6,border:"1px solid var(--nice-border, #e2e8f0)",fontFamily:"monospace",fontSize:13,resize:"vertical"}}),r.jsx("button",{style:{...Ln,opacity:K.trim().length===0?.5:1},disabled:K.trim().length===0,onClick:()=>$(K),type:"button",children:u("importWizard.parseTracks","Parse Tracks")})]}),(g!==99||j.length>0)&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[r.jsxs("p",{style:{margin:0,fontWeight:600},children:[b==null?void 0:b.name," — ",C.size,"/",j.length," ",u("importWizard.selected","selected")]}),r.jsx("button",{style:sr,onClick:w,type:"button",children:C.size===j.length?u("importWizard.deselectAll","Deselect All"):u("importWizard.selectAll","Select All")})]}),M?r.jsx("div",{style:{textAlign:"center",padding:32,color:"var(--nice-text-dim, #64748b)"},children:u("importWizard.loadingTracks","Loading tracks…")}):r.jsx("div",{style:{maxHeight:320,overflowY:"auto"},children:r.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13},children:[r.jsx("thead",{children:r.jsxs("tr",{style:{borderBottom:"1px solid var(--nice-border, #e2e8f0)",textAlign:"left"},children:[r.jsx("th",{style:{padding:"4px 8px",width:32}}),r.jsx("th",{style:{padding:"4px 8px"},children:u("importWizard.colTitle","Title")}),r.jsx("th",{style:{padding:"4px 8px"},children:u("importWizard.artist","Artist")}),r.jsx("th",{style:{padding:"4px 8px"},children:u("importWizard.album","Album")}),r.jsx("th",{style:{padding:"4px 8px",textAlign:"right"},children:u("importWizard.duration","Duration")})]})}),r.jsx("tbody",{children:j.map(D=>{const J=C.has(D.externalId);return r.jsxs("tr",{style:{borderBottom:"1px solid var(--nice-border, #e2e8f0)",opacity:J?1:.5,cursor:"pointer"},onClick:()=>Z(D.externalId),children:[r.jsx("td",{style:{padding:"6px 8px"},children:r.jsx("input",{type:"checkbox",checked:J,readOnly:!0})}),r.jsx("td",{style:{padding:"6px 8px",fontWeight:500},children:D.title}),r.jsx("td",{style:{padding:"6px 8px",color:"var(--nice-text-dim, #64748b)"},children:D.artist}),r.jsx("td",{style:{padding:"6px 8px",color:"var(--nice-text-dim, #64748b)"},children:D.album??"—"}),r.jsx("td",{style:{padding:"6px 8px",textAlign:"right",color:"var(--nice-text-dim, #64748b)"},children:dm(D.duration)})]},D.externalId)})})]})}),r.jsx("div",{style:{display:"flex",justifyContent:"flex-end"},children:r.jsxs("button",{style:{...Ln,opacity:C.size===0?.5:1},disabled:C.size===0,onClick:()=>p("options"),type:"button",children:[u("importWizard.next","Next")," ",r.jsx(B.NtdArrowRight,{size:12})]})})]})]}),X=()=>r.jsxs("div",{style:{display:"grid",gap:16},children:[r.jsx("p",{style:{margin:0,fontWeight:600},children:u("importWizard.importOptions","Import options")}),r.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,cursor:"pointer"},children:[r.jsx("input",{type:"checkbox",checked:_.mergeTags,onChange:D=>ee(J=>({...J,mergeTags:D.target.checked}))}),u("importWizard.mergeTags","Merge tags from source playlist")]}),r.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,cursor:"pointer"},children:[r.jsx("input",{type:"checkbox",checked:_.mergeFolders,onChange:D=>ee(J=>({...J,mergeFolders:D.target.checked}))}),u("importWizard.mergeFolders","Merge into existing folder structure")]}),r.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,cursor:"pointer"},children:[r.jsx("input",{type:"checkbox",checked:_.overwriteExisting,onChange:D=>ee(J=>({...J,overwriteExisting:D.target.checked}))}),u("importWizard.overwrite","Overwrite existing tracks (match by ISRC)")]}),l&&l.length>0&&r.jsxs("div",{style:{display:"grid",gap:4},children:[r.jsx("label",{style:{fontSize:13,fontWeight:500},children:u("importWizard.targetFolder","Target folder")}),r.jsxs("select",{style:{padding:"6px 10px",borderRadius:6,border:"1px solid var(--nice-border, #e2e8f0)"},value:_.targetFolderId??"",onChange:D=>ee(J=>({...J,targetFolderId:D.target.value||void 0})),children:[r.jsx("option",{value:"",children:u("importWizard.root","— Root —")}),l.map(D=>r.jsx("option",{value:D.id,children:D.name},D.id))]})]}),r.jsx("div",{style:{marginTop:8,padding:12,borderRadius:8,background:"var(--nice-info-bg, #eff6ff)",fontSize:13},children:u("importWizard.summary",'Ready to import {count} tracks from "{name}"').replace("{count}",String(C.size)).replace("{name}",(b==null?void 0:b.name)??"")}),r.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:8},children:[r.jsxs("button",{style:sr,onClick:F,type:"button",children:[r.jsx(B.NtdArrowLeft,{size:12})," ",u("importWizard.back","Back")]}),r.jsx("button",{style:Ln,onClick:R,type:"button",children:u("importWizard.startImport","Start Import")})]})]}),re=()=>{const D=T?Math.round(T.imported/T.total*100):0;return r.jsxs("div",{style:{display:"grid",gap:16,textAlign:"center",padding:24},children:[r.jsx("p",{style:{margin:0,fontWeight:600,fontSize:18},children:u("importWizard.importing","Importing…")}),r.jsx("div",{style:{height:8,borderRadius:4,background:"var(--nice-border, #e2e8f0)",overflow:"hidden"},children:r.jsx("div",{style:{height:"100%",width:`${D}%`,background:"var(--nice-color-accent, #6366f1)",borderRadius:4,transition:"width 0.3s"}})}),T&&r.jsxs("div",{style:{fontSize:13,color:"var(--nice-text-dim, #64748b)"},children:[T.imported," / ",T.total," ",u("importWizard.tracks","tracks"),T.currentTrack&&r.jsxs("div",{style:{marginTop:4},children:[r.jsx(B.NtdMusic,{size:12})," ",T.currentTrack]})]})]})},oe=()=>r.jsxs("div",{style:{display:"grid",gap:16,textAlign:"center",padding:24},children:[r.jsx("span",{style:{display:"inline-flex",justifyContent:"center"},"aria-hidden":"true",children:r.jsx(B.NtdCheck,{size:48})}),r.jsx("p",{style:{margin:0,fontWeight:600,fontSize:18},children:u("importWizard.complete","Import Complete")}),A&&r.jsxs("div",{style:{display:"grid",gap:4,fontSize:14},children:[r.jsxs("div",{children:[r.jsx("strong",{children:A.imported})," ",u("importWizard.imported","imported")]}),A.skipped>0&&r.jsxs("div",{style:{color:"var(--nice-color-warning, #f59e0b)"},children:[A.skipped," ",u("importWizard.skipped","skipped (duplicates)")]}),A.failed>0&&r.jsxs("div",{style:{color:"var(--nice-color-error, #ef4444)"},children:[A.failed," ",u("importWizard.failed","failed")]}),A.failedTracks.length>0&&r.jsxs("details",{style:{textAlign:"left",marginTop:8,fontSize:12,color:"var(--nice-text-dim, #64748b)"},children:[r.jsx("summary",{style:{cursor:"pointer"},children:u("importWizard.showFailed","Show failed tracks")}),r.jsx("ul",{style:{marginTop:4,paddingLeft:20},children:A.failedTracks.map((D,J)=>r.jsx("li",{children:D},J))})]})]}),r.jsx("button",{style:Ln,onClick:o,type:"button",children:u("importWizard.done","Done")})]}),se={connect:u("importWizard.stepConnect","Connect"),browse:u("importWizard.stepBrowse","Browse"),tracks:u("importWizard.stepTracks","Select Tracks"),options:u("importWizard.stepOptions","Options"),importing:u("importWizard.stepImporting","Importing"),done:u("importWizard.stepDone","Done")};return r.jsxs("div",{style:im,children:[Y(),r.jsxs("div",{style:om,children:[r.jsxs("h2",{style:{margin:0,fontSize:18},children:[u("importWizard.title","Import Playlist")," — ",se[h]]}),S&&r.jsxs("button",{style:sr,onClick:F,type:"button",children:[r.jsx(B.NtdArrowLeft,{size:12})," ",u("importWizard.back","Back")]}),h==="connect"&&r.jsx("button",{style:sr,onClick:o,type:"button","aria-label":u("importWizard.close","Close"),title:u("importWizard.close","Close"),children:r.jsx(B.NtdClose,{size:14})})]}),L&&r.jsx("div",{style:{padding:12,borderRadius:8,background:"var(--nice-error-bg, #fef2f2)",color:"var(--nice-color-error, #ef4444)",fontSize:13},children:L}),h==="connect"&&O(),h==="browse"&&U(),h==="tracks"&&q(),h==="options"&&X(),h==="importing"&&re(),h==="done"&&oe()]})},hm=[{id:"concert-harp",name:"Concert Harp",description:"Warm concert harp",icon:"music",dir:"concert-harp",attribution:"ConcertHarp SoundFont — source: musical-artifacts.com/artifacts/375"},{id:"celtic-harp",name:"Celtic Harp",description:"Bright celtic harp",icon:"leaf",dir:"celtic-harp"},{id:"triangle",name:"Triangle",description:"Metallic percussion triangle",icon:"triangle",dir:"triangle",attribution:"Triangle SoundFont — source: polyphone.io/en/soundfonts/unpitched-percussion/298-triangle"},{id:"synth",name:"Celesta",description:"Synthesized celesta / music-box",icon:"sparkle",dir:"synth"},{id:"none",name:"Silent",description:"No sound on click",icon:"volumeMute",dir:null}],pm="concert-harp",ns=Object.fromEntries(hm.map(e=>[e.id,e])),fm="nice2dev-note-sound-set";function Tl(){try{const e=localStorage.getItem(fm);if(e&&ns[e])return e}catch{}return pm}const Ir=["quarter","eighth","sixteenth","beamed"];function Pl(e,t,n){const a=n*.2,s=n*.15,i=Math.max(1,n*.07),o=n*.72,l=n*.34,c=new Path2D,u=h=>{c.moveTo(h+a,l),c.ellipse(h,l,a,s,-.4,0,Math.PI*2),c.rect(h+a-i,l-o,i,o)};if(t==="beamed"){const h=-n*.24,p=n*.24;u(h),u(p),c.rect(h+a-i,l-o,p-h+i,n*.12)}else{const h=-a*.5;u(h);const p=t==="eighth"?1:t==="sixteenth"?2:0,g=h+a;for(let y=0;y<p;y++){const m=l-o+y*n*.2;c.moveTo(g,m),c.quadraticCurveTo(g+n*.32,m+n*.14,g+n*.18,m+n*.42),c.quadraticCurveTo(g+n*.2,m+n*.22,g,m+n*.14),c.closePath()}}e.stroke(c),e.fill(c)}function pi(e){return getComputedStyle(document.documentElement).getPropertyValue(e).trim()}function El(e){if(!e)return null;const t=document.createElement("canvas").getContext("2d");if(!t)return null;t.fillStyle=e;const n=t.fillStyle;if(n.startsWith("#")){const s=parseInt(n.slice(1),16);return{r:s>>16&255,g:s>>8&255,b:s&255}}const a=n.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);return a?{r:+a[1],g:+a[2],b:+a[3]}:null}function aa(e,t){const n=El(e);return n?`rgba(${n.r},${n.g},${n.b},${t})`:`rgba(255,255,255,${t})`}function mm(e){const t=El(e);return t?(.299*t.r+.587*t.g+.114*t.b)/255:1}function $l(){const e=pi("--text-primary")||ve.resolveCssColor("var(--nice-overlay-light-95, rgba(255, 255, 255, 0.95))"),t=pi("--nav-active")||"goldenrod",n=document.documentElement.getAttribute("data-theme")==="dark",s=mm(e)<.45;return{base:aa(e,.92),staffLine:aa(e,.22),outline:ve.resolveCssColor(s?"var(--nice-overlay-light-75, rgba(255, 255, 255, 0.75))":"var(--nice-overlay-55, rgba(0, 0, 0, 0.55))"),accents:[aa(t,.95)],isDark:n,notesDark:s}}const Gr=typeof navigator<"u"&&/Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent),Al=46,St=5,mr=4,gm=(Al-(St-1)*mr)/2,ym=6,vm=18,bm=110,xm=50,Wr=Gr?xm:bm,Sm=Gr?4:2,km=Gr?2:4,fi=Gr?1:0,wm=180,mi=2.8,gi=40,Cm=14,yi=1.2,jm=16,sa=[64,67,71,74,77],ln=64,_n=77;function Mm(e){const t=Math.max(0,Math.min(St-1,e)),n=Math.floor(t),a=Math.min(n+1,St-1),s=t-n;return Math.round(sa[n]+(sa[a]-sa[n])*s)}function Rm(e){return(Math.max(ln-1*(_n-ln)/(St-1),Math.min(_n+1*(_n-ln)/(St-1),e))-ln)/(_n-ln)*(St-1)}const vi=2.5,bi=.72,Nm=.55,Dn=new Map;let gr=null;async function Tm(e){const t=e??Tl(),n=ns[t];if(!n||!n.dir){Dn.clear(),gr=t;return}if(gr===t&&Dn.size>0)return;Dn.clear(),gr=t;const a=qn(),s=[];for(let i=ln;i<=_n;i++)s.push(fetch(`/assets/soundfonts/notes/${n.dir}/note-${i}.mp3`).then(o=>o.arrayBuffer()).then(o=>a.decodeAudioData(o)).then(o=>{Dn.set(i,o)}).catch(()=>{}));await Promise.all(s)}function xi(e){const t=Dn.get(e);if(!t)return;const n=qn(),a=n.createBufferSource();a.buffer=t;const s=n.createGain();s.gain.value=.7,a.connect(s).connect(n.destination),a.start()}function Pm(e){return()=>{e|=0,e=e+1831565813|0;let t=Math.imul(e^e>>>15,1|e);return t=t+Math.imul(t^t>>>7,61|t)^t,((t^t>>>14)>>>0)/4294967296}}function Em(e){const t=Pm(42),n=[];for(let a=0;a<e;a++){const i=t()<.15?0:-1;n.push({x:t(),lineIdx:t()*(St+1)-.5,shape:Ir[Math.floor(t()*Ir.length)],rot:(t()-.5)*50,size:10+t()*4,colorIdx:i})}return n.sort((a,s)=>a.x-s.x),n}const ut=Em(Wr),Cn=new Float32Array(Wr),ir=new Float32Array(Wr),zn=new Float32Array(Wr);let wa=!1;const $m=(St-1)/2;function Am(){if(!wa){wa=!0;for(let e=0;e<ut.length;e++)zn[e]=ut[e].lineIdx}}let Ca=[],Si="";function Im(e){return`${e.base}|${e.outline}|${e.accents.join(",")}`}function Lm(e){const t=Im(e);t===Si&&Ca.length===ut.length||(Si=t,Ca=ut.map(n=>{const a=Math.ceil(n.size*1.6),s=a*2,i=document.createElement("canvas");i.width=s,i.height=s;const o=i.getContext("2d");return o.translate(a,a),o.rotate(n.rot*Math.PI/180),o.lineWidth=1.8,o.strokeStyle=e.outline,o.fillStyle=n.colorIdx<0?e.base:e.accents[n.colorIdx%e.accents.length],Pl(o,n.shape,n.size*1.3),{canvas:i,ox:a,oy:a}}))}function _m({pitchMidiRef:e}={}){const{t}=xe(),n=d.useRef(null),a=d.useRef(0),s=d.useRef(0),i=d.useRef(0),o=d.useRef(null),l=d.useRef(0),c=d.useRef(0),u=d.useRef(null),h=d.useRef(null),p=d.useRef(!1),g=d.useCallback((b,f,j)=>{const v=gm+b*mr,C=f/j*Math.PI*2;return v+Math.sin(C)*ym},[]),y=d.useCallback(b=>{const f=n.current;if(!f)return;if(c.current++,fi>0&&c.current%(fi+1)!==0){i.current=b,a.current=requestAnimationFrame(y);return}const j=f.getContext("2d");if(!j)return;const v=Math.min(window.devicePixelRatio||1,km),C=f.getBoundingClientRect(),N=C.width,M=C.height;(f.width!==Math.round(N*v)||f.height!==Math.round(M*v))&&(f.width=Math.round(N*v),f.height=Math.round(M*v),j.setTransform(v,0,0,v,0,0));const k=i.current?(b-i.current)/1e3:0;i.current=b,s.current=(s.current+vm*k)%N,j.clearRect(0,0,N,M),l.current++,(!o.current||l.current%60===0)&&(o.current=$l());const T=o.current;Lm(T),j.strokeStyle=T.staffLine,j.lineWidth=.7;for(let L=0;L<St;L++){j.beginPath();for(let P=0;P<=N;P+=Sm){const _=g(L,P,N);P===0?j.moveTo(P,_):j.lineTo(P,_)}j.stroke()}const E=s.current,A=(e==null?void 0:e.current)??null;if(A!==null){Am();const L=Rm(A),P=vi*k;for(let _=0;_<ut.length;_++){const K=(ut[_].lineIdx-$m)*Nm,V=L*bi+(L+K)*(1-bi)-zn[_];zn[_]+=V>0?Math.min(P,V):Math.max(-P,V)}}else if(wa){const L=vi*.4*k;for(let P=0;P<ut.length;P++){const ee=ut[P].lineIdx-zn[P];zn[P]+=ee>0?Math.min(L,ee):Math.max(-L,ee)}}const I=u.current;I&&(I.timer-=k,I.timer<=0&&(u.current=null));for(let L=0;L<ut.length;L++){const P=ut[L];if(ir[L]>0){ir[L]-=k;const K=Math.max(0,ir[L]/mi);Cn[L]+=wm*K*k,Cn[L]>N&&(Cn[L]-=N)}const _=Ca[L];if(!_)continue;const ee=P.lineIdx;for(let K=0;K<2;K++){let V=((P.x*N-E-Cn[L]+K*N)%N+N)%N;const W=g(Math.max(0,Math.min(St-1,Math.round(ee))),V,N),H=(ee-Math.round(ee))*mr;let G=W+H;if(I&&I.timer>0){const Z=V-I.x,w=G-I.y,R=Math.sqrt(Z*Z+w*w);if(R<gi&&R>.1){const S=I.timer/yi,F=Cm*(1-R/gi)*S;V+=Z/R*F,G+=w/R*F}}j.drawImage(_.canvas,V-_.ox,G-_.oy)}}a.current=requestAnimationFrame(y)},[g,e]),m=d.useCallback(b=>{const f=n.current;if(!f)return;const j=f.getBoundingClientRect(),v=b.clientX-j.left,C=b.clientY-j.top,N=j.width,M=s.current;let k=1/0,T=-1;for(let E=0;E<ut.length;E++){const A=ut[E],L=((A.x*N-M-Cn[E])%N+N)%N,P=g(Math.max(0,Math.min(St-1,Math.round(A.lineIdx))),L,N),_=(A.lineIdx-Math.round(A.lineIdx))*mr,ee=P+_,K=L-v,z=ee-C,V=K*K+z*z;V<k&&(k=V,T=E)}if(T>=0&&Math.sqrt(k)<jm){ir[T]=mi;const E=ut[T],A=Mm(E.lineIdx);try{Yt();const I=Tl(),L=ns[I];L!=null&&L.dir&&(gr!==I||!p.current?(p.current=!0,Tm(I).then(()=>xi(A))):xi(A))}catch{}}u.current={x:v,y:C,timer:yi}},[g]),x=d.useCallback(b=>{const f=n.current;if(!f)return;const j=f.getBoundingClientRect(),v=b.clientX-j.left,C=b.clientY-j.top;h.current={x:v,y:C},u.current&&u.current.timer>0&&(u.current.x=v,u.current.y=C)},[]);return d.useEffect(()=>(a.current=requestAnimationFrame(y),()=>cancelAnimationFrame(a.current)),[y]),r.jsx("canvas",{ref:n,"aria-hidden":"true",role:"img","aria-label":t("noteRiver.noteRiverAnimationCanvas","Note river animation canvas"),onClick:m,onMouseMove:x,style:{display:"block",width:"100%",height:Al,marginBottom:5,cursor:"pointer",background:"transparent"}})}const Dm=14,zm=.9,Fm=320,Om=160,Bm=6,ki=8,Gm=14;function Wm(){const{t:e}=xe(),t=d.useRef(null),n=d.useRef([]),a=d.useRef(0),s=d.useRef(0),i=d.useRef([]),o=d.useRef(null),l=d.useRef(0),c=d.useCallback((h,p)=>{for(let g=0;g<Dm;g++){const y=Math.random()*Math.PI*2,m=Om*(.4+Math.random()*.6),x=zm*(.6+Math.random()*.4),b=Math.random()<.15?0:-1;n.current.push({x:h,y:p,vx:Math.cos(y)*m,vy:Math.sin(y)*m-60,rot:Math.random()*Math.PI*2,vr:(Math.random()-.5)*Bm*2,size:ki+Math.random()*(Gm-ki),shape:Ir[Math.floor(Math.random()*Ir.length)],life:x,maxLife:x,colorIdx:b})}},[]),u=d.useCallback(h=>{const p=t.current;if(!p){a.current=requestAnimationFrame(u);return}const g=p.getContext("2d");if(!g){a.current=requestAnimationFrame(u);return}const y=window.devicePixelRatio||1,m=window.innerWidth,x=window.innerHeight;(p.width!==Math.round(m*y)||p.height!==Math.round(x*y))&&(p.width=Math.round(m*y),p.height=Math.round(x*y),p.style.width=`${m}px`,p.style.height=`${x}px`,g.setTransform(y,0,0,y,0,0));const b=s.current?Math.min((h-s.current)/1e3,.05):0;s.current=h,g.clearRect(0,0,m,x),l.current++,(!o.current||l.current%60===0)&&(o.current=$l());const f=o.current;{const v=ve.getInputEngine().gamepadSnapshot;for(let C=0;C<v.length;C++){const N=v[C];for(let M=0;M<N.buttons.length;M++){const k=N.index*100+M,T=N.buttons[M].pressed;T&&!i.current[k]&&c(m/2,x/2),i.current[k]=T}}}const j=[];for(const v of n.current){if(v.life-=b,v.life<=0)continue;v.vy+=Fm*b,v.x+=v.vx*b,v.y+=v.vy*b,v.rot+=v.vr*b;const C=Math.max(0,v.life/v.maxLife),N=.5+.5*C;g.save(),g.globalAlpha=C,g.translate(v.x,v.y),g.rotate(v.rot),g.lineWidth=1.4,g.strokeStyle=f.notesDark?`rgba(255,255,255,${C*.8})`:`rgba(0,0,0,${C*.55})`;const M=v.colorIdx<0?f.base:f.accents[v.colorIdx%f.accents.length];g.fillStyle=M.replace(/[\d.]+\)$/,`${C})`),Pl(g,v.shape,v.size*N*1.3),g.restore(),j.push(v)}n.current=j,a.current=requestAnimationFrame(u)},[c]);return d.useEffect(()=>{const h=g=>{c(g.clientX,g.clientY)},p=g=>{if(g.key!=="Enter")return;const y=document.activeElement;if(y){const m=y.getBoundingClientRect();c(m.left+m.width/2,m.top+m.height/2)}else c(window.innerWidth/2,window.innerHeight/2)};return window.addEventListener("click",h,!0),window.addEventListener("keydown",p,!0),a.current=requestAnimationFrame(u),()=>{window.removeEventListener("click",h,!0),window.removeEventListener("keydown",p,!0),cancelAnimationFrame(a.current)}},[u,c]),r.jsx("canvas",{ref:t,"aria-hidden":"true",role:"img","aria-label":e("noteParticles.noteParticlesAnimationCanvas","Note particles animation canvas"),style:{position:"fixed",inset:0,zIndex:99999,pointerEvents:"none"}})}const yr={type:"gain",enabled:!0,mix:1,gain:0},Fn={type:"compressor",enabled:!0,mix:1,threshold:-24,ratio:4,attack:10,release:100,knee:6,makeupGain:0},On={type:"reverb",enabled:!0,mix:.3,decay:2,preDelay:10,damping:.5,roomSize:.5},Bn={type:"delay",enabled:!0,mix:.3,time:250,feedback:.4,pingPong:!1,highCut:8e3},vr={type:"chorus",enabled:!0,mix:.5,rate:1.5,depth:.5,delay:7,voices:3},br={type:"eq",enabled:!0,mix:1,bands:[{frequency:60,gain:0,q:1,type:"lowshelf"},{frequency:250,gain:0,q:1,type:"peaking"},{frequency:1e3,gain:0,q:1,type:"peaking"},{frequency:4e3,gain:0,q:1,type:"peaking"},{frequency:12e3,gain:0,q:1,type:"highshelf"}]},xr={type:"filter",enabled:!0,mix:1,filterType:"lowpass",frequency:1e3,q:1,gain:0},Sr={type:"distortion",enabled:!0,mix:.5,drive:.5,tone:.5,curve:"soft"},kr={type:"tremolo",enabled:!0,mix:1,rate:5,depth:.5,waveform:"sine"},wr={type:"phaser",enabled:!0,mix:.5,rate:.5,depth:.5,feedback:.5,stages:4,frequency:1e3},Um=(function(){return{gain:{unity:{...yr,gain:0},boost:{...yr,gain:6},cut:{...yr,gain:-6}},compressor:{gentle:{...Fn,threshold:-20,ratio:2,attack:30,release:200},moderate:{...Fn,threshold:-24,ratio:4,attack:10,release:100},aggressive:{...Fn,threshold:-30,ratio:8,attack:1,release:50},limiter:{...Fn,threshold:-3,ratio:20,attack:.1,release:100}},reverb:{small_room:{...On,decay:.5,roomSize:.2,damping:.7},large_hall:{...On,decay:3,roomSize:.8,damping:.3},plate:{...On,decay:1.5,roomSize:.5,damping:.4},cathedral:{...On,decay:5,roomSize:.9,damping:.2,mix:.4}},delay:{slapback:{...Bn,time:80,feedback:.1,mix:.3},quarter_note:{...Bn,time:500,feedback:.4,mix:.3},dotted_eighth:{...Bn,time:375,feedback:.5,mix:.3},long_ambient:{...Bn,time:750,feedback:.6,highCut:3e3,mix:.4}},chorus:{subtle:{...vr,rate:.5,depth:.2,voices:2,mix:.3},vintage:{...vr,rate:1,depth:.4,voices:2,delay:10,mix:.4},ensemble:{...vr,rate:2,depth:.6,voices:4,mix:.5}},eq:{vocal_presence:{...br,bands:[{frequency:80,gain:-3,q:1,type:"highpass"},{frequency:250,gain:-2,q:1,type:"peaking"},{frequency:3e3,gain:3,q:1.5,type:"peaking"},{frequency:8e3,gain:2,q:1,type:"highshelf"}]},bass_boost:{...br,bands:[{frequency:60,gain:6,q:1,type:"lowshelf"},{frequency:200,gain:2,q:1,type:"peaking"}]},brightness:{...br,bands:[{frequency:4e3,gain:3,q:1,type:"peaking"},{frequency:1e4,gain:4,q:1,type:"highshelf"}]}},filter:{low_pass_warm:{...xr,filterType:"lowpass",frequency:2e3,q:.7},high_pass_clean:{...xr,filterType:"highpass",frequency:100,q:.7},telephone:{...xr,filterType:"bandpass",frequency:1500,q:2}},distortion:{overdrive:{...Sr,drive:.3,tone:.6,curve:"soft",mix:.7},crunch:{...Sr,drive:.5,tone:.5,curve:"tube",mix:.8},fuzz:{...Sr,drive:.8,tone:.4,curve:"fuzz",mix:1}},tremolo:{slow:{...kr,rate:3,depth:.4,waveform:"sine"},fast:{...kr,rate:8,depth:.6,waveform:"sine"},choppy:{...kr,rate:6,depth:.9,waveform:"square"}},phaser:{subtle:{...wr,rate:.3,depth:.3,feedback:.3,stages:4},jet:{...wr,rate:.1,depth:.8,feedback:.7,stages:8},rotary:{...wr,rate:1,depth:.5,feedback:.4,stages:6}}}})();function wi(e){return Math.pow(10,e/20)}function Vm(e,t,n,a){const s=e.sampleRate,i=Math.floor(s*t),o=e.createBuffer(2,i,s);for(let l=0;l<2;l++){const c=o.getChannelData(l);for(let u=0;u<i;u++){const h=u/s,p=Math.exp(-h/n),g=1-a*(u/i);c[u]=(Math.random()*2-1)*p*g}}return o}function qm(e,t){const a=new Float32Array(44100),s=Math.PI/180;for(let i=0;i<44100;i++){const o=i*2/44100-1;switch(t){case"soft":a[i]=(3+e*10)*o*20*s/(Math.PI+e*10*Math.abs(o));break;case"hard":a[i]=Math.tanh(o*(1+e*5));break;case"fuzz":a[i]=Math.sign(o)*Math.pow(Math.abs(o),1/(1+e*3));break;case"tube":o>=0?a[i]=1-Math.pow(1-o,1+e*2):a[i]=-(1-Math.pow(1+o,1+e*2));break}}return a}class Hm{constructor(t){this.effects=[],this.bypass=!1,this.audioContext=t,this.inputNode=t.createGain(),this.outputNode=t.createGain(),this.inputNode.connect(this.outputNode)}get input(){return this.inputNode}get output(){return this.outputNode}addEffect(t,n){const a=`effect_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,s=this.createEffectInstance(a,t);return n!==void 0&&n>=0&&n<this.effects.length?this.effects.splice(n,0,s):this.effects.push(s),this.reconnectChain(),a}removeEffect(t){const n=this.effects.findIndex(s=>s.id===t);if(n===-1)return!1;const a=this.effects[n];for(const s of a.nodes)s.disconnect();return this.effects.splice(n,1),this.reconnectChain(),!0}updateEffect(t,n){const a=this.effects.find(l=>l.id===t);if(!a)return!1;const s={...a.params,...n},i=this.effects.indexOf(a);for(const l of a.nodes)l.disconnect();const o=this.createEffectInstance(t,s);return this.effects[i]=o,this.reconnectChain(),!0}reorderEffects(t,n){if(t<0||t>=this.effects.length||n<0||n>=this.effects.length)return!1;const[a]=this.effects.splice(t,1);return this.effects.splice(n,0,a),this.reconnectChain(),!0}setBypass(t){this.bypass=t,this.reconnectChain()}getEffects(){return[...this.effects]}clear(){for(const t of this.effects)for(const n of t.nodes)n.disconnect();this.effects=[],this.reconnectChain()}createEffectInstance(t,n){const{audioContext:a}=this,s=[];let i,o;switch(n.type){case"gain":{const l=a.createGain();l.gain.value=wi(n.gain),s.push(l),i=o=l;break}case"compressor":{const l=a.createDynamicsCompressor();l.threshold.value=n.threshold,l.ratio.value=n.ratio,l.attack.value=n.attack/1e3,l.release.value=n.release/1e3,l.knee.value=n.knee;const c=a.createGain();c.gain.value=wi(n.makeupGain),l.connect(c),s.push(l,c),i=l,o=c;break}case"reverb":{const l=a.createConvolver();l.buffer=Vm(a,n.decay,n.decay,n.damping);const c=a.createGain(),u=a.createGain(),h=a.createGain(),p=a.createGain();c.gain.value=n.mix,u.gain.value=1-n.mix,h.connect(l),h.connect(u),l.connect(c),c.connect(p),u.connect(p),s.push(h,l,c,u,p),i=h,o=p;break}case"delay":{const l=a.createDelay(5);l.delayTime.value=n.time/1e3;const c=a.createGain();c.gain.value=n.feedback;const u=a.createBiquadFilter();u.type="lowpass",u.frequency.value=n.highCut;const h=a.createGain(),p=a.createGain(),g=a.createGain(),y=a.createGain();h.gain.value=n.mix,p.gain.value=1-n.mix,g.connect(l),g.connect(p),l.connect(u),u.connect(c),c.connect(l),u.connect(h),h.connect(y),p.connect(y),s.push(g,l,u,c,h,p,y),i=g,o=y;break}case"eq":{const l=[];let c=null;for(const u of n.bands){const h=a.createBiquadFilter();h.type=u.type,h.frequency.value=u.frequency,h.Q.value=u.q,h.gain.value=u.gain,c&&c.connect(h),c=h,l.push(h)}s.push(...l),i=l[0]||a.createGain(),o=l[l.length-1]||i;break}case"filter":{const l=a.createBiquadFilter();l.type=n.filterType,l.frequency.value=n.frequency,l.Q.value=n.q,l.gain.value=n.gain,s.push(l),i=o=l;break}case"distortion":{const l=a.createWaveShaper();l.curve=qm(n.drive,n.curve),l.oversample="4x";const c=a.createBiquadFilter();c.type="lowpass",c.frequency.value=1e3+n.tone*1e4;const u=a.createGain(),h=a.createGain(),p=a.createGain(),g=a.createGain();u.gain.value=n.mix,h.gain.value=1-n.mix,p.connect(l),p.connect(h),l.connect(c),c.connect(u),u.connect(g),h.connect(g),s.push(p,l,c,u,h,g),i=p,o=g;break}case"tremolo":{const l=a.createOscillator();l.type=n.waveform,l.frequency.value=n.rate;const c=a.createGain();c.gain.value=n.depth*.5;const u=a.createGain();u.gain.value=1-n.depth*.5,l.connect(c),c.connect(u.gain),l.start(),s.push(l,c,u),i=o=u;break}case"phaser":{const l=[],c=a.createOscillator();c.type="sine",c.frequency.value=n.rate;const u=a.createGain();u.gain.value=n.depth*n.frequency;let h=null;for(let x=0;x<n.stages;x++){const b=a.createBiquadFilter();b.type="allpass",b.frequency.value=n.frequency,b.Q.value=.5,c.connect(u),u.connect(b.frequency),h&&h.connect(b),h=b,l.push(b)}const p=a.createGain(),g=a.createGain(),y=a.createGain(),m=a.createGain();p.gain.value=n.mix,g.gain.value=1-n.mix,y.connect(l[0]),y.connect(g),l[l.length-1].connect(p),p.connect(m),g.connect(m),c.start(),s.push(c,u,...l,p,g,y,m),i=y,o=m;break}default:throw new Error(`Unknown effect type: ${n.type}`)}return{id:t,params:n,nodes:s,input:i,output:o}}reconnectChain(){this.inputNode.disconnect();for(const n of this.effects)n.output.disconnect();if(this.bypass||this.effects.length===0){this.inputNode.connect(this.outputNode);return}let t=this.inputNode;for(const n of this.effects)n.params.enabled&&(t.connect(n.input),t=n.output);t.connect(this.outputNode)}dispose(){this.clear(),this.inputNode.disconnect(),this.outputNode.disconnect()}}const Il={gain:r.jsx(B.NtdVolume,{size:16}),compressor:r.jsx(B.NtdSettings,{size:16}),reverb:r.jsx(B.NtdMountain,{size:16}),delay:r.jsx(B.NtdStopwatch,{size:16}),chorus:r.jsx(B.NtdSparkle,{size:16}),eq:r.jsx(B.NtdBarChart,{size:16}),filter:r.jsx(B.NtdFilter,{size:16}),distortion:r.jsx(B.NtdLightning,{size:16}),tremolo:r.jsx(B.NtdWave,{size:16}),phaser:r.jsx(B.NtdMagicWand,{size:16})},Ll={gain:"Gain",compressor:"Compressor",reverb:"Reverb",delay:"Delay",chorus:"Chorus",eq:"EQ",filter:"Filter",distortion:"Distortion",tremolo:"Tremolo",phaser:"Phaser"},Km={gain:yr,compressor:Fn,reverb:On,delay:Bn,chorus:vr,eq:br,filter:xr,distortion:Sr,tremolo:kr,phaser:wr},Ym=["gain","compressor","reverb","delay","chorus","eq","filter","distortion","tremolo","phaser"],Fe=({value:e,min:t,max:n,step:a=1,label:s,unit:i="",onChange:o,disabled:l})=>{const c=d.useRef(null),[u,h]=d.useState(!1),p=d.useRef(0),g=d.useRef(e),y=d.useCallback(x=>{l||(x.preventDefault(),h(!0),p.current=x.clientY,g.current=e)},[l,e]);d.useEffect(()=>{if(!u)return;const x=f=>{const j=p.current-f.clientY,v=n-t,N=j/200*v,M=Math.min(n,Math.max(t,g.current+N));o(a<1?M:Math.round(M/a)*a)},b=()=>{h(!1)};return document.addEventListener("mousemove",x),document.addEventListener("mouseup",b),()=>{document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",b)}},[u,t,n,a,o]);const m=(e-t)/(n-t)*270-135;return r.jsxs("div",{className:`nice-fx-knob ${l?"nice-fx-knob--disabled":""}`,ref:c,children:[r.jsx("div",{className:`nice-fx-knob__dial ${u?"nice-fx-knob__dial--active":""}`,onMouseDown:y,style:{transform:`rotate(${m}deg)`},children:r.jsx("div",{className:"nice-fx-knob__indicator"})}),r.jsx("div",{className:"nice-fx-knob__label",children:s}),r.jsxs("div",{className:"nice-fx-knob__value",children:[typeof e=="number"&&a<1?e.toFixed(2):e,i]})]})};function Zm({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsx(Fe,{value:e.gain,min:-60,max:12,step:.1,label:u("audioEffectsRack.gain","Gain"),unit:"dB",onChange:h=>t({...e,gain:h}),disabled:!e.enabled})})}function Xm({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsxs("div",{className:"nice-fx-card__controls",children:[r.jsx(Fe,{value:e.threshold,min:-60,max:0,label:u("audioEffectsRack.threshold","Threshold"),unit:"dB",onChange:h=>t({...e,threshold:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.ratio,min:1,max:20,label:u("audioEffectsRack.ratio","Ratio"),onChange:h=>t({...e,ratio:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.attack,min:.1,max:200,label:u("audioEffectsRack.attack","Attack"),unit:"ms",onChange:h=>t({...e,attack:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.release,min:10,max:1e3,label:u("audioEffectsRack.release","Release"),unit:"ms",onChange:h=>t({...e,release:h}),disabled:!e.enabled}),!c&&r.jsxs(r.Fragment,{children:[r.jsx(Fe,{value:e.knee,min:0,max:40,label:u("audioEffectsRack.knee","Knee"),unit:"dB",onChange:h=>t({...e,knee:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.makeupGain,min:0,max:24,label:u("audioEffectsRack.makeup","Makeup"),unit:"dB",onChange:h=>t({...e,makeupGain:h}),disabled:!e.enabled})]})]})})}function Qm({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsxs("div",{className:"nice-fx-card__controls",children:[r.jsx(Fe,{value:e.decay,min:.1,max:10,step:.1,label:u("audioEffectsRack.decay","Decay"),unit:"s",onChange:h=>t({...e,decay:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.damping,min:0,max:1,step:.01,label:u("audioEffectsRack.damping","Damping"),onChange:h=>t({...e,damping:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.roomSize,min:0,max:1,step:.01,label:u("audioEffectsRack.room","Room"),onChange:h=>t({...e,roomSize:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:u("audioEffectsRack.mix","Mix"),onChange:h=>t({...e,mix:h}),disabled:!e.enabled})]})})}function Jm({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsxs("div",{className:"nice-fx-card__controls",children:[r.jsx(Fe,{value:e.time,min:0,max:2e3,label:u("audioEffectsRack.time","Time"),unit:"ms",onChange:h=>t({...e,time:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.feedback,min:0,max:1,step:.01,label:u("audioEffectsRack.feedback","Feedback"),onChange:h=>t({...e,feedback:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.highCut,min:200,max:2e4,label:u("audioEffectsRack.hicut","HiCut"),unit:"Hz",onChange:h=>t({...e,highCut:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:u("audioEffectsRack.mix","Mix"),onChange:h=>t({...e,mix:h}),disabled:!e.enabled})]})})}function e0({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsxs("div",{className:"nice-fx-card__controls",children:[r.jsx(Fe,{value:e.drive,min:0,max:1,step:.01,label:u("audioEffectsRack.drive","Drive"),onChange:h=>t({...e,drive:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.tone,min:0,max:1,step:.01,label:u("audioEffectsRack.tone","Tone"),onChange:h=>t({...e,tone:h}),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:u("audioEffectsRack.mix","Mix"),onChange:h=>t({...e,mix:h}),disabled:!e.enabled})]})})}function kt({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:u}){const{t:h}=xe(),[p,g]=d.useState(!1);return r.jsxs("div",{className:`nice-fx-card ${e.enabled?"":"nice-fx-card--disabled"} ${i?"nice-fx-card--drop-target":""} ${c?"nice-fx-card--compact":""}`,draggable:!0,onDragStart:a,onDragEnd:s,children:[r.jsxs("div",{className:"nice-fx-card__header",children:[r.jsx("span",{className:"nice-fx-card__icon",children:Il[e.type]}),r.jsx("span",{className:"nice-fx-card__title",children:Ll[e.type]}),r.jsx("button",{type:"button",className:`nice-fx-card__toggle ${e.enabled?"nice-fx-card__toggle--active":""}`,onClick:()=>t({...e,enabled:!e.enabled}),title:e.enabled?h("audioEffectsRack.disable","Disable"):h("audioEffectsRack.enable","Enable"),"aria-pressed":e.enabled,children:r.jsx("span",{className:"nice-fx-card__toggle-dot","aria-hidden":"true"})}),l&&Object.keys(o).length>0&&r.jsxs("div",{className:"nice-fx-card__presets",children:[r.jsx("button",{type:"button",className:"nice-fx-card__preset-btn",onClick:()=>g(!p),"aria-label":h("audioEffectsRack.presets","Presets"),children:r.jsx(B.NtdChevronDown,{size:12})}),p&&r.jsx("div",{className:"nice-fx-card__preset-menu",children:Object.entries(o).map(([y,m])=>r.jsx("button",{type:"button",className:"nice-fx-card__preset-item",onClick:()=>{t({...m,enabled:e.enabled}),g(!1)},children:y.replace(/_/g," ")},y))})]}),r.jsx("button",{type:"button",className:"nice-fx-card__remove",onClick:n,title:h("audioEffectsRack.remove","Remove"),children:r.jsx(ve.NiceIcon,{name:"close",size:14})})]}),r.jsx("div",{className:"nice-fx-card__body",children:u})]})}function t0({effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c}){const{t:u}=xe();return r.jsx(kt,{effect:e,onChange:t,onRemove:n,onDragStart:a,onDragEnd:s,isDragTarget:i,presets:o,showPresets:l,compact:c,children:r.jsx("div",{className:"nice-fx-card__generic",children:r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:u("audioEffectsRack.mix","Mix"),onChange:h=>t({...e,mix:h}),disabled:!e.enabled})})})}function n0({effect:e,onChange:t,...n}){const{t:a}=xe(),s=e.params||{},i=(o,l)=>t({...e,params:{...s,[o]:l}});return r.jsx(kt,{effect:e,onChange:t,...n,children:r.jsxs("div",{className:"nice-fx-card__row",children:[r.jsx(Fe,{value:s.rate??1.5,min:.1,max:10,step:.1,label:a("audioEffectsRack.rate","Rate"),onChange:o=>i("rate",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.depth??.5,min:0,max:1,step:.01,label:a("audioEffectsRack.depth","Depth"),onChange:o=>i("depth",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.feedback??.3,min:0,max:.95,step:.01,label:a("audioEffectsRack.feedback","Feedback"),onChange:o=>i("feedback",o),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:a("audioEffectsRack.mix","Mix"),onChange:o=>t({...e,mix:o}),disabled:!e.enabled})]})})}function r0({effect:e,onChange:t,...n}){const{t:a}=xe(),s=e.params||{},i=(o,l)=>t({...e,params:{...s,[o]:l}});return r.jsx(kt,{effect:e,onChange:t,...n,children:r.jsxs("div",{className:"nice-fx-card__row",children:[r.jsx(Fe,{value:s.low??0,min:-12,max:12,step:.5,label:a("audioEffectsRack.low","Low"),onChange:o=>i("low",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.mid??0,min:-12,max:12,step:.5,label:a("audioEffectsRack.mid","Mid"),onChange:o=>i("mid",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.high??0,min:-12,max:12,step:.5,label:a("audioEffectsRack.high","High"),onChange:o=>i("high",o),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:a("audioEffectsRack.mix","Mix"),onChange:o=>t({...e,mix:o}),disabled:!e.enabled})]})})}function a0({effect:e,onChange:t,...n}){const{t:a}=xe(),s=e.params||{},i=(o,l)=>t({...e,params:{...s,[o]:l}});return r.jsx(kt,{effect:e,onChange:t,...n,children:r.jsxs("div",{className:"nice-fx-card__row",children:[r.jsx(Fe,{value:s.frequency??1e3,min:20,max:2e4,step:1,label:a("audioEffectsRack.freq","Freq"),onChange:o=>i("frequency",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.Q??1,min:.1,max:20,step:.1,label:"Q",onChange:o=>i("Q",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.gain??0,min:-24,max:24,step:.5,label:a("audioEffectsRack.gain","Gain"),onChange:o=>i("gain",o),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:a("audioEffectsRack.mix","Mix"),onChange:o=>t({...e,mix:o}),disabled:!e.enabled})]})})}function s0({effect:e,onChange:t,...n}){const{t:a}=xe(),s=e.params||{},i=(o,l)=>t({...e,params:{...s,[o]:l}});return r.jsx(kt,{effect:e,onChange:t,...n,children:r.jsxs("div",{className:"nice-fx-card__row",children:[r.jsx(Fe,{value:s.rate??5,min:.1,max:20,step:.1,label:a("audioEffectsRack.rate","Rate"),onChange:o=>i("rate",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.depth??.5,min:0,max:1,step:.01,label:a("audioEffectsRack.depth","Depth"),onChange:o=>i("depth",o),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:a("audioEffectsRack.mix","Mix"),onChange:o=>t({...e,mix:o}),disabled:!e.enabled})]})})}function i0({effect:e,onChange:t,...n}){const{t:a}=xe(),s=e.params||{},i=(o,l)=>t({...e,params:{...s,[o]:l}});return r.jsx(kt,{effect:e,onChange:t,...n,children:r.jsxs("div",{className:"nice-fx-card__row",children:[r.jsx(Fe,{value:s.rate??.5,min:.01,max:8,step:.01,label:a("audioEffectsRack.rate","Rate"),onChange:o=>i("rate",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.depth??.7,min:0,max:1,step:.01,label:a("audioEffectsRack.depth","Depth"),onChange:o=>i("depth",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.feedback??.5,min:0,max:.95,step:.01,label:a("audioEffectsRack.feedback","Feedback"),onChange:o=>i("feedback",o),disabled:!e.enabled}),r.jsx(Fe,{value:s.stages??4,min:2,max:12,step:2,label:a("audioEffectsRack.stages","Stages"),onChange:o=>i("stages",o),disabled:!e.enabled}),r.jsx(Fe,{value:e.mix,min:0,max:1,step:.01,label:a("audioEffectsRack.mix","Mix"),onChange:o=>t({...e,mix:o}),disabled:!e.enabled})]})})}const o0=({audioContext:e,chain:t,effects:n,onChange:a,onChainUpdate:s,maxEffects:i=10,availableEffects:o=Ym,showPresets:l=!0,compact:c=!1,className:u=""})=>{const{t:h}=xe(),[p,g]=d.useState((n==null?void 0:n.map(E=>E.params))||[]),[y,m]=d.useState({isDragging:!1,dragIndex:-1,dropIndex:-1}),[x,b]=d.useState(!1),f=d.useMemo(()=>t||(e?new Hm(e):null),[e,t]),j=d.useCallback((E,A)=>{const I=[...p];I[E]=A,g(I),a==null||a(I),f&&(s==null||s(f))},[p,a,f,s]),v=d.useCallback(E=>{if(p.length>=i)return;const A={...Km[E]},I=[...p,A];g(I),a==null||a(I),b(!1)},[p,i,a]),C=d.useCallback(E=>{const A=p.filter((I,L)=>L!==E);g(A),a==null||a(A)},[p,a]),N=d.useCallback(E=>{m({isDragging:!0,dragIndex:E,dropIndex:-1})},[]),M=d.useCallback(()=>{if(y.dragIndex!==-1&&y.dropIndex!==-1&&y.dragIndex!==y.dropIndex){const E=[...p],[A]=E.splice(y.dragIndex,1);E.splice(y.dropIndex,0,A),g(E),a==null||a(E)}m({isDragging:!1,dragIndex:-1,dropIndex:-1})},[y,p,a]),k=d.useCallback((E,A)=>{E.preventDefault(),y.isDragging&&m(I=>({...I,dropIndex:A}))},[y.isDragging]),T=(E,A)=>{const I={onRemove:()=>C(A),onDragStart:()=>N(A),onDragEnd:M,isDragTarget:y.dropIndex===A,presets:Um[E.type]||{},showPresets:l,compact:c};switch(E.type){case"gain":return r.jsx(Zm,{effect:E,onChange:L=>j(A,L),...I},A);case"compressor":return r.jsx(Xm,{effect:E,onChange:L=>j(A,L),...I},A);case"reverb":return r.jsx(Qm,{effect:E,onChange:L=>j(A,L),...I},A);case"delay":return r.jsx(Jm,{effect:E,onChange:L=>j(A,L),...I},A);case"distortion":return r.jsx(e0,{effect:E,onChange:L=>j(A,L),...I},A);case"chorus":return r.jsx(n0,{effect:E,onChange:L=>j(A,L),...I},A);case"eq":return r.jsx(r0,{effect:E,onChange:L=>j(A,L),...I},A);case"filter":return r.jsx(a0,{effect:E,onChange:L=>j(A,L),...I},A);case"tremolo":return r.jsx(s0,{effect:E,onChange:L=>j(A,L),...I},A);case"phaser":return r.jsx(i0,{effect:E,onChange:L=>j(A,L),...I},A);default:return r.jsx(t0,{effect:E,onChange:L=>j(A,L),...I},A)}};return r.jsxs("div",{className:`nice-fx-rack ${c?"nice-fx-rack--compact":""} ${u}`,children:[r.jsxs("div",{className:"nice-fx-rack__header",children:[r.jsx("h3",{className:"nice-fx-rack__title",children:h("audioEffectsRack.effectsChain","Effects Chain")}),r.jsxs("span",{className:"nice-fx-rack__count",children:[p.length,"/",i]})]}),r.jsx("div",{className:"nice-fx-rack__chain",children:p.length===0?r.jsx("div",{className:"nice-fx-rack__empty",children:h("audioEffectsRack.noEffectsClickToAdd","No effects. Click + to add.")}):p.map((E,A)=>r.jsxs("div",{className:"nice-fx-rack__slot",onDragOver:I=>k(I,A),children:[T(E,A),A<p.length-1&&r.jsx("div",{className:"nice-fx-rack__connector","aria-hidden":"true",children:r.jsx(B.NtdArrowRight,{size:14})})]},A))}),p.length<i&&r.jsxs("div",{className:"nice-fx-rack__add",children:[r.jsx("button",{type:"button",className:"nice-fx-rack__add-btn",onClick:()=>b(!x),children:h("audioEffectsRack.addEffect","+ Add Effect")}),x&&r.jsx("div",{className:"nice-fx-rack__add-menu",children:o.map(E=>r.jsxs("button",{type:"button",className:"nice-fx-rack__add-item",onClick:()=>v(E),children:[r.jsx("span",{className:"nice-fx-rack__add-icon",children:Il[E]}),r.jsx("span",{className:"nice-fx-rack__add-label",children:Ll[E]})]},E))})]})]})},_l=[{type:"chipmunk",enabled:!1,intensity:60,label:"Chipmunk",icon:"sparkle"},{type:"helium",enabled:!1,intensity:80,label:"Helium",icon:"sparkle"},{type:"deep",enabled:!1,intensity:50,label:"Deep Voice",icon:"music"},{type:"demon",enabled:!1,intensity:70,label:"Demon",icon:"skull"},{type:"robot",enabled:!1,intensity:50,label:"Robot",icon:"robot"},{type:"alien",enabled:!1,intensity:60,label:"Alien",icon:"ghost"},{type:"echo",enabled:!1,intensity:50,label:"Echo",icon:"mountain"},{type:"cave",enabled:!1,intensity:60,label:"Cave",icon:"mountain"},{type:"reverb",enabled:!1,intensity:50,label:"Reverb",icon:"wave"},{type:"chorus",enabled:!1,intensity:50,label:"Chorus",icon:"music"},{type:"flanger",enabled:!1,intensity:50,label:"Flanger",icon:"wave"},{type:"distortion",enabled:!1,intensity:40,label:"Distortion",icon:"lightning"},{type:"telephone",enabled:!1,intensity:80,label:"Telephone",icon:"phone"},{type:"megaphone",enabled:!1,intensity:60,label:"Megaphone",icon:"megaphone"},{type:"radio",enabled:!1,intensity:70,label:"AM Radio",icon:"wave"},{type:"underwater",enabled:!1,intensity:50,label:"Underwater",icon:"wave"},{type:"whisper",enabled:!1,intensity:60,label:"Whisper",icon:"volume-mute"},{type:"tremolo",enabled:!1,intensity:50,label:"Tremolo",icon:"wave"},{type:"autotune",enabled:!1,intensity:60,label:"Auto-Tune",icon:"microphone"},{type:"vocoder",enabled:!1,intensity:50,label:"Vocoder",icon:"volume"}];function Ci(e,t,n){const a=e.sampleRate,s=Math.round(a*t),i=e.createBuffer(2,s,a);for(let o=0;o<2;o++){const l=i.getChannelData(o);for(let c=0;c<s;c++)l[c]=(Math.random()*2-1)*Math.pow(1-c/s,n)}return i}function or(e){const t=Math.max(1,e),n=44100,a=new Float32Array(n),s=Math.PI/180;for(let i=0;i<n;i++){const o=i*2/n-1;a[i]=(3+t)*o*20*s/(Math.PI+t*Math.abs(o))}return a}class Dl{constructor(){this.audioCtx=null,this.mediaStream=null,this.sourceNode=null,this.inputGain=null,this.outputGain=null,this.activeEffects=new Map,this.effectOrder=[],this.monitoring=!0,this._volume=1,this._inputVolume=1,this.started=!1,this.externalStream=!1,this.analyser=null}get isStarted(){return this.started}get context(){return this.audioCtx}get activeEffectTypes(){return[...this.effectOrder]}async start(t){this.started||(this.audioCtx=new AudioContext,this.mediaStream=await navigator.mediaDevices.getUserMedia({audio:{deviceId:t||void 0,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}}),this.sourceNode=this.audioCtx.createMediaStreamSource(this.mediaStream),this.inputGain=this.audioCtx.createGain(),this.inputGain.gain.value=this._inputVolume,this.sourceNode.connect(this.inputGain),this.outputGain=this.audioCtx.createGain(),this.outputGain.gain.value=this.monitoring?this._volume:0,this.analyser=this.audioCtx.createAnalyser(),this.analyser.fftSize=2048,this.inputGain.connect(this.outputGain),this.outputGain.connect(this.analyser),this.analyser.connect(this.audioCtx.destination),this.started=!0)}async startWithStream(t){this.started||(this.externalStream=!0,this.audioCtx=new AudioContext,this.mediaStream=t,this.sourceNode=this.audioCtx.createMediaStreamSource(t),this.inputGain=this.audioCtx.createGain(),this.inputGain.gain.value=this._inputVolume,this.sourceNode.connect(this.inputGain),this.outputGain=this.audioCtx.createGain(),this.outputGain.gain.value=this.monitoring?this._volume:0,this.analyser=this.audioCtx.createAnalyser(),this.analyser.fftSize=2048,this.inputGain.connect(this.outputGain),this.outputGain.connect(this.analyser),this.analyser.connect(this.audioCtx.destination),this.started=!0)}stop(){var t,n,a,s,i,o;this.clearAllEffects();try{(t=this.analyser)==null||t.disconnect()}catch{}try{(n=this.outputGain)==null||n.disconnect()}catch{}try{(a=this.inputGain)==null||a.disconnect()}catch{}try{(s=this.sourceNode)==null||s.disconnect()}catch{}try{(i=this.audioCtx)==null||i.close()}catch{}if(!this.externalStream)try{(o=this.mediaStream)==null||o.getTracks().forEach(l=>l.stop())}catch{}this.audioCtx=null,this.mediaStream=null,this.sourceNode=null,this.inputGain=null,this.outputGain=null,this.analyser=null,this.started=!1}setMonitoring(t){this.monitoring=t,this.outputGain&&(this.outputGain.gain.value=t?this._volume:0)}setVolume(t){this._volume=Math.max(0,Math.min(2,t)),this.outputGain&&this.monitoring&&(this.outputGain.gain.value=this._volume)}setInputGain(t){this._inputVolume=Math.max(0,Math.min(3,t)),this.inputGain&&(this.inputGain.gain.value=this._inputVolume)}getLevel(){if(!this.analyser)return 0;const t=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(t);let n=0;for(let a=0;a<t.length;a++){const s=(t[a]-128)/128;n+=s*s}return Math.sqrt(n/t.length)}addEffect(t,n=50){if(!this.audioCtx||!this.inputGain||!this.outputGain||this.activeEffects.has(t))return;const a=this.buildEffectChain(t,n);a&&(this.activeEffects.set(t,a),this.effectOrder.push(t),this.reconnectChain())}removeEffect(t){const n=this.activeEffects.get(t);if(n){for(const a of n.nodes)try{a.disconnect()}catch{}this.activeEffects.delete(t),this.effectOrder=this.effectOrder.filter(a=>a!==t),this.reconnectChain()}}toggleEffect(t,n=50){return this.activeEffects.has(t)?(this.removeEffect(t),!1):(this.addEffect(t,n),!0)}updateIntensity(t,n){this.activeEffects.has(t)&&(this.removeEffect(t),this.addEffect(t,n))}clearAllEffects(){for(const[t]of this.activeEffects){const n=this.activeEffects.get(t);if(n)for(const a of n.nodes)try{a.disconnect()}catch{}}this.activeEffects.clear(),this.effectOrder=[],this.reconnectChain()}reconnectChain(){if(!this.inputGain||!this.outputGain)return;try{this.inputGain.disconnect()}catch{}for(const[,n]of this.activeEffects)try{n.output.disconnect()}catch{}if(this.effectOrder.length===0){this.inputGain.connect(this.outputGain);return}let t=this.inputGain;for(const n of this.effectOrder){const a=this.activeEffects.get(n);a&&(t.connect(a.input),t=a.output)}t.connect(this.outputGain)}buildEffectChain(t,n){const a=this.audioCtx,s=n/100;switch(t){case"chipmunk":return this.buildPitchShift(a,1+s*.8,s);case"helium":return this.buildPitchShift(a,1.5+s*1,s);case"deep":return this.buildPitchShift(a,1/(1+s*.5),s);case"demon":return this.buildDemon(a,s);case"robot":return this.buildRobot(a,s);case"alien":return this.buildAlien(a,s);case"echo":return this.buildDelay(a,.15+s*.35,.3+s*.4,s);case"cave":return this.buildCave(a,s);case"reverb":return this.buildReverb(a,1.5+s*3,2+s*4,s);case"chorus":return this.buildChorus(a,s);case"flanger":return this.buildFlanger(a,s);case"distortion":return this.buildDistortion(a,20+s*100,s);case"telephone":return this.buildBandpass(a,400,3500,s);case"megaphone":return this.buildMegaphone(a,s);case"radio":return this.buildRadio(a,s);case"underwater":return this.buildUnderwater(a,s);case"whisper":return this.buildWhisper(a,s);case"tremolo":return this.buildTremolo(a,s);case"autotune":return this.buildAutotune(a,s);case"vocoder":return this.buildVocoder(a,s);default:return null}}buildPitchShift(t,n,a){const s=t.createGain();s.gain.value=1;const i=t.createGain();i.gain.value=1;const o=t.createGain();o.gain.value=.7+a*.3;const l=t.createGain();l.gain.value=1-a*.5;const c=t.createDelay(1),u=t.createDelay(1),h=t.createOscillator(),p=t.createOscillator(),g=t.createGain(),y=t.createGain(),m=n-1,x=Math.abs(m)*5+2,b=Math.abs(m)*.015;h.type="sawtooth",h.frequency.value=x,g.gain.value=b,h.connect(g),g.connect(c.delayTime),c.delayTime.value=.02,p.type="sawtooth",p.frequency.value=x,y.gain.value=b,p.connect(y),y.connect(u.delayTime),u.delayTime.value=.02+b;const f=t.createGain();f.gain.value=.5;const j=t.createGain();return j.gain.value=.5,s.connect(c),s.connect(u),c.connect(f),u.connect(j),f.connect(o),j.connect(o),s.connect(l),o.connect(i),l.connect(i),h.start(),p.start(),{type:"chipmunk",nodes:[s,c,u,h,p,g,y,f,j,o,l,i],input:s,output:i}}buildRobot(t,n){const a=t.createGain(),s=t.createGain(),i=t.createGain();i.gain.value=.6+n*.4;const o=t.createGain();o.gain.value=1-n*.6;const l=t.createOscillator();l.type="square",l.frequency.value=50+n*200;const c=t.createGain();return c.gain.value=0,l.connect(c.gain),a.connect(c),c.connect(i),a.connect(o),i.connect(s),o.connect(s),l.start(),{type:"robot",nodes:[a,l,c,i,o,s],input:a,output:s}}buildAlien(t,n){const a=t.createGain(),s=t.createGain(),i=t.createOscillator();i.type="sine",i.frequency.value=300+n*700;const o=t.createGain();o.gain.value=0,i.connect(o.gain),a.connect(o);const l=t.createDelay(.1);l.delayTime.value=.005;const c=t.createOscillator();c.type="sine",c.frequency.value=3+n*10;const u=t.createGain();u.gain.value=.004,c.connect(u),u.connect(l.delayTime),o.connect(l),l.connect(s);const h=t.createGain();return h.gain.value=.3,a.connect(h),h.connect(s),i.start(),c.start(),{type:"alien",nodes:[a,i,o,l,c,u,h,s],input:a,output:s}}buildDelay(t,n,a,s){const i=t.createGain(),o=t.createGain(),l=t.createDelay(2);l.delayTime.value=n;const c=t.createGain();c.gain.value=Math.min(.85,a);const u=t.createGain();u.gain.value=.5+s*.5;const h=t.createGain();return h.gain.value=1,i.connect(l),l.connect(c),c.connect(l),l.connect(u),i.connect(h),u.connect(o),h.connect(o),{type:"echo",nodes:[i,l,c,u,h,o],input:i,output:o}}buildCave(t,n){const a=t.createGain(),s=t.createGain(),i=t.createDelay(2);i.delayTime.value=.2+n*.3;const o=t.createDelay(2);o.delayTime.value=.35+n*.25;const l=t.createDelay(2);l.delayTime.value=.55+n*.3;const c=t.createGain();c.gain.value=.5;const u=t.createGain();u.gain.value=.35;const h=t.createGain();h.gain.value=.25;const p=t.createConvolver();p.buffer=Ci(t,2+n*3,3);const g=t.createGain();g.gain.value=.3+n*.3,a.connect(i),i.connect(c),c.connect(i),a.connect(o),o.connect(u),u.connect(o),a.connect(l),l.connect(h),h.connect(l),i.connect(g),o.connect(g),l.connect(g),a.connect(p),p.connect(g);const y=t.createGain();return y.gain.value=.7,a.connect(y),y.connect(s),g.connect(s),{type:"cave",nodes:[a,i,o,l,c,u,h,p,g,y,s],input:a,output:s}}buildReverb(t,n,a,s){const i=t.createGain(),o=t.createGain(),l=t.createConvolver();l.buffer=Ci(t,n,a);const c=t.createGain();c.gain.value=.4+s*.5;const u=t.createGain();return u.gain.value=1,i.connect(l),l.connect(c),i.connect(u),c.connect(o),u.connect(o),{type:"reverb",nodes:[i,l,c,u,o],input:i,output:o}}buildChorus(t,n){const a=t.createGain(),s=t.createGain(),i=[{delayMs:20,lfoFreq:.5,depth:.003},{delayMs:25,lfoFreq:.7,depth:.004},{delayMs:30,lfoFreq:1.1,depth:.005}],o=[a,s],l=t.createGain();l.gain.value=.7,a.connect(l),l.connect(s),o.push(l);for(const c of i){const u=t.createDelay(.1);u.delayTime.value=c.delayMs/1e3;const h=t.createOscillator();h.type="sine",h.frequency.value=c.lfoFreq;const p=t.createGain();p.gain.value=c.depth*(.5+n),h.connect(p),p.connect(u.delayTime);const g=t.createGain();g.gain.value=.3+n*.2,a.connect(u),u.connect(g),g.connect(s),h.start(),o.push(u,h,p,g)}return{type:"chorus",nodes:o,input:a,output:s}}buildFlanger(t,n){const a=t.createGain(),s=t.createGain(),i=t.createDelay(.02);i.delayTime.value=.005;const o=t.createOscillator();o.type="sine",o.frequency.value=.2+n*2;const l=t.createGain();l.gain.value=.003+n*.002,o.connect(l),l.connect(i.delayTime);const c=t.createGain();c.gain.value=.5+n*.35;const u=t.createGain();u.gain.value=.5+n*.3;const h=t.createGain();return h.gain.value=1,a.connect(i),i.connect(c),c.connect(i),i.connect(u),a.connect(h),u.connect(s),h.connect(s),o.start(),{type:"flanger",nodes:[a,i,o,l,c,u,h,s],input:a,output:s}}buildDistortion(t,n,a){const s=t.createGain(),i=t.createGain(),o=t.createWaveShaper();o.curve=or(n),o.oversample="4x";const l=t.createGain();l.gain.value=.6+a*.4;const c=t.createGain();return c.gain.value=1-a*.4,s.connect(o),o.connect(l),s.connect(c),l.connect(i),c.connect(i),{type:"distortion",nodes:[s,o,l,c,i],input:s,output:i}}buildBandpass(t,n,a,s){const i=t.createGain(),o=t.createGain(),l=t.createBiquadFilter();l.type="highpass",l.frequency.value=n,l.Q.value=.7;const c=t.createBiquadFilter();return c.type="lowpass",c.frequency.value=a,c.Q.value=.7,i.connect(l),l.connect(c),c.connect(o),{type:"telephone",nodes:[i,l,c,o],input:i,output:o}}buildMegaphone(t,n){const a=t.createGain(),s=t.createGain(),i=t.createBiquadFilter();i.type="highpass",i.frequency.value=500;const o=t.createBiquadFilter();o.type="lowpass",o.frequency.value=4e3;const l=t.createWaveShaper();l.curve=or(15+n*30),l.oversample="2x";const c=t.createBiquadFilter();return c.type="peaking",c.frequency.value=2e3,c.gain.value=6+n*6,c.Q.value=1,a.connect(i),i.connect(o),o.connect(l),l.connect(c),c.connect(s),{type:"megaphone",nodes:[a,i,o,l,c,s],input:a,output:s}}buildRadio(t,n){const a=t.createGain(),s=t.createGain(),i=t.createBiquadFilter();i.type="highpass",i.frequency.value=300+n*200;const o=t.createBiquadFilter();o.type="lowpass",o.frequency.value=3e3-n*500;const l=t.createBiquadFilter();l.type="peaking",l.frequency.value=1500,l.gain.value=8,l.Q.value=2;const c=t.createWaveShaper();return c.curve=or(10),a.connect(i),i.connect(o),o.connect(l),l.connect(c),c.connect(s),{type:"radio",nodes:[a,i,o,l,c,s],input:a,output:s}}buildUnderwater(t,n){const a=t.createGain(),s=t.createGain(),i=t.createBiquadFilter();i.type="lowpass",i.frequency.value=300+(1-n)*400,i.Q.value=5+n*10;const o=t.createOscillator();o.type="sine",o.frequency.value=.5+n*2;const l=t.createGain();l.gain.value=100+n*200,o.connect(l),l.connect(i.frequency);const c=t.createGain();c.gain.value=.7+n*.3;const u=t.createGain();return u.gain.value=.3-n*.2,a.connect(i),i.connect(c),a.connect(u),c.connect(s),u.connect(s),o.start(),{type:"underwater",nodes:[a,i,o,l,c,u,s],input:a,output:s}}buildWhisper(t,n){const a=t.createGain(),s=t.createGain(),i=t.createBiquadFilter();i.type="highpass",i.frequency.value=500+n*500,i.Q.value=.5;const o=t.createWaveShaper(),l=new Float32Array(256);for(let u=0;u<256;u++){const h=u/255*2-1;l[u]=Math.sign(h)*Math.pow(Math.abs(h),.3+n*.5)}o.curve=l;const c=t.createBiquadFilter();return c.type="highshelf",c.frequency.value=3e3,c.gain.value=6+n*6,a.connect(i),i.connect(o),o.connect(c),c.connect(s),{type:"whisper",nodes:[a,i,o,c,s],input:a,output:s}}buildDemon(t,n){const a=t.createGain(),s=t.createGain(),i=t.createDelay(.1);i.delayTime.value=.03;const o=t.createOscillator();o.type="sawtooth",o.frequency.value=2+n*3;const l=t.createGain();l.gain.value=.02+n*.015,o.connect(l),l.connect(i.delayTime);const c=t.createWaveShaper();c.curve=or(20+n*50),c.oversample="2x";const u=t.createBiquadFilter();u.type="lowshelf",u.frequency.value=200,u.gain.value=8+n*8;const h=t.createGain();h.gain.value=.7+n*.3;const p=t.createGain();return p.gain.value=.3,a.connect(i),i.connect(c),c.connect(u),u.connect(h),a.connect(p),h.connect(s),p.connect(s),o.start(),{type:"demon",nodes:[a,i,o,l,c,u,h,p,s],input:a,output:s}}buildTremolo(t,n){const a=t.createGain(),s=t.createGain(),i=t.createGain();i.gain.value=1;const o=t.createOscillator();o.type="sine",o.frequency.value=3+n*12;const l=t.createGain();return l.gain.value=.3+n*.5,o.connect(l),l.connect(i.gain),a.connect(i),i.connect(s),o.start(),{type:"tremolo",nodes:[a,i,o,l,s],input:a,output:s}}buildAutotune(t,n){const a=t.createGain(),s=t.createGain(),i=t.createDelay(.05);i.delayTime.value=.005;const o=t.createOscillator();o.type="sine",o.frequency.value=6+n*8;const l=t.createGain();l.gain.value=.002+n*.002,o.connect(l),l.connect(i.delayTime);const c=[],u=[261.6,293.7,329.6,349.2,392,440,493.9,523.3],h=t.createGain();h.gain.value=.15;for(const y of u){const m=t.createBiquadFilter();m.type="peaking",m.frequency.value=y,m.Q.value=8+n*15,m.gain.value=4+n*8,a.connect(m),m.connect(h),c.push(m)}const p=t.createGain();p.gain.value=.7;const g=t.createGain();return g.gain.value=.5+n*.3,a.connect(i),i.connect(g),h.connect(g),a.connect(p),g.connect(s),p.connect(s),o.start(),{type:"autotune",nodes:[a,i,o,l,...c,h,g,p,s],input:a,output:s}}buildVocoder(t,n){const a=t.createGain(),s=t.createGain(),i=t.createOscillator();i.type="sawtooth",i.frequency.value=110+n*110;const o=t.createGain();o.gain.value=0;const l=8,c=[a,s,i,o],u=t.createGain();u.gain.value=.5+n*.5,c.push(u);for(let p=0;p<l;p++){const g=200*Math.pow(2,p*.5),y=t.createBiquadFilter();y.type="bandpass",y.frequency.value=g,y.Q.value=4;const m=t.createBiquadFilter();m.type="bandpass",m.frequency.value=g,m.Q.value=4;const x=t.createGain();x.gain.value=0,a.connect(y),y.connect(x.gain),i.connect(m),m.connect(x),x.connect(u),c.push(y,m,x)}u.connect(s);const h=t.createGain();return h.gain.value=.3-n*.2,a.connect(h),h.connect(s),c.push(h),i.start(),{type:"vocoder",nodes:c,input:a,output:s}}}const l0={sparkle:B.NtdSparkle,music:B.NtdMusic,skull:B.NtdSkull,robot:B.NtdRobot,ghost:B.NtdGhost,mountain:B.NtdMountain,wave:B.NtdWave,lightning:B.NtdLightning,phone:B.NtdPhone,megaphone:B.NtdMegaphone,"volume-mute":B.NtdVolumeMute,microphone:B.NtdMicrophone,volume:B.NtdVolume},c0=({deviceId:e,mediaStream:t,compact:n=!1,t:a,className:s,style:i,id:o,accessMode:l,"data-testid":c})=>{const{t:u}=xe(),h=a??u,p=d.useRef(null),[g,y]=d.useState(!1),[m,x]=d.useState(()=>_l.map(z=>({...z}))),[b,f]=d.useState(!0),[j,v]=d.useState(80),[C,N]=d.useState(100),[M,k]=d.useState(0),T=d.useRef(0),E=d.useCallback(()=>{const z=()=>{var V;(V=p.current)!=null&&V.isStarted&&(k(p.current.getLevel()),T.current=requestAnimationFrame(z))};T.current=requestAnimationFrame(z)},[]),A=d.useCallback(()=>{T.current&&cancelAnimationFrame(T.current)},[]),I=d.useCallback(async()=>{const z=new Dl;p.current=z;try{t?await z.startWithStream(t):await z.start(e),z.setMonitoring(b),z.setVolume(j/100),z.setInputGain(C/100);for(const V of m)V.enabled&&z.addEffect(V.type,V.intensity);y(!0),E()}catch(V){typeof console<"u"&&console.warn("[VocalEffectsRack] start error",V)}},[e,t,b,j,C,m,E]),L=d.useCallback(()=>{var z;A(),(z=p.current)==null||z.stop(),p.current=null,y(!1),k(0)},[A]);d.useEffect(()=>()=>{var z;A(),(z=p.current)==null||z.stop(),p.current=null},[A]);const P=d.useCallback(z=>{x(V=>V.map(W=>{var G;if(W.type!==z)return W;const H={...W,enabled:!W.enabled};return(G=p.current)!=null&&G.isStarted&&(H.enabled?p.current.addEffect(z,H.intensity):p.current.removeEffect(z)),H}))},[]),_=d.useCallback((z,V)=>{x(W=>W.map(H=>{var G;return H.type!==z?H:(H.enabled&&((G=p.current)!=null&&G.isStarted)&&p.current.updateIntensity(z,V),{...H,intensity:V})}))},[]);d.useEffect(()=>{var z;(z=p.current)==null||z.setVolume(j/100)},[j]),d.useEffect(()=>{var z;(z=p.current)==null||z.setInputGain(C/100)},[C]),d.useEffect(()=>{var z;(z=p.current)==null||z.setMonitoring(b)},[b]);const ee=d.useCallback(()=>{var z;(z=p.current)==null||z.clearAllEffects(),x(V=>V.map(W=>({...W,enabled:!1})))},[]),K=m.filter(z=>z.enabled).length;return l==="hidden"?null:r.jsxs("div",{className:`nice-vocal-effects-rack${s?` ${s}`:""}`,style:{border:"1px solid var(--nice-border, #e2e8f0)",borderRadius:12,padding:n?12:20,background:"var(--nice-bg-secondary)",color:"var(--nice-text, inherit)",...i},id:o,"data-testid":c,children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:16,gap:8},children:[r.jsxs("h3",{style:{margin:0,fontSize:n?16:20,display:"flex",alignItems:"center",gap:8},children:[r.jsx(B.NtdMicrophone,{size:n?16:20})," ",h("vocalEffects.title","Vocal effects")]}),r.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[K>0&&r.jsxs(ie.NiceBadge,{variant:"primary",children:[K," ",h("vocalEffects.active","active")]}),g?r.jsx(ie.NiceButton,{variant:"danger",size:"sm",onClick:L,children:h("vocalEffects.stop","Stop")}):r.jsx(ie.NiceButton,{variant:"primary",size:"sm",onClick:I,children:h("vocalEffects.start","Start mic")})]})]}),r.jsxs("div",{style:{display:"flex",gap:16,alignItems:"center",marginBottom:16,flexWrap:"wrap"},children:[r.jsx(ie.NiceToggle,{checked:b,onChange:f,label:r.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(B.NtdVolume,{size:14})," ",h("vocalEffects.monitor","Monitor")]})}),r.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,fontSize:13},children:[h("vocalEffects.volume","Vol"),r.jsx("div",{style:{width:100},children:r.jsx(ie.NiceSlider,{value:j,onChange:v,min:0,max:200})}),r.jsxs("span",{style:{minWidth:36,fontSize:12},children:[j,"%"]})]}),r.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,fontSize:13},children:[h("vocalEffects.gain","Gain"),r.jsx("div",{style:{width:100},children:r.jsx(ie.NiceSlider,{value:C,onChange:N,min:0,max:300})}),r.jsxs("span",{style:{minWidth:36,fontSize:12},children:[C,"%"]})]}),g&&r.jsx("div",{style:{width:80,height:8,borderRadius:4,background:"var(--nice-bg-tertiary)",overflow:"hidden"},children:r.jsx("div",{style:{height:"100%",width:`${Math.min(100,M*300)}%`,background:M>.5?"var(--nice-danger, #ef4444)":M>.2?"var(--nice-warning, #f59e0b)":"var(--nice-success, #4caf50)",transition:"width 0.05s"}})}),K>0&&r.jsx(ie.NiceButton,{variant:"ghost",size:"sm",onClick:ee,children:h("vocalEffects.clearAll","Clear all")})]}),r.jsx("div",{style:{display:"grid",gridTemplateColumns:`repeat(auto-fill, minmax(${n?130:160}px, 1fr))`,gap:n?6:10},children:m.map(z=>r.jsxs("div",{style:{border:z.enabled?"2px solid var(--nice-accent, #3b82f6)":"1px solid var(--nice-border, #e2e8f0)",borderRadius:10,padding:n?"6px 8px":"10px 12px",background:z.enabled?"var(--nice-accent-tint-10, rgba(59,130,246,0.08))":"transparent",transition:"all 0.15s ease"},children:[r.jsxs("button",{type:"button",onClick:()=>P(z.type),style:{display:"flex",alignItems:"center",gap:6,width:"100%",marginBottom:z.enabled?6:0,background:"transparent",border:"none",cursor:"pointer",color:"inherit",textAlign:"left"},children:[(()=>{const V=l0[z.icon]??B.NtdMusic;return r.jsx(V,{size:n?18:22})})(),r.jsx("span",{style:{fontSize:n?12:14,fontWeight:z.enabled?700:500,color:z.enabled?"var(--nice-accent, #3b82f6)":"inherit"},children:z.label})]}),z.enabled&&r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},onClick:V=>V.stopPropagation(),onKeyDown:V=>{V.key!=="Escape"&&V.stopPropagation()},children:[r.jsx("div",{style:{flex:1},children:r.jsx(ie.NiceSlider,{value:z.intensity,onChange:V=>_(z.type,V),min:0,max:100})}),r.jsx("span",{style:{fontSize:11,minWidth:24,color:"var(--nice-text-muted, #64748b)"},children:z.intensity})]})]},z.type))}),r.jsx("div",{style:{marginTop:12,fontSize:12,color:"var(--nice-text-muted, #94a3b8)",textAlign:"center"},children:h("vocalEffects.hint","Click effects to toggle. Multiple effects can be active at once — adjust intensity with the slider.")})]})},zl={algorithm:"pitchy",gain:1,rmsThreshold:.02,pitchThreshold:.6,smoothingWindow:3,hysteresisFrames:2,useHanning:!1,offsetMs:0},d0=[{value:"pitchy",label:"Pitchy (fast)"},{value:"autocorrelation",label:"Autocorrelation"},{value:"librosa",label:"Librosa (server)"},{value:"crepe",label:"CREPE (AI, server)"}],u0=({deviceId:e,onDeviceChange:t,settings:n,onSettingsChange:a,audioInputs:s,algorithms:i=d0,showLevelMeter:o=!0,onCalibrate:l,compact:c=!1,t:u})=>{const{t:h}=xe(),p=u??h,g=d.useMemo(()=>({...zl,...n}),[n]),y=I=>a==null?void 0:a({...g,...I}),[m,x]=d.useState([]);d.useEffect(()=>{var P,_,ee;if(s||!((P=navigator.mediaDevices)!=null&&P.enumerateDevices))return;let I=!1;const L=()=>navigator.mediaDevices.enumerateDevices().then(K=>!I&&x(K.filter(z=>z.kind==="audioinput"))).catch(()=>{});return L(),(ee=(_=navigator.mediaDevices).addEventListener)==null||ee.call(_,"devicechange",L),()=>{var K,z;I=!0,(z=(K=navigator.mediaDevices).removeEventListener)==null||z.call(K,"devicechange",L)}},[s]);const b=s??m,f=d.useMemo(()=>b.map((I,L)=>({value:I.deviceId,label:I.label||`${p("audioInput.microphone","Microphone")} ${L+1}`})),[b,p]),[j,v]=d.useState(!1),[C,N]=d.useState(0),M=d.useRef(null),k=()=>{const I=M.current;I&&(cancelAnimationFrame(I.raf),I.stream.getTracks().forEach(L=>L.stop()),I.ctx.close().catch(()=>{}),M.current=null),v(!1),N(0)},T=async()=>{try{const I=await navigator.mediaDevices.getUserMedia({audio:{deviceId:e?{exact:e}:void 0}}),L=new AudioContext,P=L.createMediaStreamSource(I),_=L.createAnalyser();_.fftSize=1024,P.connect(_);const ee=new Float32Array(_.fftSize),K=()=>{_.getFloatTimeDomainData(ee);let z=0;for(let V=0;V<ee.length;V++)z+=ee[V]*ee[V];N(Math.sqrt(z/ee.length)*(g.gain||1)),M.current.raf=requestAnimationFrame(K)};M.current={ctx:L,stream:I,raf:requestAnimationFrame(K)},v(!0)}catch{}};d.useEffect(()=>()=>k(),[]);const E={fontSize:12,fontWeight:600,color:"var(--nice-text-muted, #94a3b8)",marginBottom:4,display:"block"},A=(I,L,P)=>r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10},children:[r.jsx("span",{style:{flex:"0 0 120px",fontSize:13},children:I}),r.jsx("div",{style:{flex:1},children:L}),r.jsx("span",{style:{flex:"0 0 48px",textAlign:"right",fontSize:12,color:"var(--nice-text-muted, #94a3b8)"},children:P})]});return r.jsxs("div",{className:"nice-audio-input-picker",style:{display:"flex",flexDirection:"column",gap:c?8:12,border:"1px solid var(--nice-border, #e2e8f0)",borderRadius:12,padding:c?12:16,color:"var(--nice-text, inherit)"},children:[r.jsxs("div",{style:{display:"flex",gap:12,flexWrap:"wrap"},children:[r.jsxs("div",{style:{flex:"1 1 220px",minWidth:180},children:[r.jsxs("label",{style:{...E,display:"inline-flex",alignItems:"center",gap:4},children:[r.jsx(B.NtdMicrophone,{size:13})," ",p("audioInput.device","Microphone")]}),r.jsx(ie.NiceSelect,{options:f,value:e??"",onChange:I=>t==null?void 0:t(typeof I=="string"?I:I[0]),placeholder:p("audioInput.selectDevice","Select microphone"),size:"sm"})]}),r.jsxs("div",{style:{flex:"1 1 200px",minWidth:160},children:[r.jsx("label",{style:E,children:p("audioInput.algorithm","Pitch algorithm")}),r.jsx(ie.NiceSelect,{options:i,value:g.algorithm,onChange:I=>y({algorithm:typeof I=="string"?I:I[0]}),size:"sm"})]})]}),r.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8},children:[A(p("audioInput.gain","Gain"),r.jsx(ie.NiceSlider,{value:Math.round(g.gain*100),onChange:I=>y({gain:I/100}),min:0,max:300}),`${Math.round(g.gain*100)}%`),A(p("audioInput.rmsThreshold","RMS gate"),r.jsx(ie.NiceSlider,{value:Math.round(g.rmsThreshold*1e3),onChange:I=>y({rmsThreshold:I/1e3}),min:0,max:200}),g.rmsThreshold.toFixed(3)),A(p("audioInput.pitchThreshold","Pitch clarity"),r.jsx(ie.NiceSlider,{value:Math.round(g.pitchThreshold*100),onChange:I=>y({pitchThreshold:I/100}),min:0,max:100}),g.pitchThreshold.toFixed(2)),!c&&A(p("audioInput.smoothing","Smoothing"),r.jsx(ie.NiceSlider,{value:g.smoothingWindow,onChange:I=>y({smoothingWindow:I}),min:0,max:12}),`${g.smoothingWindow}`),!c&&A(p("audioInput.hysteresis","Hysteresis"),r.jsx(ie.NiceSlider,{value:g.hysteresisFrames,onChange:I=>y({hysteresisFrames:I}),min:0,max:12}),`${g.hysteresisFrames}`),!c&&A(p("audioInput.offset","Latency"),r.jsx(ie.NiceSlider,{value:g.offsetMs,onChange:I=>y({offsetMs:I}),min:-200,max:500}),`${g.offsetMs}ms`)]}),r.jsxs("div",{style:{display:"flex",gap:12,alignItems:"center",flexWrap:"wrap"},children:[r.jsx(ie.NiceToggle,{checked:g.useHanning,onChange:I=>y({useHanning:I}),label:p("audioInput.hanning","Hanning window")}),o&&r.jsxs(r.Fragment,{children:[r.jsx(ie.NiceButton,{variant:j?"danger":"secondary",size:"sm",onClick:j?k:T,children:j?p("audioInput.stopTest","Stop test"):p("audioInput.testMic","Test mic")}),r.jsx("div",{style:{width:100,height:8,borderRadius:4,background:"var(--nice-bg-tertiary)",overflow:"hidden"},children:r.jsx("div",{style:{height:"100%",width:`${Math.min(100,C*300)}%`,background:C>.5?"var(--nice-danger, #ef4444)":C>.2?"var(--nice-warning, #f59e0b)":"var(--nice-success, #4caf50)",transition:"width 0.05s"}})})]}),l&&e&&r.jsxs(ie.NiceButton,{variant:"ghost",size:"sm",onClick:()=>l(e),children:[r.jsx(B.NtdSettings,{size:14})," ",p("audioInput.calibrate","Calibrate latency")]})]})]})};class Fl{constructor(t,n){this.activeNotes=new Map,this.audioContext=t,this.masterGain=t.createGain(),this.masterGain.gain.value=.3,this.masterGain.connect(n)}applyCC(t,n,a){}midiToFreq(t){return 440*Math.pow(2,(t-69)/12)}playNote(t,n=100,a=1,s="sine"){const i=this.midiToFreq(t),o=this.audioContext.createOscillator(),l=this.audioContext.createGain();o.type=s,o.frequency.value=i;const c=n/127*.8;l.gain.value=c,o.connect(l),l.connect(this.masterGain);const u=this.audioContext.currentTime;return l.gain.setValueAtTime(0,u),l.gain.linearRampToValueAtTime(c,u+.01),l.gain.exponentialRampToValueAtTime(c*.7,u+.1),l.gain.setValueAtTime(c*.7,u+a-.05),l.gain.exponentialRampToValueAtTime(.001,u+a),o.start(u),o.stop(u+a),o.onended=()=>{l.disconnect(),o.disconnect()},{osc:o,gain:l}}scheduleNote(t,n,a,s=100,i="sine"){const o=this.midiToFreq(t),l=this.audioContext.createOscillator(),c=this.audioContext.createGain();l.type=i,l.frequency.value=o;const u=s/127*.8;l.connect(c),c.connect(this.masterGain);const h=n;return c.gain.setValueAtTime(0,h),c.gain.linearRampToValueAtTime(u,h+.01),c.gain.exponentialRampToValueAtTime(u*.7,h+.1),c.gain.setValueAtTime(u*.7,h+a-.05),c.gain.exponentialRampToValueAtTime(.001,h+a),l.start(h),l.stop(h+a),l.onended=()=>{c.disconnect(),l.disconnect()},{osc:l,gain:c}}setVolume(t){this.masterGain.gain.value=Math.max(0,Math.min(1,t))}stopAll(){this.activeNotes.forEach(({osc:t,gain:n})=>{try{t.stop(),n.disconnect(),t.disconnect()}catch{}}),this.activeNotes.clear()}dispose(){this.stopAll(),this.masterGain.disconnect()}}const ji=st.scoped("AudioPlaybackEngine");class h0{constructor(){this.audioContext=null,this.masterGain=null,this.masterFilter=null,this.clips=new Map,this.scheduledSources=new Map,this.midiTracks=new Map,this.synths=new Map,this.isPlaying=!1,this.startTimeOffset=0,this.audioContextStartTime=0,this.currentTime=0,this.loopRegion={start:0,end:0,enabled:!1},this.bpm=120,this.duration=0,this.initAudioContext()}setMidiCCEvents(t,n){const a=this.midiTracks.get(t);a&&(a.ccEvents=n)}getMidiCCEvents(t){const n=this.midiTracks.get(t);return(n==null?void 0:n.ccEvents)||[]}addMidiCCEvent(t,n){const a=this.midiTracks.get(t);a&&(a.ccEvents||(a.ccEvents=[]),a.ccEvents.push(n))}removeMidiCCEvent(t,n){const a=this.midiTracks.get(t);a&&a.ccEvents&&(a.ccEvents=a.ccEvents.filter(s=>s.id!==n))}initAudioContext(){try{this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.masterGain=this.audioContext.createGain(),this.masterFilter=this.audioContext.createBiquadFilter(),this.masterFilter.type="peaking",this.masterFilter.frequency.value=1200,this.masterFilter.Q.value=.7,this.masterFilter.gain.value=0,this.masterGain.connect(this.masterFilter),this.masterFilter.connect(this.audioContext.destination),this.masterGain.gain.value=.8,this.audioContext.state==="suspended"&&this.audioContext.resume()}catch(t){ji.error("Failed to initialize AudioContext:",t)}}createEffectNode(t){if(!this.audioContext||t.bypass)return null;try{switch(t.type){case"eq3":{const n=this.audioContext.createBiquadFilter(),a=this.audioContext.createBiquadFilter(),s=this.audioContext.createBiquadFilter();return n.type="lowshelf",n.frequency.value=t.params.lowFreq||250,n.gain.value=t.params.lowGain||0,a.type="peaking",a.frequency.value=1e3,a.Q.value=1,a.gain.value=t.params.midGain||0,s.type="highshelf",s.frequency.value=t.params.highFreq||4e3,s.gain.value=t.params.highGain||0,n.connect(a),a.connect(s),{input:n,output:s}}case"compressor":{const n=this.audioContext.createDynamicsCompressor();return n.threshold.value=t.params.threshold||-24,n.ratio.value=t.params.ratio||4,n.attack.value=t.params.attack||.003,n.release.value=t.params.release||.25,n.knee.value=t.params.knee||30,n}case"delay":{const n=this.audioContext.createDelay(5);n.delayTime.value=t.params.time||.25;const a=this.audioContext.createGain();a.gain.value=t.params.feedback||.3;const s=this.audioContext.createGain();s.gain.value=t.params.mix||.3;const i=this.audioContext.createGain();return i.gain.value=1-(t.params.mix||.3),n.connect(a),a.connect(n),n.connect(s),{input:n,output:s,dry:i,connect:function(o){s.connect(o),i.connect(o)}}}case"reverb":{const n=this.audioContext.createConvolver(),a=this.audioContext.sampleRate*(t.params.decay||2),s=this.audioContext.createBuffer(2,a,this.audioContext.sampleRate);for(let l=0;l<2;l++){const c=s.getChannelData(l);for(let u=0;u<a;u++)c[u]=(Math.random()*2-1)*Math.pow(1-u/a,2)}n.buffer=s;const i=this.audioContext.createGain();i.gain.value=t.params.mix||.3;const o=this.audioContext.createGain();return o.gain.value=1-(t.params.mix||.3),n.connect(i),{input:n,output:i,dry:o,connect:function(l){i.connect(l),o.connect(l)}}}case"distortion":{const n=this.audioContext.createWaveShaper(),a=t.params.amount||20,s=44100,i=new Float32Array(s),o=Math.PI/180;for(let u=0;u<s;u++){const h=u*2/s-1;i[u]=(3+a)*h*20*o/(Math.PI+a*Math.abs(h))}n.curve=i,n.oversample="4x";const l=this.audioContext.createGain();l.gain.value=t.params.mix||.5;const c=this.audioContext.createGain();return c.gain.value=1-(t.params.mix||.5),n.connect(l),{input:n,output:l,dry:c,connect:function(u){l.connect(u),c.connect(u)}}}default:return null}}catch(n){return ji.error("Failed to create effect node:",t.type,n),null}}addClip(t){this.clips.set(t.id,t),this.updateDuration()}removeClip(t){this.clips.delete(t),this.stopClip(t),this.updateDuration()}updateClip(t,n){const a=this.clips.get(t);a&&(Object.assign(a,n),this.updateDuration())}getClipsByLayer(t){return Array.from(this.clips.values()).filter(n=>n.layerId===t)}setMidiTrack(t,n,a="sine",s=.5){if(this.midiTracks.set(t,{layerId:t,notes:n,instrument:a,volume:s}),!this.synths.has(t)&&this.audioContext&&this.masterGain){const i=new Fl(this.audioContext,this.masterGain);i.setVolume(s),this.synths.set(t,i)}}removeMidiTrack(t){this.midiTracks.delete(t);const n=this.synths.get(t);n&&(n.dispose(),this.synths.delete(t))}updateMidiTrackVolume(t,n){const a=this.midiTracks.get(t);a&&(a.volume=n);const s=this.synths.get(t);s&&s.setVolume(n)}updateDuration(){let t=0;this.clips.forEach(n=>{const a=n.startTime+n.duration;a>t&&(t=a)}),this.duration=t}play(){!this.audioContext||this.isPlaying||(this.audioContext.state==="suspended"&&this.audioContext.resume(),this.isPlaying=!0,this.audioContextStartTime=this.audioContext.currentTime,this.startTimeOffset=this.currentTime,this.scheduleClips(),this.scheduleMidiNotes(),this.startTimeTracking(),this.onPlayStateChange&&this.onPlayStateChange(!0))}pause(){this.isPlaying&&(this.isPlaying=!1,this.stopAllSources(),this.onPlayStateChange&&this.onPlayStateChange(!1))}stop(){this.pause(),this.seek(0)}seek(t){const n=this.isPlaying;n&&this.pause(),this.currentTime=Math.max(0,Math.min(t,this.duration)),this.onTimeUpdate&&this.onTimeUpdate(this.currentTime),n&&this.play()}scheduleClips(){!this.audioContext||!this.masterGain||this.clips.forEach(t=>{if(t.startTime+t.duration<=this.currentTime)return;const a=this.audioContext.createBufferSource();a.buffer=t.buffer,t.stretchFactor&&t.stretchFactor!==1&&(a.playbackRate.value=1/t.stretchFactor);const s=this.audioContext.createGain();s.gain.value=t.volume;const i=this.audioContext.createStereoPanner();i.pan.value=t.pan,a.connect(s);let o=s;if(t.effectChain&&t.effectChain.length>0)for(const h of t.effectChain){const p=this.createEffectNode(h);if(p)if("input"in p&&"output"in p){const g=p;o.connect(g.input),o=g.output,"dry"in p&&s.connect(g.dry)}else o.connect(p),o=p}o.connect(i),i.connect(this.masterGain);const l=t.startTime,c=Math.max(0,this.currentTime-l),u=this.audioContext.currentTime+(l-this.currentTime);u>=this.audioContext.currentTime&&(a.start(u,t.offset+c,t.duration-c),this.scheduledSources.set(t.id,a),a.onended=()=>{this.scheduledSources.delete(t.id)})})}stopClip(t){const n=this.scheduledSources.get(t);if(n){try{n.stop()}catch{}this.scheduledSources.delete(t)}}stopAllSources(){this.scheduledSources.forEach(t=>{try{t.stop()}catch{}}),this.scheduledSources.clear(),this.synths.forEach(t=>t.stopAll())}scheduleMidiNotes(){this.audioContext&&this.midiTracks.forEach(t=>{const n=this.synths.get(t.layerId);if(n&&(t.notes.forEach(a=>{if(a.start+a.duration<=this.currentTime)return;const i=Math.max(0,this.currentTime-a.start),o=this.audioContext.currentTime+(a.start-this.currentTime);o>=this.audioContext.currentTime&&n.scheduleNote(a.pitch,o,a.duration-i,a.velocity,t.instrument)}),t.ccEvents&&Array.isArray(t.ccEvents)&&t.ccEvents.length>0)){const a=[...t.ccEvents].sort((o,l)=>o.time-l.time);let i=a[0];for(let o=1;o<a.length;++o){const l=a[o],c=i.time,u=l.time,h=i.value,p=l.value,g=i.handleType||"linear",y=Math.max(2,Math.ceil((u-c)*20));for(let m=0;m<=y;++m){const x=m/y;let b=h;if(g==="linear")b=h+(p-h)*x;else if(g==="step")b=x<1?h:p;else if(g==="exp"){const C=Math.max(h/127,.001),N=Math.max(p/127,.001);b=C*Math.pow(N/C,x)*127}const f=c+(u-c)*x,j=this.audioContext.currentTime+(f-this.currentTime);j>=this.audioContext.currentTime&&typeof n.applyCC=="function"&&n.applyCC(l.cc,b,j)}i=l}}})}startTimeTracking(){if(!this.audioContext)return;const t=()=>{if(!this.isPlaying||!this.audioContext)return;const n=this.audioContext.currentTime-this.audioContextStartTime;if(this.currentTime=this.startTimeOffset+n,this.loopRegion.enabled&&this.currentTime>=this.loopRegion.end){this.seek(this.loopRegion.start);return}if(this.currentTime>=this.duration){this.stop();return}this.onTimeUpdate&&this.onTimeUpdate(this.currentTime),requestAnimationFrame(t)};requestAnimationFrame(t)}setLoopRegion(t,n,a){this.loopRegion={start:t,end:n,enabled:a}}setBPM(t){this.bpm=Math.max(20,Math.min(300,t))}getBPM(){return this.bpm}setMasterVolume(t){this.masterGain&&(this.masterGain.gain.value=Math.max(0,Math.min(1,t)))}setMasterFilter(t){this.masterFilter&&(t.type&&(this.masterFilter.type=t.type),t.frequency!=null&&(this.masterFilter.frequency.value=Math.max(20,Math.min(2e4,t.frequency))),t.q!=null&&(this.masterFilter.Q.value=Math.max(.1,Math.min(18,t.q))),t.gain!=null&&"gain"in this.masterFilter&&(this.masterFilter.gain.value=Math.max(-40,Math.min(40,t.gain))))}getCurrentTime(){return this.currentTime}getDuration(){return this.duration}getIsPlaying(){return this.isPlaying}setOnTimeUpdate(t){this.onTimeUpdate=t}setOnPlayStateChange(t){this.onPlayStateChange=t}dispose(){this.stop(),this.audioContext&&this.audioContext.close(),this.clips.clear()}}const p0=[{name:"Grand Piano",waveform:"sawtooth",attack:.02,sustain:.7,release:1.2,eq:{C:2,D:1,E:1,F:0,G:0,A:-1,B:-2,C2:-3},category:"Keyboard"},{name:"Electric Piano",waveform:"triangle",attack:.03,sustain:.8,release:1,eq:{C:0,D:1,E:2,F:3,G:1,A:-1,B:-2,C2:-2},category:"Keyboard"},{name:"Harpsichord",waveform:"square",attack:.01,sustain:.5,release:.6,eq:{C:-1,D:-1,E:0,F:2,G:3,A:1,B:0,C2:-1},category:"Keyboard"},{name:"Violin",waveform:"triangle",attack:.3,sustain:1,release:1.5,eq:{C:3,D:2,E:2,F:1,G:-1,A:-2,B:-3,C2:-3},category:"String"},{name:"Acoustic Guitar",waveform:"sawtooth",attack:.2,sustain:.6,release:.9,eq:{C:-1,D:-2,E:0,F:1,G:3,A:2,B:0,C2:-2},category:"String"},{name:"Electric Guitar",waveform:"square",attack:.05,sustain:.7,release:1.2,eq:{C:-2,D:1,E:2,F:2,G:1,A:0,B:-1,C2:-3},category:"String"},{name:"Kick Drum",waveform:"sine",attack:.005,sustain:.1,release:.2,eq:{C:5,D:3,E:0,F:-3,G:-5,A:-7,B:-9,C2:-10},category:"Percussion"},{name:"Snare Drum",waveform:"triangle",attack:.01,sustain:.2,release:.3,eq:{C:-2,D:-1,E:1,F:2,G:3,A:2,B:0,C2:-2},category:"Percussion"},{name:"Hi-Hat",waveform:"square",attack:.002,sustain:.05,release:.1,eq:{C:-5,D:-3,E:0,F:2,G:5,A:7,B:9,C2:10},category:"Percussion"},{name:"Acoustic Bass",waveform:"sine",attack:.08,sustain:.8,release:1.2,eq:{C:4,D:3,E:2,F:1,G:0,A:-1,B:-2,C2:-3},category:"Bass"},{name:"Electric Bass",waveform:"square",attack:.05,sustain:.9,release:1.3,eq:{C:3,D:2,E:1,F:0,G:-1,A:-2,B:-3,C2:-4},category:"Bass"},{name:"Trumpet",waveform:"sawtooth",attack:.1,sustain:.9,release:1.5,eq:{C:2,D:3,E:4,F:5,G:3,A:1,B:-1,C2:-3},category:"Brass"},{name:"Trombone",waveform:"triangle",attack:.2,sustain:1,release:1.7,eq:{C:3,D:4,E:5,F:4,G:2,A:0,B:-2,C2:-4},category:"Brass"},{name:"Saxophone",waveform:"sawtooth",attack:.15,sustain:.8,release:1.3,eq:{C:2,D:3,E:4,F:3,G:1,A:-1,B:-2,C2:-3},category:"Woodwind"},{name:"Clarinet",waveform:"triangle",attack:.18,sustain:.9,release:1.6,eq:{C:3,D:4,E:5,F:4,G:2,A:0,B:-1,C2:-2},category:"Woodwind"},{name:"Saw Synth",waveform:"sawtooth",attack:.05,sustain:.9,release:1.2,eq:{C:2,D:3,E:4,F:3,G:2,A:0,B:-1,C2:-2},category:"Synth"},{name:"Square Lead",waveform:"square",attack:.04,sustain:.85,release:1.1,eq:{C:2,D:3,E:4,F:3,G:1,A:0,B:-1,C2:-3},category:"Synth"}];function Ur(e={}){const{channelFilter:t,sysex:n=!1,onEvent:a,inputNameIncludes:s,onInputsChanged:i}=e,[o,l]=d.useState(null),[c,u]=d.useState(!1),[h,p]=d.useState([]),g=d.useRef(null),y=d.useCallback((m,x)=>{const b=m.data??new Uint8Array(0),f=b[0]??0,j=b[1]??0,v=b[2]??0,C=m.timeStamp,N=f&240,M=f&15,k=x.id,T=x.name??"MIDI Input",E=t===void 0||t===M;if((N===144||N===128)&&E){const A=N===144&&v>0;return{type:A?"noteon":"noteoff",note:j,velocity:A?v:0,channel:M,ts:C,deviceId:k,deviceName:T}}return N===176&&E?{type:"cc",controller:j,value:v,channel:M,ts:C,deviceId:k,deviceName:T}:N===208&&E?{type:"aftertouch",pressure:j,channel:M,ts:C,deviceId:k,deviceName:T}:N===224&&E?{type:"pitchbend",value:(j|v<<7)-8192,channel:M,ts:C,deviceId:k,deviceName:T}:N===192&&E?{type:"program",program:j,channel:M,ts:C,deviceId:k,deviceName:T}:{type:"unknown",status:f,data1:j,data2:v,channel:M,ts:C,deviceId:k,deviceName:T}},[t]);return d.useEffect(()=>{if(!("requestMIDIAccess"in navigator)){l(!1);return}l(!0);let m=!1;return navigator.requestMIDIAccess({sysex:n}).then(x=>{if(m)return;g.current=x,u(!0);const b=()=>{const f=Array.from(x.inputs.values()),j=s?f.filter(v=>(v.name||"").toUpperCase().includes(s.toUpperCase())):f;p(j),i==null||i(j),f.forEach(v=>v.onmidimessage=null),j.forEach(v=>{v.onmidimessage=C=>a==null?void 0:a(y(C,v))})};b(),x.onstatechange=()=>b()}),()=>{m=!0;const x=g.current;x&&(x.inputs.forEach(b=>b.onmidimessage=null),x.onstatechange=null)}},[s,a,i,y,n]),{supported:o,granted:c,inputs:h}}const rs="nice2dev.midiLearn";function f0(){try{const e=localStorage.getItem(rs);return e?JSON.parse(e):{}}catch{return{}}}function Mi(e){const t={};for(const n of e)t[n.id]={id:n.id,type:n.type,number:n.number,channel:n.channel,min:n.min,max:n.max};localStorage.setItem(rs,JSON.stringify(t))}function m0(e){const{parameters:t,onParameterChange:n}=e,[a,s]=d.useState(()=>{const v=f0();return t.map(C=>{const N=v[C.id];return{id:C.id,paramName:C.name,type:(N==null?void 0:N.type)??"cc",number:N==null?void 0:N.number,channel:N==null?void 0:N.channel,min:(N==null?void 0:N.min)??C.min??0,max:(N==null?void 0:N.max)??C.max??127,value:0}})}),[i,o]=d.useState({learning:!1,targetId:null}),[l,c]=d.useState(null),u=d.useRef(a);u.current=a;const h=d.useRef(n);h.current=n;const p=d.useRef(i);p.current=i;const g=d.useCallback(v=>{var N;c(v);const C=p.current;if(C.learning&&C.targetId){if(!u.current.find(T=>T.id===C.targetId))return;let k={};switch(v.type){case"cc":k={type:"cc",number:v.controller,channel:v.channel};break;case"noteon":k={type:"note",number:v.note,channel:v.channel};break;case"pitchbend":k={type:"pitchbend",channel:v.channel};break;case"aftertouch":k={type:"aftertouch",channel:v.channel};break;default:return}s(T=>{const E=T.map(A=>A.id===C.targetId?{...A,...k}:A);return Mi(E),E}),o({learning:!1,targetId:null});return}for(const M of u.current){if(M.number===void 0&&M.type!=="pitchbend"&&M.type!=="aftertouch"||M.channel!==void 0&&v.channel!==M.channel)continue;let k=null,T=127;if(M.type==="cc"&&v.type==="cc"&&v.controller===M.number?k=v.value:M.type==="note"&&v.type==="noteon"&&v.note===M.number?k=v.velocity:M.type==="pitchbend"&&v.type==="pitchbend"?(k=v.value+8192,T=16383):M.type==="aftertouch"&&v.type==="aftertouch"&&(k=v.pressure),k!==null){const E=k/T,A=M.min+E*(M.max-M.min);s(I=>I.map(L=>L.id===M.id?{...L,value:E}:L)),(N=h.current)==null||N.call(h,M.id,A,E)}}},[]),{supported:y,granted:m}=Ur({onEvent:g}),x=d.useCallback(v=>{o({learning:!0,targetId:v})},[]),b=d.useCallback(()=>{o({learning:!1,targetId:null})},[]),f=d.useCallback(v=>{s(C=>{const N=C.map(M=>M.id===v?{...M,type:"cc",number:void 0,channel:void 0}:M);return Mi(N),N})},[]),j=d.useCallback(()=>{s(v=>{const C=v.map(N=>({...N,type:"cc",number:void 0,channel:void 0,value:0}));return localStorage.removeItem(rs),C})},[]);return{bindings:a,startLearn:x,cancelLearn:b,removeBinding:f,clearAll:j,learnState:i,midiSupported:y,midiGranted:m,lastEvent:l}}const g0={masterChannel:0,memberChannels:[1,2,3,4,5,6,7,8,9,10,11,12,13,14],pitchBendRange:48};function y0(e={}){const{lowerZone:t=g0,onNoteExpression:n,onNoteOn:a,onNoteOff:s}=e,[i,o]=d.useState([]),l=d.useRef(new Map),c=d.useRef(n);c.current=n;const u=d.useRef(a);u.current=a;const h=d.useRef(s);h.current=s;const p=d.useRef(new Set(t.memberChannels));d.useEffect(()=>{p.current=new Set(t.memberChannels)},[t.memberChannels]);const g=d.useCallback(x=>{var f,j,v,C,N;if(!p.current.has(x.channel??-1))return;const b=`${x.channel}`;switch(x.type){case"noteon":{const M={note:x.note,channel:x.channel,velocity:x.velocity,pitchBend:0,pressure:0,slide:0,lastUpdate:x.ts};l.current.set(b,M),o(Array.from(l.current.values())),(f=u.current)==null||f.call(u,M);break}case"noteoff":{l.current.delete(b),o(Array.from(l.current.values())),(j=h.current)==null||j.call(h,x.channel,x.note);break}case"pitchbend":{const M=l.current.get(b);M&&(M.pitchBend=x.value,M.lastUpdate=x.ts,(v=c.current)==null||v.call(c,M),o(Array.from(l.current.values())));break}case"aftertouch":{const M=l.current.get(b);M&&(M.pressure=x.pressure,M.lastUpdate=x.ts,(C=c.current)==null||C.call(c,M),o(Array.from(l.current.values())));break}case"cc":{if(x.controller===74){const M=l.current.get(b);M&&(M.slide=x.value,M.lastUpdate=x.ts,(N=c.current)==null||N.call(c,M),o(Array.from(l.current.values())))}break}}},[]),{supported:y,granted:m}=Ur({onEvent:g,sysex:!1});return{activeNotes:i,midiSupported:y,midiGranted:m}}const v0={name:"M-Audio Oxygen 25 (MKIV)",deviceMatch:"OXYGEN",knobs:[{index:1,cc:21,label:"Knob 1"},{index:2,cc:22,label:"Knob 2"},{index:3,cc:23,label:"Knob 3"},{index:4,cc:24,label:"Knob 4"},{index:5,cc:25,label:"Knob 5"},{index:6,cc:26,label:"Knob 6"},{index:7,cc:27,label:"Knob 7"},{index:8,cc:28,label:"Knob 8"}],fader:{cc:7,label:"Fader (Channel Volume)"},pads:[{note:36,label:"Kick C1"},{note:38,label:"Snare D1"},{note:42,label:"HH Closed F#1"},{note:46,label:"HH Open A#1"},{note:48,label:"Tom1 C2"},{note:45,label:"Tom2 A1"},{note:43,label:"Floor G1"},{note:49,label:"Crash C#2"}],transport:{play:115,stop:114,record:117,rew:112,ff:113,loop:116}};function b0(e={},t=v0){const{t:n}=xe(),[a,s]=d.useState(()=>{const m=localStorage.getItem("oxygen25.layout");return m?JSON.parse(m):t}),[i,o]=d.useState([]),l=d.useRef({mode:"idle"}),c=d.useCallback(m=>{s(x=>{const b={...x,...m};return localStorage.setItem("oxygen25.layout",JSON.stringify(b)),b})},[]),u=d.useCallback(m=>{var f,j,v,C,N,M,k,T,E;const x=m.deviceName||"MIDI";o(A=>A.includes(x)?A:[...A,x]);const b=l.current;if(b.mode!=="idle"){if(b.mode==="knob"&&m.type==="cc"){const A=b.index;c({knobs:a.knobs.map(I=>I.index===A?{...I,cc:m.controller}:I)}),l.current={mode:"idle"};return}if(b.mode==="fader"&&m.type==="cc"){c({fader:{cc:m.controller,label:n("useOxygen25.fader","Fader")}}),l.current={mode:"idle"};return}if(b.mode==="pad"&&m.type==="noteon"){const A=a.pads.slice();A[b.padIdx]={...A[b.padIdx],note:m.note},c({pads:A}),l.current={mode:"idle"};return}if(b.mode==="transport"&&m.type==="cc"){const A={...a.transport};A[b.action]=m.controller,c({transport:A}),l.current={mode:"idle"};return}}switch(m.type){case"noteon":{a.pads.findIndex(I=>I.note===m.note)>=0?(f=e.onPad)==null||f.call(e,{note:m.note,velocity:m.velocity,ts:m.ts,device:x}):(j=e.onKey)==null||j.call(e,{note:m.note,velocity:m.velocity,ts:m.ts,device:x});break}case"cc":{if(a.fader&&m.controller===a.fader.cc){(v=e.onFader)==null||v.call(e,{cc:m.controller,value:m.value,ts:m.ts,device:x});break}const A=a.knobs.find(L=>L.cc===m.controller);if(A){(C=e.onKnob)==null||C.call(e,{index:A.index,cc:m.controller,value:m.value,ts:m.ts,device:x});break}const I=Object.keys(a.transport).find(L=>a.transport[L]===m.controller);if(I){(N=e.onTransport)==null||N.call(e,{action:I,value:m.value,ts:m.ts,device:x});break}(M=e.onUnknown)==null||M.call(e,m);break}case"pitchbend":(k=e.onPitchBend)==null||k.call(e,{value:m.value,ts:m.ts,device:x});break;case"aftertouch":(T=e.onAftertouch)==null||T.call(e,{pressure:m.pressure,ts:m.ts,device:x});break;default:(E=e.onUnknown)==null||E.call(e,m)}},[c,e,a,n]),{supported:h,granted:p,inputs:g}=Ur({inputNameIncludes:void 0,onEvent:u,sysex:!1,channelFilter:void 0,onInputsChanged:m=>o(m.map(x=>x.name||"MIDI"))}),y=d.useMemo(()=>({knob:m=>l.current={mode:"knob",index:m},fader:()=>l.current={mode:"fader"},pad:m=>l.current={mode:"pad",padIdx:m},transport:m=>l.current={mode:"transport",action:m},cancel:()=>l.current={mode:"idle"},state:()=>l.current}),[]);return{supported:h,granted:p,inputs:g,layout:a,setLayout:c,learn:y,inputsInfo:i}}const ja={major:[0,2,4,5,7,9,11],minor:[0,2,3,5,7,8,10],dorian:[0,2,3,5,7,9,10],mixolydian:[0,2,4,5,7,9,10],pentatonic:[0,2,4,7,9],minorPenta:[0,3,5,7,10],blues:[0,3,5,6,7,10],chromatic:[0,1,2,3,4,5,6,7,8,9,10,11]},x0=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],Ma={pop:[[0,4,7],[5,9,0],[7,11,2],[5,9,0]],rock:[[0,4,7],[5,9,0],[3,7,10],[5,9,0]],jazz:[[0,4,7,11],[2,5,9,0],[5,9,0,4],[0,4,7,11]],blues12:[[0,4,7],[0,4,7],[0,4,7],[0,4,7],[5,9,0],[5,9,0],[0,4,7],[0,4,7],[7,11,2],[5,9,0],[0,4,7],[7,11,2]]},nn=36,jn=38,Rt=42,rn=51,S0=49,Ra={basic:[{step:0,pitch:nn,vel:110},{step:0,pitch:Rt,vel:80},{step:2,pitch:Rt,vel:70},{step:4,pitch:jn,vel:100},{step:4,pitch:Rt,vel:80},{step:6,pitch:Rt,vel:70},{step:8,pitch:nn,vel:100},{step:10,pitch:Rt,vel:70},{step:12,pitch:jn,vel:100},{step:12,pitch:Rt,vel:80},{step:14,pitch:Rt,vel:70}],rock:[{step:0,pitch:nn,vel:120},{step:0,pitch:S0,vel:90},{step:4,pitch:jn,vel:110},{step:4,pitch:Rt,vel:80},{step:8,pitch:nn,vel:110},{step:8,pitch:Rt,vel:80},{step:10,pitch:nn,vel:90},{step:12,pitch:jn,vel:110},{step:12,pitch:Rt,vel:80}],swing:[{step:0,pitch:rn,vel:90},{step:3,pitch:rn,vel:70},{step:4,pitch:rn,vel:80},{step:8,pitch:rn,vel:90},{step:11,pitch:rn,vel:70},{step:12,pitch:rn,vel:80},{step:4,pitch:nn,vel:80},{step:12,pitch:jn,vel:70}]},Ol={root:0,scale:"pentatonic",tempo:120,bars:8,progression:"pop",drumPattern:"basic",density:.5,octave:4,seed:0};function k0(e){let t=e|0;return()=>{t=t+1831565813|0;let n=Math.imul(t^t>>>15,1|t);return n=n+Math.imul(n^n>>>7,61|n)^n,((n^n>>>14)>>>0)/4294967296}}let Bl=1;const lr=()=>Bl++,Gl=e=>60/e,w0=e=>Gl(e)/4;function ia(e,t,n,a){const s=t.length,i=Math.floor(n/s),o=(n%s+s)%s;return e+t[o]+(a+i)*12}function Wl(e=Ol){Bl=1;const t=e.seed>0?k0(e.seed):Math.random,n=ja[e.scale]??ja.pentatonic,a=Ma[e.progression]??Ma.pop,s=Ra[e.drumPattern]??Ra.basic,i=Gl(e.tempo),o=w0(e.tempo),l=Math.max(1,e.bars),c=16,u=[],h=[],p=[],g=[];let y=0;for(let m=0;m<l;m++){const x=m*4*i,b=m%a.length,f=a[b];for(const v of f)p.push({id:lr(),pitch:ia(e.root,n,v,e.octave-1),start:x,duration:4*i-.01,velocity:70+Math.floor(t()*20)});const j=f[0];for(let v=0;v<4;v++){const C=v===2?j+(t()>.5?2:0):j;h.push({id:lr(),pitch:ia(e.root,n,C,e.octave-2),start:x+v*i,duration:i*.9,velocity:80+Math.floor(t()*30)})}for(let v=0;v<c;v++){if(t()>e.density)continue;const C=x+v*o,N=t()>.8?t()>.5?2:-2:t()>.5?1:-1;y=Math.max(-3,Math.min(n.length+3,y+N));const M=1+Math.floor(t()*3);u.push({id:lr(),pitch:ia(e.root,n,y,e.octave),start:C,duration:M*o*.95,velocity:85+Math.floor(t()*30)})}for(const v of s)g.push({id:lr(),pitch:v.pitch,start:x+v.step*o,duration:o*.8,velocity:v.vel+Math.floor(t()*10-5)})}return{melody:u,bass:h,chords:p,drums:g,config:e}}const C0=Object.keys(ja),j0=Object.keys(Ma),M0=Object.keys(Ra),R0=Wl;function qe(e,t,n){return{cc:e,paramId:n,label:`Knob ${t}`,controlType:"knob",min:0,max:127,inverted:!1}}function Vn(e,t,n){return{cc:e,paramId:n,label:t,controlType:"fader",min:0,max:127,inverted:!1}}function an(e,t,n){return{cc:e,paramId:n,label:t,controlType:"button",min:0,max:127,inverted:!1}}const Ul={id:"oxygen25",name:"M-Audio Oxygen 25 (MkIV)",deviceMatch:"OXYGEN",mappings:[qe(21,1,"mixer.volume"),qe(22,2,"mixer.pan"),qe(23,3,"fx.reverb"),qe(24,4,"fx.delay"),qe(25,5,"fx.chorus"),qe(26,6,"fx.filter"),qe(27,7,"fx.drive"),qe(28,8,"fx.eq"),Vn(7,"Master Fader","mixer.master"),an(115,"Play","transport.play"),an(114,"Stop","transport.stop"),an(117,"Record","transport.record"),an(112,"Rewind","transport.rewind"),an(113,"Forward","transport.forward"),an(116,"Loop","transport.loop")]},Vl={id:"mpk-mini",name:"Akai MPK Mini",deviceMatch:"MPK",mappings:[qe(1,1,"mixer.volume"),qe(2,2,"mixer.pan"),qe(3,3,"fx.reverb"),qe(4,4,"fx.delay"),qe(5,5,"fx.chorus"),qe(6,6,"fx.filter"),qe(7,7,"fx.drive"),qe(8,8,"fx.eq")]},ql={id:"minilab",name:"Arturia MiniLab",deviceMatch:"Arturia MiniLab",mappings:[qe(7,1,"mixer.volume"),qe(74,2,"mixer.pan"),qe(71,3,"fx.reverb"),qe(76,4,"fx.delay"),qe(77,5,"fx.chorus"),qe(93,6,"fx.filter"),qe(73,7,"fx.drive"),qe(75,8,"fx.eq"),Vn(1,"Mod Wheel","mixer.master")]},Hl=(function(){return{id:"launch-control-xl",name:"Novation Launch Control XL",deviceMatch:"Launch Control",mappings:[...Array.from({length:8},(e,t)=>qe(13+t,t+1,`mixer.send${t+1}`)),...Array.from({length:8},(e,t)=>Vn(77+t,`Fader ${t+1}`,`mixer.track${t+1}`))]}})(),as={id:"generic",name:"Generic MIDI Controller",deviceMatch:"",mappings:[qe(1,1,"mixer.modWheel"),Vn(7,"Volume","mixer.volume"),qe(10,2,"mixer.pan"),Vn(11,"Expression","mixer.expression")]},Kl=[Ul,Vl,ql,Hl,as];class N0{constructor(t){this.ccMap=new Map,this.onChange=null,this.profile=t??as,this.rebuildMap()}setProfile(t){this.profile=t,this.rebuildMap()}getProfile(){return this.profile}autoDetect(t){const n=t.toUpperCase(),a=Kl.find(s=>s.deviceMatch&&n.includes(s.deviceMatch.toUpperCase()));return a?(this.setProfile(a),a):null}onMappedChange(t){this.onChange=t}handleCC(t,n){var c;const a=this.ccMap.get(t);if(!a)return null;const i=(a.inverted?127-n:n)/127,o=a.min+i*(a.max-a.min),l={paramId:a.paramId,label:a.label,rawValue:n,scaledValue:o,normalizedValue:i};return(c=this.onChange)==null||c.call(this,l),l}setMapping(t,n,a,s="knob"){const i={cc:t,paramId:n,label:a,controlType:s,min:0,max:127,inverted:!1},o=this.profile.mappings.findIndex(l=>l.cc===t);o>=0?this.profile.mappings[o]=i:this.profile.mappings.push(i),this.ccMap.set(t,i)}removeMapping(t){this.profile.mappings=this.profile.mappings.filter(n=>n.cc!==t),this.ccMap.delete(t)}getMappings(){return[...this.profile.mappings]}getMapping(t){return this.ccMap.get(t)}exportConfig(){return{...this.profile,mappings:this.profile.mappings.map(t=>({...t}))}}importConfig(t){this.profile={...t,mappings:t.mappings.map(n=>({...n}))},this.rebuildMap()}static createCustomProfile(t,n){return{id:`custom-${t.toLowerCase().replace(/\s+/g,"-")}`,name:t,deviceMatch:"",mappings:n.map(a=>({...a,min:0,max:127,inverted:!1}))}}rebuildMap(){this.ccMap.clear();for(const t of this.profile.mappings)this.ccMap.set(t.cc,t)}}function ss(e=60){return{active:!1,note:e,velocity:100,gate:.8,probability:1,slide:!1}}function Zt(e="New Pattern",t=16,n=120){return{name:e,length:t,steps:Array.from({length:t},()=>ss()),bpm:n,swing:0,rootNote:60}}function Yl(e,t){const n=e.steps.map((a,s)=>s===t?{...a,active:!a.active}:a);return{...e,steps:n}}function Zl(e,t,n){const a=e.steps.map((s,i)=>i===t?{...s,note:Math.max(0,Math.min(127,n))}:s);return{...e,steps:a}}function Xl(e,t,n){const a=e.steps.map((s,i)=>i===t?{...s,velocity:Math.max(0,Math.min(127,n))}:s);return{...e,steps:a}}function Ql(e,t,n){const a=e.steps.map((s,i)=>i===t?{...s,gate:Math.max(0,Math.min(1,n))}:s);return{...e,steps:a}}function Jl(e,t,n){const a=e.steps.map((s,i)=>i===t?{...s,probability:Math.max(0,Math.min(1,n))}:s);return{...e,steps:a}}function ec(e,t){const n=e.steps.map((a,s)=>s===t?{...a,slide:!a.slide}:a);return{...e,steps:n}}function tc(e,t){const n=e.steps.map(a=>a.active?{...a,note:Math.max(0,Math.min(127,a.note+t))}:a);return{...e,steps:n,rootNote:Math.max(0,Math.min(127,e.rootNote+t))}}function nc(e){return{...e,steps:[...e.steps].reverse()}}function rc(e,t){const n=e.steps.length,a=(t%n+n)%n,s=[...e.steps.slice(a),...e.steps.slice(0,a)];return{...e,steps:s}}function ac(e,t=60,n=127){const a=e.steps.map(s=>s.active?{...s,velocity:Math.floor(t+Math.random()*(n-t+1))}:s);return{...e,steps:a}}function sc(e){return{...e,steps:e.steps.map(()=>ss(e.rootNote))}}function is(e,t=4){return 60/e/t}function ic(e,t,n=0,a=4){const s=is(t,a),i=e*s;return e%2===1&&n>0?i+s*n*.5:i}function oc(e){return e.active&&Math.random()<e.probability}function T0(){const e=Zt("Kick",16);return[0,4,8,12].forEach(t=>{e.steps[t]={...e.steps[t],active:!0,note:36,velocity:110}}),e}function P0(){const e=Zt("Snare",16);return[4,12].forEach(t=>{e.steps[t]={...e.steps[t],active:!0,note:38,velocity:100}}),e}function E0(){const e=Zt("Hi-Hat",16);for(let t=0;t<16;t+=2)e.steps[t]={...e.steps[t],active:!0,note:42,velocity:80};return e}function $0(e=60){const t=Zt("Arp",16,120);return[0,4,7,12,7,4,0,-5,0,3,7,12,7,3,0,-5].forEach((a,s)=>{t.steps[s]={...t.steps[s],active:!0,note:e+a,velocity:90,gate:.5}}),{...t,rootNote:e}}function A0(e=36){const t=Zt("Bassline",16,120),n=[0,0,7,0,5,5,3,0,0,0,7,12,5,5,3,0],a=[1,0,1,0,1,0,1,1,1,0,1,1,1,0,1,0];return n.forEach((s,i)=>{t.steps[i]={...t.steps[i],active:!!a[i],note:e+s,velocity:100,gate:.7}}),{...t,rootNote:e}}function I0(e){return JSON.stringify(e,null,2)}function L0(e){try{const t=JSON.parse(e);return!t||!Array.isArray(t.steps)?null:t}catch{return null}}function _0(e={}){const{onTrigger:t,onLFOOutput:n,initialPattern:a}=e,[s,i]=d.useState(()=>a??Zt()),[o,l]=d.useState(-1),[c,u]=d.useState(!1),[h,p]=d.useState([]),g=d.useRef(s);g.current=s;const y=d.useRef(h);y.current=h;const m=d.useRef(c);m.current=c;const x=d.useRef(t);x.current=t;const b=d.useRef(n);b.current=n;const f=d.useRef(null),j=d.useRef(0),v=d.useRef(0),C=d.useCallback(()=>{var q,X;if(!m.current)return;const S=g.current,F=j.current%S.length,Y=S.steps[F];if(oc(Y)){const re=ic(j.current,S.bpm,S.swing);(q=x.current)==null||q.call(x,Y,F,re)}const O=(Date.now()-v.current)/1e3;for(let re=0;re<y.current.length;re++){const oe=y.current[re];if(oe.enabled&&oe.targetCC!==void 0){const se=Ia(oe,O,S.bpm);(X=b.current)==null||X.call(b,re,oe.targetCC,se)}}l(F),j.current++;const U=is(S.bpm)*1e3,$=F%2===0?0:U*S.swing*.5;f.current=setTimeout(C,U+$)},[]),N=d.useCallback(()=>{m.current||(j.current=0,v.current=Date.now(),u(!0),m.current=!0,C())},[C]),M=d.useCallback(()=>{u(!1),m.current=!1,l(-1),f.current&&(clearTimeout(f.current),f.current=null)},[]),k=d.useCallback(()=>{m.current?M():N()},[N,M]);d.useEffect(()=>()=>{f.current&&clearTimeout(f.current)},[]);const T=d.useCallback(S=>i(F=>Yl(F,S)),[]),E=d.useCallback((S,F)=>i(Y=>Zl(Y,S,F)),[]),A=d.useCallback((S,F)=>i(Y=>Xl(Y,S,F)),[]),I=d.useCallback((S,F)=>i(Y=>Ql(Y,S,F)),[]),L=d.useCallback((S,F)=>i(Y=>Jl(Y,S,F)),[]),P=d.useCallback(S=>i(F=>ec(F,S)),[]),_=d.useCallback(S=>i(F=>tc(F,S)),[]),ee=d.useCallback(()=>i(S=>nc(S)),[]),K=d.useCallback(S=>i(F=>rc(F,S)),[]),z=d.useCallback((S,F)=>i(Y=>ac(Y,S,F)),[]),V=d.useCallback(()=>i(S=>sc(S)),[]),W=d.useCallback(S=>i(F=>({...F,bpm:Math.max(20,Math.min(300,S))})),[]),H=d.useCallback(S=>i(F=>({...F,swing:Math.max(0,Math.min(1,S))})),[]),G=d.useCallback(S=>{i(F=>{if(F.length===S)return F;const Y=Array.from({length:S},(O,U)=>U<F.steps.length?F.steps[U]:{active:!1,note:F.rootNote,velocity:100,gate:.8,probability:1,slide:!1});return{...F,length:S,steps:Y}})},[]),Z=d.useCallback(S=>{p(F=>[...F,S??_r()])},[]),w=d.useCallback(S=>{p(F=>F.filter((Y,O)=>O!==S))},[]),R=d.useCallback((S,F)=>{p(Y=>Y.map((O,U)=>U===S?{...O,...F}:O))},[]);return{pattern:s,currentStep:o,playing:c,lfos:h,play:N,stop:M,togglePlayback:k,toggle:T,setNote:E,setVelocity:A,setGate:I,setProbability:L,toggleSlide:P,transpose:_,reverse:ee,shift:K,randomizeVel:z,clear:V,setPattern:i,setBpm:W,setSwing:H,setLength:G,addLFO:Z,removeLFO:w,updateLFO:R}}function os(e){const t=d.useRef(null),n=d.useRef(new Map),a=d.useRef(1),s=d.useCallback(()=>{if(!t.current){const o=e();o.onmessage=l=>{const{id:c}=l.data,u=n.current.get(c);u&&(n.current.delete(c),u.resolve(l.data))},o.onerror=l=>{console.error("[useWorker] Worker error:",l.message);for(const[c,u]of n.current)u.reject(new Error(`Worker error: ${l.message}`));n.current.clear(),o.terminate(),t.current=null},t.current=o}return t.current},[e]);return d.useEffect(()=>{const o=n.current;return()=>{var l;(l=t.current)==null||l.terminate(),t.current=null;for(const[,c]of o)c.reject(new Error("Worker terminated on unmount"));o.clear()}},[]),d.useCallback((o,l)=>{const c=a.current++,u=s();return new Promise((h,p)=>{n.current.set(c,{resolve:h,reject:p}),u.postMessage({...o,id:c},l??[])})},[s])}function D0(){const e=os(d.useCallback(()=>new Worker(new URL("/assets/pitchWorker-BgAp5Z97.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:vt&&vt.tagName.toUpperCase()==="SCRIPT"&&vt.src||new URL("index.cjs",document.baseURI).href),{type:"module"}),[]));return d.useCallback(async(n,a,s=.01)=>(await e({buffer:n,sampleRate:a,rmsThreshold:s})).hz,[e])}function z0(){const e=os(d.useCallback(()=>new Worker(new URL("/assets/scoringWorker-3JjtDDtu.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:vt&&vt.tagName.toUpperCase()==="SCRIPT"&&vt.src||new URL("index.cjs",document.baseURI).href),{type:"module"}),[]));return d.useCallback(async(n,a,s)=>(await e({notes:n,points:a,params:s})).result,[e])}const F0={fftSize:2048,smoothingTimeConstant:.8,enablePitchDetection:!0,enableBeatDetection:!0,enableLevelMeter:!0,beatThreshold:.15};function lc(){return`
72
72
  /**
73
73
  * NiceAudioProcessor — Main audio analysis processor.
74
74
  */
@@ -404,7 +404,7 @@ registerProcessor('nice-audio-processor', NiceAudioProcessor);
404
404
  registerProcessor('nice-gain-processor', NiceGainProcessor);
405
405
  registerProcessor('nice-compressor-processor', NiceCompressorProcessor);
406
406
  registerProcessor('nice-vocoder-processor', NiceVocoderProcessor);
407
- `}let Ri=!1,cr=null;async function cc(e){if(!Ri)return cr||(cr=(async()=>{const t=lc(),n=new Blob([t],{type:"application/javascript"}),a=URL.createObjectURL(n);try{await e.audioWorklet.addModule(a),Ri=!0}finally{URL.revokeObjectURL(a)}})(),cr)}function dc(e,t,n){const a=new AudioWorkletNode(e,"nice-audio-processor",{processorOptions:{...F0,...t}});return n&&(a.port.onmessage=s=>{s.data.type==="analysis"&&n(s.data.payload)}),a}function uc(e,t=1){const n=new AudioWorkletNode(e,"nice-gain-processor");return n.parameters.get("gain").value=t,n}function hc(e,t){const n=new AudioWorkletNode(e,"nice-compressor-processor");return(t==null?void 0:t.threshold)!==void 0&&(n.parameters.get("threshold").value=t.threshold),(t==null?void 0:t.ratio)!==void 0&&(n.parameters.get("ratio").value=t.ratio),(t==null?void 0:t.attack)!==void 0&&(n.parameters.get("attack").value=t.attack),(t==null?void 0:t.release)!==void 0&&(n.parameters.get("release").value=t.release),(t==null?void 0:t.makeupGain)!==void 0&&(n.parameters.get("makeupGain").value=t.makeupGain),n}function pc(e,t){const n=new AudioWorkletNode(e,"nice-vocoder-processor");return(t==null?void 0:t.pitchShift)!==void 0&&(n.parameters.get("pitchShift").value=t.pitchShift),(t==null?void 0:t.formantShift)!==void 0&&(n.parameters.get("formantShift").value=t.formantShift),(t==null?void 0:t.mix)!==void 0&&(n.parameters.get("mix").value=t.mix),n}function O0(e={}){const{enableAnalysis:t=!0,analysisOptions:n,enableGain:a=!1,initialGain:s=1,enableCompressor:i=!1,compressorOptions:o,enableVocoder:l=!1,vocoderOptions:c,onAnalysis:u}=e,[h,p]=d.useState(!1),[g,y]=d.useState(null),[m,x]=d.useState(null),b=d.useRef(null),f=d.useRef(null),k=d.useRef(null),v=d.useRef(null),w=d.useRef(null),R=d.useRef(null),M=d.useRef(null),j=d.useRef(null),T=d.useRef({analysisOptions:n,initialGain:s,compressorOptions:o,vocoderOptions:c});T.current={analysisOptions:n,initialGain:s,compressorOptions:o,vocoderOptions:c};const P=d.useRef(u);P.current=u,d.useEffect(()=>{let Y=!0;return(async()=>{try{const U=T.current,V=new AudioContext;if(b.current=V,await cc(V),!Y){V.close();return}const K=[];if(t){const G=dc(V,U.analysisOptions,W=>{var C;Y&&(x(W),(C=P.current)==null||C.call(P,W))});f.current=G,K.push(G)}if(a){const G=uc(V,U.initialGain);k.current=G,K.push(G)}if(i){const G=hc(V,U.compressorOptions);v.current=G,K.push(G)}if(l){const G=pc(V,U.vocoderOptions);w.current=G,K.push(G)}if(K.length>0){M.current=K[0],j.current=K[K.length-1];for(let G=0;G<K.length-1;G++)K[G].connect(K[G+1])}p(!0)}catch(U){Y&&y(U)}})(),()=>{var U,V,K,G,W;Y=!1,(U=f.current)==null||U.disconnect(),(V=k.current)==null||V.disconnect(),(K=v.current)==null||K.disconnect(),(G=w.current)==null||G.disconnect(),(W=b.current)==null||W.close()}},[t,a,i,l]);const A=d.useCallback(Y=>{R.current&&R.current.disconnect(),R.current=Y,M.current&&Y.connect(M.current)},[]),I=d.useCallback(()=>{R.current&&(R.current.disconnect(),R.current=null)},[]),L=d.useCallback(()=>j.current,[]),N=d.useCallback(Y=>{var U;const O=(U=k.current)==null?void 0:U.parameters.get("gain");O&&(O.value=Math.max(0,Math.min(2,Y)))},[]),_=d.useCallback((Y,O)=>{var V;const U=(V=v.current)==null?void 0:V.parameters.get(Y);U&&(U.value=O)},[]),ee=d.useCallback((Y,O)=>{var V;const U=(V=w.current)==null?void 0:V.parameters.get(Y);U&&(U.value=O)},[]);return{isReady:h,error:g,analysis:m,connectSource:A,disconnectSource:I,getOutputNode:L,setGain:N,setCompressorParam:_,setVocoderParam:ee,audioContext:b.current}}function B0(e,t,n){const i={id:`${t}-${n}-${Date.now()}`,type:n,bypass:!1,params:{eq3:{lowGain:0,midGain:0,highGain:0,lowFreq:250,highFreq:4e3},compressor:{threshold:-24,ratio:4,attack:.003,release:.25,knee:30},delay:{time:.25,feedback:.3,mix:.3},reverb:{decay:2,mix:.3},distortion:{amount:20,mix:.5}}[n]};e(o=>{var l;return{...o,[t]:{...o[t],effectChain:[...((l=o[t])==null?void 0:l.effectChain)||[],i]}}})}function G0(e,t,n){e(a=>{var s,i;return{...a,[t]:{...a[t],effectChain:((i=(s=a[t])==null?void 0:s.effectChain)==null?void 0:i.filter(o=>o.id!==n))||[]}}})}function W0(e,t,n){e(a=>{var s,i;return{...a,[t]:{...a[t],effectChain:((i=(s=a[t])==null?void 0:s.effectChain)==null?void 0:i.map(o=>o.id===n?{...o,bypass:!o.bypass}:o))||[]}}})}function V0(e,t,n,a){e(s=>{var i,o;return{...s,[t]:{...s[t],effectChain:((o=(i=s[t])==null?void 0:i.effectChain)==null?void 0:o.map(l=>l.id===n?{...l,params:{...l.params,...a}}:l))||[]}}})}function U0(e,t,n,a,s,i,o=.5,l=100){const c={id:Date.now()+Math.floor(Math.random()*1e3),pitch:s,start:i,duration:o,velocity:l};t(u=>({...u,[a]:[...u[a]||[],c]})),n({layerId:a,noteId:c.id})}function q0(e,t,n,a){e(s=>({...s,[n]:(s[n]||[]).filter(i=>i.id!==a)})),t(null)}function H0(e,t,n){e(a=>({...a,[n]:[]})),t(null)}function K0(e,t,n){e(a=>({...a,[t]:n}))}function Y0(e,t,n,a,s){const i={id:Date.now()+Math.floor(Math.random()*1e3),cc:n,value:a,time:s};e(o=>({...o,[t]:[...o[t]||[],i]}))}function Z0(e,t,n,a,s,i){e(o=>({...o,[t]:(o[t]||[]).map(l=>l.id===n?{...l,value:a,time:s,handleType:i??l.handleType}:l)}))}function X0(e,t,n){e(a=>({...a,[t]:(a[t]||[]).filter(s=>s.id!==n)}))}function dr(e){if(!e||e<=0)return null;const t=12*Math.log2(e/440)+69;return Math.round(t-12)}function Q0(e){if(e.length===0)return[];const t=[];let n=e[0];for(let a=1;a<e.length;a++){const s=e[a];s.pitch===n.pitch&&Math.abs(s.freq-n.freq)<1?n.duration+=s.duration:(t.push(n),n=s)}return t.push(n),t}function J0(e,t,n=.01){const a=Math.floor(t/50);let s=-1,i=0,o=0;for(let c=0;c<e.length;c++)o+=e[c]*e[c];if(o=Math.sqrt(o/e.length),o<n)return 0;let l=1;for(let c=50;c<a;c++){let u=0;for(let h=0;h<a;h++)u+=Math.abs(e[h]-e[h+c]);u=1-u/a,u>i&&u>.9&&u>l&&(i=u,s=c),l=u}return s===-1?0:t/s}async function eg(e,t,n){const{signal:a,onProgress:s,rmsThreshold:i,useHanning:o,postPitch:l,postLibrosaPitchTrack:c}=n||{},u=await e.arrayBuffer();if(a!=null&&a.aborted)throw new Error("aborted");const p=await new(window.AudioContext||window.webkitAudioContext)().decodeAudioData(u),g=p.getChannelData(0),y=p.sampleRate,m=Math.floor(y*.1),x=m,b=[];if(t==="pitchy"){const f=la.PitchDetector.forFloat32Array(m),k=Math.max(1,Math.floor((g.length-m)/x));let v=0;for(let w=0;w<g.length-m;w+=x){if(a!=null&&a.aborted)throw new Error("aborted");const R=g.slice(w,w+m);if(o)for(let I=0;I<R.length;I++)R[I]*=.5*(1-Math.cos(2*Math.PI*I/(R.length-1)));const[M,j]=f.findPitch(R,y),T=dr(M);let P=0;for(let I=0;I<R.length;I++)P+=R[I]*R[I];P=Math.sqrt(P/R.length);const A=typeof i=="number"?i:.01;T&&M>50&&M<2e3&&j>.7&&P>A&&b.push({start:w/y,duration:m/y,pitch:T,freq:M}),v++,s&&s(v/k)}}else if(t==="crepe"){if(s&&s(.05),!l)throw new Error("CREPE backend callback (postPitch) is required for crepe algorithm");const f=await l(e);if(a!=null&&a.aborted)throw new Error("aborted");const k=Array.isArray(f.track)?f.track:[];k.length>0&&k.forEach((v,w)=>{var M;const R=dr(v.hz);if(R&&v.hz>50&&v.hz<2e3){const j=((M=k[w+1])==null?void 0:M.t)??v.t+.1;b.push({start:v.t,duration:w<k.length-1?j-v.t:.1,pitch:R,freq:v.hz})}}),s&&s(1)}else if(t==="ultrastar-wp"){const f=Math.max(1,Math.floor((g.length-m)/x));let k=0;for(let v=0;v<g.length-m;v+=x){if(a!=null&&a.aborted)throw new Error("aborted");const w=g.slice(v,v+m);if(o)for(let T=0;T<w.length;T++)w[T]*=.5*(1-Math.cos(2*Math.PI*T/(w.length-1)));const M=J0(w,y,typeof i=="number"?i:.01),j=dr(M);j&&M>50&&M<2e3&&b.push({start:v/y,duration:m/y,pitch:j,freq:M}),k++,s&&s(k/f)}}if(t==="librosa"){if(s&&s(.05),!c)throw new Error("Librosa backend callback (postLibrosaPitchTrack) is required for librosa algorithm");const f=await c(e);if(a!=null&&a.aborted)throw new Error("aborted");const k=Array.isArray(f.track)?f.track:[];k.length>0&&k.forEach((v,w)=>{var M;const R=dr(v.hz);if(R&&v.hz>50&&v.hz<2e3){const j=((M=k[w+1])==null?void 0:M.t)??v.t+.1;b.push({start:v.t,duration:w<k.length-1?j-v.t:.1,pitch:R,freq:v.hz})}}),s&&s(1)}return Q0(b)}function tg(e){switch(e){case"pitchy":return`#TITLE:Analyzed Song
407
+ `}let Ri=!1,cr=null;async function cc(e){if(!Ri)return cr||(cr=(async()=>{const t=lc(),n=new Blob([t],{type:"application/javascript"}),a=URL.createObjectURL(n);try{await e.audioWorklet.addModule(a),Ri=!0}finally{URL.revokeObjectURL(a)}})(),cr)}function dc(e,t,n){const a=new AudioWorkletNode(e,"nice-audio-processor",{processorOptions:{...F0,...t}});return n&&(a.port.onmessage=s=>{s.data.type==="analysis"&&n(s.data.payload)}),a}function uc(e,t=1){const n=new AudioWorkletNode(e,"nice-gain-processor");return n.parameters.get("gain").value=t,n}function hc(e,t){const n=new AudioWorkletNode(e,"nice-compressor-processor");return(t==null?void 0:t.threshold)!==void 0&&(n.parameters.get("threshold").value=t.threshold),(t==null?void 0:t.ratio)!==void 0&&(n.parameters.get("ratio").value=t.ratio),(t==null?void 0:t.attack)!==void 0&&(n.parameters.get("attack").value=t.attack),(t==null?void 0:t.release)!==void 0&&(n.parameters.get("release").value=t.release),(t==null?void 0:t.makeupGain)!==void 0&&(n.parameters.get("makeupGain").value=t.makeupGain),n}function pc(e,t){const n=new AudioWorkletNode(e,"nice-vocoder-processor");return(t==null?void 0:t.pitchShift)!==void 0&&(n.parameters.get("pitchShift").value=t.pitchShift),(t==null?void 0:t.formantShift)!==void 0&&(n.parameters.get("formantShift").value=t.formantShift),(t==null?void 0:t.mix)!==void 0&&(n.parameters.get("mix").value=t.mix),n}function O0(e={}){const{enableAnalysis:t=!0,analysisOptions:n,enableGain:a=!1,initialGain:s=1,enableCompressor:i=!1,compressorOptions:o,enableVocoder:l=!1,vocoderOptions:c,onAnalysis:u}=e,[h,p]=d.useState(!1),[g,y]=d.useState(null),[m,x]=d.useState(null),b=d.useRef(null),f=d.useRef(null),j=d.useRef(null),v=d.useRef(null),C=d.useRef(null),N=d.useRef(null),M=d.useRef(null),k=d.useRef(null),T=d.useRef({analysisOptions:n,initialGain:s,compressorOptions:o,vocoderOptions:c});T.current={analysisOptions:n,initialGain:s,compressorOptions:o,vocoderOptions:c};const E=d.useRef(u);E.current=u,d.useEffect(()=>{let K=!0;return(async()=>{try{const V=T.current,W=new AudioContext;if(b.current=W,await cc(W),!K){W.close();return}const H=[];if(t){const G=dc(W,V.analysisOptions,Z=>{var w;K&&(x(Z),(w=E.current)==null||w.call(E,Z))});f.current=G,H.push(G)}if(a){const G=uc(W,V.initialGain);j.current=G,H.push(G)}if(i){const G=hc(W,V.compressorOptions);v.current=G,H.push(G)}if(l){const G=pc(W,V.vocoderOptions);C.current=G,H.push(G)}if(H.length>0){M.current=H[0],k.current=H[H.length-1];for(let G=0;G<H.length-1;G++)H[G].connect(H[G+1])}p(!0)}catch(V){K&&y(V)}})(),()=>{var V,W,H,G,Z;K=!1,(V=f.current)==null||V.disconnect(),(W=j.current)==null||W.disconnect(),(H=v.current)==null||H.disconnect(),(G=C.current)==null||G.disconnect(),(Z=b.current)==null||Z.close()}},[t,a,i,l]);const A=d.useCallback(K=>{N.current&&N.current.disconnect(),N.current=K,M.current&&K.connect(M.current)},[]),I=d.useCallback(()=>{N.current&&(N.current.disconnect(),N.current=null)},[]),L=d.useCallback(()=>k.current,[]),P=d.useCallback(K=>{var V;const z=(V=j.current)==null?void 0:V.parameters.get("gain");z&&(z.value=Math.max(0,Math.min(2,K)))},[]),_=d.useCallback((K,z)=>{var W;const V=(W=v.current)==null?void 0:W.parameters.get(K);V&&(V.value=z)},[]),ee=d.useCallback((K,z)=>{var W;const V=(W=C.current)==null?void 0:W.parameters.get(K);V&&(V.value=z)},[]);return{isReady:h,error:g,analysis:m,connectSource:A,disconnectSource:I,getOutputNode:L,setGain:P,setCompressorParam:_,setVocoderParam:ee,audioContext:b.current}}function B0(e,t,n){const i={id:`${t}-${n}-${Date.now()}`,type:n,bypass:!1,params:{eq3:{lowGain:0,midGain:0,highGain:0,lowFreq:250,highFreq:4e3},compressor:{threshold:-24,ratio:4,attack:.003,release:.25,knee:30},delay:{time:.25,feedback:.3,mix:.3},reverb:{decay:2,mix:.3},distortion:{amount:20,mix:.5}}[n]};e(o=>{var l;return{...o,[t]:{...o[t],effectChain:[...((l=o[t])==null?void 0:l.effectChain)||[],i]}}})}function G0(e,t,n){e(a=>{var s,i;return{...a,[t]:{...a[t],effectChain:((i=(s=a[t])==null?void 0:s.effectChain)==null?void 0:i.filter(o=>o.id!==n))||[]}}})}function W0(e,t,n){e(a=>{var s,i;return{...a,[t]:{...a[t],effectChain:((i=(s=a[t])==null?void 0:s.effectChain)==null?void 0:i.map(o=>o.id===n?{...o,bypass:!o.bypass}:o))||[]}}})}function U0(e,t,n,a){e(s=>{var i,o;return{...s,[t]:{...s[t],effectChain:((o=(i=s[t])==null?void 0:i.effectChain)==null?void 0:o.map(l=>l.id===n?{...l,params:{...l.params,...a}}:l))||[]}}})}function V0(e,t,n,a,s,i,o=.5,l=100){const c={id:Date.now()+Math.floor(Math.random()*1e3),pitch:s,start:i,duration:o,velocity:l};t(u=>({...u,[a]:[...u[a]||[],c]})),n({layerId:a,noteId:c.id})}function q0(e,t,n,a){e(s=>({...s,[n]:(s[n]||[]).filter(i=>i.id!==a)})),t(null)}function H0(e,t,n){e(a=>({...a,[n]:[]})),t(null)}function K0(e,t,n){e(a=>({...a,[t]:n}))}function Y0(e,t,n,a,s){const i={id:Date.now()+Math.floor(Math.random()*1e3),cc:n,value:a,time:s};e(o=>({...o,[t]:[...o[t]||[],i]}))}function Z0(e,t,n,a,s,i){e(o=>({...o,[t]:(o[t]||[]).map(l=>l.id===n?{...l,value:a,time:s,handleType:i??l.handleType}:l)}))}function X0(e,t,n){e(a=>({...a,[t]:(a[t]||[]).filter(s=>s.id!==n)}))}function dr(e){if(!e||e<=0)return null;const t=12*Math.log2(e/440)+69;return Math.round(t-12)}function Q0(e){if(e.length===0)return[];const t=[];let n=e[0];for(let a=1;a<e.length;a++){const s=e[a];s.pitch===n.pitch&&Math.abs(s.freq-n.freq)<1?n.duration+=s.duration:(t.push(n),n=s)}return t.push(n),t}function J0(e,t,n=.01){const a=Math.floor(t/50);let s=-1,i=0,o=0;for(let c=0;c<e.length;c++)o+=e[c]*e[c];if(o=Math.sqrt(o/e.length),o<n)return 0;let l=1;for(let c=50;c<a;c++){let u=0;for(let h=0;h<a;h++)u+=Math.abs(e[h]-e[h+c]);u=1-u/a,u>i&&u>.9&&u>l&&(i=u,s=c),l=u}return s===-1?0:t/s}async function eg(e,t,n){const{signal:a,onProgress:s,rmsThreshold:i,useHanning:o,postPitch:l,postLibrosaPitchTrack:c}=n||{},u=await e.arrayBuffer();if(a!=null&&a.aborted)throw new Error("aborted");const p=await new(window.AudioContext||window.webkitAudioContext)().decodeAudioData(u),g=p.getChannelData(0),y=p.sampleRate,m=Math.floor(y*.1),x=m,b=[];if(t==="pitchy"){const f=la.PitchDetector.forFloat32Array(m),j=Math.max(1,Math.floor((g.length-m)/x));let v=0;for(let C=0;C<g.length-m;C+=x){if(a!=null&&a.aborted)throw new Error("aborted");const N=g.slice(C,C+m);if(o)for(let I=0;I<N.length;I++)N[I]*=.5*(1-Math.cos(2*Math.PI*I/(N.length-1)));const[M,k]=f.findPitch(N,y),T=dr(M);let E=0;for(let I=0;I<N.length;I++)E+=N[I]*N[I];E=Math.sqrt(E/N.length);const A=typeof i=="number"?i:.01;T&&M>50&&M<2e3&&k>.7&&E>A&&b.push({start:C/y,duration:m/y,pitch:T,freq:M}),v++,s&&s(v/j)}}else if(t==="crepe"){if(s&&s(.05),!l)throw new Error("CREPE backend callback (postPitch) is required for crepe algorithm");const f=await l(e);if(a!=null&&a.aborted)throw new Error("aborted");const j=Array.isArray(f.track)?f.track:[];j.length>0&&j.forEach((v,C)=>{var M;const N=dr(v.hz);if(N&&v.hz>50&&v.hz<2e3){const k=((M=j[C+1])==null?void 0:M.t)??v.t+.1;b.push({start:v.t,duration:C<j.length-1?k-v.t:.1,pitch:N,freq:v.hz})}}),s&&s(1)}else if(t==="ultrastar-wp"){const f=Math.max(1,Math.floor((g.length-m)/x));let j=0;for(let v=0;v<g.length-m;v+=x){if(a!=null&&a.aborted)throw new Error("aborted");const C=g.slice(v,v+m);if(o)for(let T=0;T<C.length;T++)C[T]*=.5*(1-Math.cos(2*Math.PI*T/(C.length-1)));const M=J0(C,y,typeof i=="number"?i:.01),k=dr(M);k&&M>50&&M<2e3&&b.push({start:v/y,duration:m/y,pitch:k,freq:M}),j++,s&&s(j/f)}}if(t==="librosa"){if(s&&s(.05),!c)throw new Error("Librosa backend callback (postLibrosaPitchTrack) is required for librosa algorithm");const f=await c(e);if(a!=null&&a.aborted)throw new Error("aborted");const j=Array.isArray(f.track)?f.track:[];j.length>0&&j.forEach((v,C)=>{var M;const N=dr(v.hz);if(N&&v.hz>50&&v.hz<2e3){const k=((M=j[C+1])==null?void 0:M.t)??v.t+.1;b.push({start:v.t,duration:C<j.length-1?k-v.t:.1,pitch:N,freq:v.hz})}}),s&&s(1)}return Q0(b)}function tg(e){switch(e){case"pitchy":return`#TITLE:Analyzed Song
408
408
  #ARTIST:AI
409
409
  #ALGO:Pitchy
410
410
  : 0 4 40 Pitchy
@@ -427,4 +427,4 @@ E`;case"ultrastarws":return`#TITLE:Analyzed Song
427
427
  E`;default:return`#TITLE:Analyzed Song
428
428
  #ARTIST:AI
429
429
  : 0 2 40 Test
430
- E`}}function ng(e,t){return`${e}:${t}`}function rg(e,t,n,a=1){if(t==="off")return e;const s=60/n;if(t==="beat")return Math.round(e/(s/a))*(s/a);if(t==="bar"){const i=s*4;return Math.round(e/i)*i}return e}function ag(e){return e.length===0?[]:e.flat()}function sg(e,t=44100){return new Array(Math.floor(e*t)).fill(0)}const ls=[{id:"mpc-60-tight",name:"MPC 60 Tight",stepsPerBar:16,timingOffsets:[0,.02,0,.01,0,.03,0,.01,0,.02,0,.01,0,.03,0,.01],velocityScales:[1.1,.85,.95,.8,1.05,.85,.9,.8,1.1,.85,.95,.8,1.05,.85,.9,.8],durationScales:[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]},{id:"mpc-60-swing",name:"MPC 60 Swing",stepsPerBar:16,timingOffsets:[0,.06,0,.04,0,.07,0,.04,0,.06,0,.04,0,.07,0,.04],velocityScales:[1.15,.7,.9,.75,1.1,.7,.85,.75,1.15,.7,.9,.75,1.1,.7,.85,.75],durationScales:[1.05,.9,1,.95,1.05,.9,1,.95,1.05,.9,1,.95,1.05,.9,1,.95]},{id:"hip-hop-lazy",name:"Hip-Hop Lazy",stepsPerBar:16,timingOffsets:[0,.04,.01,.05,0,.04,.02,.06,0,.04,.01,.05,0,.04,.02,.06],velocityScales:[1.2,.65,.85,.6,1.1,.65,.8,.6,1.2,.65,.85,.6,1.1,.65,.8,.6],durationScales:[1.1,1,1,.9,1.1,1,1,.9,1.1,1,1,.9,1.1,1,1,.9]},{id:"funk-pocket",name:"Funk Pocket",stepsPerBar:16,timingOffsets:[0,-.01,.03,0,0,-.01,.04,0,0,-.01,.03,0,0,-.01,.04,0],velocityScales:[1.2,.9,.7,1.05,.85,.9,.7,1,1.15,.9,.7,1.05,.85,.9,.7,1],durationScales:[1,.95,1.1,1,1,.95,1.1,1,1,.95,1.1,1,1,.95,1.1,1]},{id:"shuffle-blues",name:"Shuffle / Blues",stepsPerBar:8,timingOffsets:[0,.11,0,.11,0,.11,0,.11],velocityScales:[1.2,.8,1.1,.8,1.2,.8,1.1,.8],durationScales:[1.1,.8,1.1,.8,1.1,.8,1.1,.8]},{id:"reggaeton",name:"Reggaeton",stepsPerBar:16,timingOffsets:[0,0,0,.03,0,0,0,.03,0,0,0,.03,0,0,0,.03],velocityScales:[1.3,.6,.9,1.1,.7,.6,.9,1.1,1.3,.6,.9,1.1,.7,.6,.9,1.1],durationScales:[1,1,1,.9,1,1,1,.9,1,1,1,.9,1,1,1,.9]}];function ig(e){let t=e;return()=>(t=t*1664525+1013904223&4294967295,(t>>>0)/4294967295)}function fc(e,t){return t.amount===0?e:e.map(n=>{const a=n.time/t.grid;if(Math.round(a)%2===1){const o=t.grid*t.amount*.5;return{...n,time:n.time+o}}return{...n}})}function mc(e,t){const n=t.seed!=null?ig(t.seed):Math.random;return e.map(a=>{const s=(n()-.5)*2*t.timingAmount,i=Math.round((n()-.5)*2*t.velocityAmount),o=(n()-.5)*2*t.durationAmount;return{...a,time:Math.max(0,a.time+s),velocity:Math.max(1,Math.min(127,a.velocity+i)),duration:Math.max(.01,a.duration+o)}})}function gc(e,t,n=1){const a=4/t.stepsPerBar;return e.map(s=>{const i=s.time/a,o=Math.round(i)%t.stepsPerBar,l=t.timingOffsets[o]*a*n,c=1+(t.velocityScales[o]-1)*n,u=1+(t.durationScales[o]-1)*n;return{...s,time:Math.max(0,s.time+l),velocity:Math.max(1,Math.min(127,Math.round(s.velocity*c))),duration:Math.max(.01,s.duration*u)}})}function og(e,t){let n=[...e.map(a=>({...a}))];return t.template&&t.grooveStrength>0&&(n=gc(n,t.template,t.grooveStrength)),t.swing&&t.swing.amount>0&&(n=fc(n,t.swing)),t.humanize&&(n=mc(n,t.humanize)),n}function lg(e){return ls.find(t=>t.id===e)}function cg(){return ls.map(({id:e,name:t})=>({id:e,name:t}))}function yc(e){switch(e){case"1/4":return 1;case"1/8":return .5;case"1/16":return .25;case"1/32":return .125;case"1/4T":return 2/3;case"1/8T":return 1/3;case"1/16T":return 1/6}}function cs(e,t){return yc(e)*60/t}function Na(e,t,n){const a=cs(t,n);return Math.round(e/a)*a}function dg(e,t){const{value:n,bpm:a,strength:s=1,quantizeStarts:i=!0,quantizeDurations:o=!1}=t,l=cs(n,a);return e.map(c=>{let{start:u,duration:h}=c;if(i){const p=Math.round(u/l)*l;u=u+(p-u)*s}if(o){const p=Math.max(l,Math.round(h/l)*l);h=h+(p-h)*s}return u===c.start&&h===c.duration?c:{...c,start:u,duration:h}})}function ug(e){let t=e;return()=>(t=t*1664525+1013904223&4294967295,(t>>>0)/4294967295)}function hg(e,t={}){const{timingRange:n=.02,velocityRange:a=10,seed:s}=t,i=s!=null?ug(s):Math.random;return e.map(o=>{const l=(i()*2-1)*n,c=Math.round((i()*2-1)*a);return{...o,start:Math.max(0,o.start+l),velocity:o.velocity!=null?Math.max(1,Math.min(127,(o.velocity??100)+c)):void 0}})}function pg(){return{start:0,end:0,enabled:!1}}function fg(e,t){return{...e<t?{start:e,end:t}:{start:t,end:e},enabled:!0}}function mg(e,t,n){return{start:Na(e.start,t,n),end:Na(e.end,t,n),enabled:e.enabled}}function gg(e,t){return t.enabled?e>=t.start&&e<=t.end:!1}function yg(e,t){if(!t.enabled||t.end<=t.start||e<t.start)return e;if(e>=t.end){const n=t.end-t.start;return t.start+(e-t.start)%n}return e}function Ta(e){return e.length===1?e.toLowerCase():e}function Cr(e){var n,a,s,i;const t=[];return(n=e.modifiers)!=null&&n.ctrl&&t.push("Ctrl"),(a=e.modifiers)!=null&&a.shift&&t.push("Shift"),(s=e.modifiers)!=null&&s.alt&&t.push("Alt"),(i=e.modifiers)!=null&&i.meta&&t.push("Meta"),t.push(Ta(e.key)),t.join("+")}function vg(e,t){var l,c,u,h;const n=Ta(e.key)===Ta(t.key),a=!!e.ctrlKey==!!((l=t.modifiers)!=null&&l.ctrl),s=!!e.shiftKey==!!((c=t.modifiers)!=null&&c.shift),i=!!e.altKey==!!((u=t.modifiers)!=null&&u.alt),o=!!e.metaKey==!!((h=t.modifiers)!=null&&h.meta);return n&&a&&s&&i&&o}class vc{constructor(){this.actions=new Map,this.activeScopes=new Set(["global"]),this.enabled=!0,this.listener=null}register(t){this.actions.set(t.id,{...t,enabled:t.enabled??!0})}unregister(t){this.actions.delete(t)}rebind(t,n){const a=this.actions.get(t);a&&(a.binding=n)}setActiveScopes(t){this.activeScopes.clear(),this.activeScopes.add("global");for(const n of t)this.activeScopes.add(n)}setEnabled(t){this.enabled=t}setActionEnabled(t,n){const a=this.actions.get(t);a&&(a.enabled=n)}findConflicts(){const t=[],n=[...this.actions.values()];for(let a=0;a<n.length;a++)for(let s=a+1;s<n.length;s++){const i=n[a],o=n[s];Cr(i.binding)===Cr(o.binding)&&(i.scope===o.scope||i.scope==="global"||o.scope==="global")&&t.push([i,o])}return t}getGrouped(){const t={};for(const n of this.actions.values())t[n.group]||(t[n.group]=[]),t[n.group].push(n);return t}getAll(){return[...this.actions.values()]}exportConfig(){return[...this.actions.values()].map(t=>({id:t.id,binding:t.binding}))}importConfig(t){for(const n of t)this.rebind(n.id,n.binding)}formatBinding(t){const n=this.actions.get(t);return n?Cr(n.binding):""}handleKeyDown(t){if(!this.enabled)return!1;for(const n of this.actions.values())if(n.enabled&&this.activeScopes.has(n.scope)&&vg(t,n.binding))return t.preventDefault(),t.stopPropagation(),n.callback(),!0;return!1}attach(){this.listener||(this.listener=t=>{const n=t.target;n.tagName==="INPUT"||n.tagName==="TEXTAREA"||n.isContentEditable||this.handleKeyDown(t)},window.addEventListener("keydown",this.listener,!0))}detach(){this.listener&&(window.removeEventListener("keydown",this.listener,!0),this.listener=null)}destroy(){this.detach(),this.actions.clear()}}function bg(e={}){const t=new vc,n=()=>{},a=[{id:"transport.play",label:"Play / Pause",group:"Transport",scope:"global",binding:{key:" "}},{id:"transport.stop",label:"Stop",group:"Transport",scope:"global",binding:{key:"Escape"}},{id:"transport.record",label:"Record",group:"Transport",scope:"global",binding:{key:"r",modifiers:{ctrl:!0}}},{id:"transport.rewind",label:"Rewind",group:"Transport",scope:"global",binding:{key:"Home"}},{id:"transport.forward",label:"Forward",group:"Transport",scope:"global",binding:{key:"End"}},{id:"transport.loopToggle",label:"Toggle Loop",group:"Transport",scope:"global",binding:{key:"l"}},{id:"edit.undo",label:"Undo",group:"Edit",scope:"global",binding:{key:"z",modifiers:{ctrl:!0}}},{id:"edit.redo",label:"Redo",group:"Edit",scope:"global",binding:{key:"z",modifiers:{ctrl:!0,shift:!0}}},{id:"edit.cut",label:"Cut",group:"Edit",scope:"editor",binding:{key:"x",modifiers:{ctrl:!0}}},{id:"edit.copy",label:"Copy",group:"Edit",scope:"editor",binding:{key:"c",modifiers:{ctrl:!0}}},{id:"edit.paste",label:"Paste",group:"Edit",scope:"editor",binding:{key:"v",modifiers:{ctrl:!0}}},{id:"edit.delete",label:"Delete",group:"Edit",scope:"editor",binding:{key:"Delete"}},{id:"edit.selectAll",label:"Select All",group:"Edit",scope:"editor",binding:{key:"a",modifiers:{ctrl:!0}}},{id:"edit.duplicate",label:"Duplicate",group:"Edit",scope:"editor",binding:{key:"d",modifiers:{ctrl:!0}}},{id:"view.zoomIn",label:"Zoom In",group:"View",scope:"global",binding:{key:"=",modifiers:{ctrl:!0}}},{id:"view.zoomOut",label:"Zoom Out",group:"View",scope:"global",binding:{key:"-",modifiers:{ctrl:!0}}},{id:"view.zoomFit",label:"Zoom to Fit",group:"View",scope:"global",binding:{key:"0",modifiers:{ctrl:!0}}},{id:"view.toggleMixer",label:"Toggle Mixer",group:"View",scope:"global",binding:{key:"m"}},{id:"view.togglePianoRoll",label:"Toggle Piano Roll",group:"View",scope:"global",binding:{key:"p"}},{id:"pianoRoll.quantize",label:"Quantize Selection",group:"Piano Roll",scope:"piano-roll",binding:{key:"q"}},{id:"pianoRoll.humanize",label:"Humanize Selection",group:"Piano Roll",scope:"piano-roll",binding:{key:"h"}},{id:"pianoRoll.velocityUp",label:"Velocity +10",group:"Piano Roll",scope:"piano-roll",binding:{key:"ArrowUp",modifiers:{shift:!0}}},{id:"pianoRoll.velocityDown",label:"Velocity -10",group:"Piano Roll",scope:"piano-roll",binding:{key:"ArrowDown",modifiers:{shift:!0}}},{id:"pianoRoll.octaveUp",label:"Octave Up",group:"Piano Roll",scope:"piano-roll",binding:{key:"ArrowUp",modifiers:{ctrl:!0,shift:!0}}},{id:"pianoRoll.octaveDown",label:"Octave Down",group:"Piano Roll",scope:"piano-roll",binding:{key:"ArrowDown",modifiers:{ctrl:!0,shift:!0}}},{id:"timeline.split",label:"Split at Cursor",group:"Timeline",scope:"timeline",binding:{key:"s"}},{id:"timeline.mute",label:"Mute Track",group:"Timeline",scope:"timeline",binding:{key:"m",modifiers:{ctrl:!0}}},{id:"timeline.solo",label:"Solo Track",group:"Timeline",scope:"timeline",binding:{key:"s",modifiers:{ctrl:!0}}},{id:"timeline.addTrack",label:"Add Track",group:"Timeline",scope:"timeline",binding:{key:"t",modifiers:{ctrl:!0}}},{id:"mixer.resetFader",label:"Reset Fader",group:"Mixer",scope:"mixer",binding:{key:"0"}},{id:"mixer.bypassFx",label:"Bypass All FX",group:"Mixer",scope:"mixer",binding:{key:"b"}}];for(const s of a)t.register({...s,callback:e[s.id]??n});return t}function xg(e){return Cr(e)}const Sg=["audio/mpeg","audio/wav","audio/ogg","audio/flac","audio/aac","audio/webm","audio/mp4","audio/x-m4a","audio/x-wav","audio/x-aiff","audio/aiff","audio/midi","audio/x-midi"],kg=["mp3","wav","ogg","flac","aac","m4a","webm","wma","aiff","aif","mid","midi","opus"],wg=500*1024*1024,Cg=20;function Bt(e){const t=e.split(".");return t.length>1?t[t.length-1].toLowerCase():""}function jg(e,t){return!!(e.type&&t.some(n=>e.type.startsWith(n.replace("*","")))||e.type.startsWith("audio/"))}function Mg(e,t){const n=Bt(e.name);return n!==""&&t.includes(n)}function ds(e,t={}){const n=t.maxSize??wg,a=t.allowedTypes??Sg,s=t.allowedExtensions??kg,i=t.maxFiles??Cg,o=[],l=[];for(let c=0;c<e.length;c++){const u=e[c];if(c>=i){l.push({file:u,reason:"limit",message:`Exceeded maximum of ${i} files`});continue}if(u.size>n){l.push({file:u,reason:"size",message:`File exceeds ${Math.round(n/1024/1024)}MB limit`});continue}if(!jg(u,a)&&!Mg(u,s)){l.push({file:u,reason:"type",message:`Unsupported file type: ${u.type||Bt(u.name)}`});continue}o.push(u)}return{valid:o,errors:l}}async function bc(e){const t={file:e,name:e.name.replace(/\.[^.]+$/,""),extension:Bt(e.name),sizeBytes:e.size,mimeType:e.type||`audio/${Bt(e.name)}`};try{const n=await e.arrayBuffer(),s=await new OfflineAudioContext(1,1,44100).decodeAudioData(n);t.duration=s.duration,t.sampleRate=s.sampleRate,t.channels=s.numberOfChannels}catch{}return t}function Rg(e){let t=0;return{onDragEnter:n=>{var a;n.preventDefault(),n.stopPropagation(),t++,t===1&&((a=e.onDragEnter)==null||a.call(e))},onDragOver:n=>{n.preventDefault(),n.stopPropagation(),(n instanceof DragEvent&&n.dataTransfer||"dataTransfer"in n&&n.dataTransfer)&&(n.dataTransfer.dropEffect="copy")},onDragLeave:n=>{var a;n.preventDefault(),n.stopPropagation(),t--,t===0&&((a=e.onDragLeave)==null||a.call(e))},onDrop:async n=>{var u,h;n.preventDefault(),n.stopPropagation(),t=0,(u=e.onDragLeave)==null||u.call(e);const a="dataTransfer"in n?n.dataTransfer:null;if(!((h=a==null?void 0:a.files)!=null&&h.length))return;const s=Array.from(a.files),{valid:i,errors:o}=ds(s,e.validation),l=[],c=[...o];for(const p of i)if(e.probe)try{l.push(await bc(p))}catch{c.push({file:p,reason:"decode",message:"Failed to decode audio"})}else l.push({file:p,name:p.name.replace(/\.[^.]+$/,""),extension:Bt(p.name),sizeBytes:p.size,mimeType:p.type||`audio/${Bt(p.name)}`});e.onDrop({accepted:l,rejected:c})}}}function Ng(e={}){return new Promise(t=>{const n=document.createElement("input");n.type="file",n.accept="audio/*,.mid,.midi",n.multiple=e.multiple??!0,n.onchange=async()=>{var l;if(!((l=n.files)!=null&&l.length)){t({accepted:[],rejected:[]});return}const a=Array.from(n.files),{valid:s,errors:i}=ds(a,e.validation),o=s.map(c=>({file:c,name:c.name.replace(/\.[^.]+$/,""),extension:Bt(c.name),sizeBytes:c.size,mimeType:c.type||`audio/${Bt(c.name)}`}));t({accepted:o,rejected:i})},n.click()})}var Ft=(e=>(e.Unknown="Unknown",e.Dimmer="Dimmer",e.DimmerWithOff="DimmerWithOff",e.RotationWithOff="RotationWithOff",e.RotationWithOffAndCcw="RotationWithOffAndCcw",e.Options="Options",e))(Ft||{}),xc=(e=>(e[e.Equalizer=0]="Equalizer",e[e.Compressor=1]="Compressor",e[e.Reverb=2]="Reverb",e[e.Delay=3]="Delay",e[e.Distortion=4]="Distortion",e[e.Chorus=5]="Chorus",e[e.Flanger=6]="Flanger",e[e.Phaser=7]="Phaser",e))(xc||{}),Sc=(e=>(e[e.ReadOnly=0]="ReadOnly",e[e.Edit=1]="Edit",e[e.Owner=2]="Owner",e))(Sc||{});const Tg=["var(--nice-success, #4caf50)","var(--nice-primary, #2196f3)","var(--nice-warning, #ff9800)","var(--nice-color-accent-pink, #e91e63)","var(--nice-accent, #9c27b0)","var(--nice-info, #00bcd4)","var(--nice-success, #8bc34a)","var(--nice-warning, #ffc107)"],Lr=["off","no function","brak"],Pg=e=>e.segments.some(t=>t.isOff||Lr.some(n=>t.name.toLowerCase().includes(n))),Eg=e=>e.segments.find(t=>t.isOff||Lr.some(n=>t.name.toLowerCase().includes(n))),kc=e=>Math.floor((e.valueFrom+e.valueTo)/2),$g=e=>{const t=Eg(e);return t?kc(t):0},Ag=(e,t)=>e.segments.find(n=>t>=n.valueFrom&&t<=n.valueTo),Mn=(e,t=0,n=255)=>Math.max(t,Math.min(n,Math.round(e))),Vn=({channel:e,value:t,onChange:n,onCommit:a,showDirectionHint:s})=>{const{t:i}=xe(),[o,l]=d.useState(Mn(t)),c=d.useMemo(()=>Ag(e,o),[e,o]);d.useEffect(()=>l(Mn(t)),[t]);const u=h=>{const p=Mn(h);l(p),n(p),a==null||a(p)};return r.jsxs("div",{className:"ntd-dmx-channel",style:{border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:8,padding:12},children:[r.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:6},children:[r.jsxs("strong",{children:[e.channel,". ",e.name]}),s&&c&&r.jsx("span",{style:{fontSize:12,color:"var(--nice-text-secondary, #6b7280)"},children:c.name})]}),r.jsx("input",{type:"range",min:0,max:255,value:o,onChange:h=>{const p=Mn(Number(h.target.value));l(p),n(p)},onMouseUp:()=>a==null?void 0:a(o),onTouchEnd:()=>a==null?void 0:a(o),style:{width:"100%"}}),r.jsx("div",{style:{marginTop:6},children:r.jsx("input",{type:"number",min:0,max:255,value:o,onChange:h=>{const p=Mn(Number(h.target.value));l(p),n(p)},onBlur:()=>a==null?void 0:a(o),style:{width:80,padding:6,border:"1px solid var(--nice-border, #d1d5db)",borderRadius:6}})}),Pg(e)&&r.jsx("button",{type:"button",onClick:()=>u($g(e)),style:{width:"100%",marginTop:8,padding:"6px 10px",borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)",background:"var(--nice-bg-secondary, #f9fafb)",cursor:"pointer"},children:i("dmxChannelControls.off","OFF")})]})},us=({channel:e,value:t,onChange:n,onCommit:a})=>{const s=d.useMemo(()=>{const o=[...e.segments];return o.sort((l,c)=>{const u=(l.isOff?-1:0)+(Lr.some(p=>l.name.toLowerCase().includes(p))?-1:0),h=(c.isOff?-1:0)+(Lr.some(p=>c.name.toLowerCase().includes(p))?-1:0);return u!==h?u-h:l.name.localeCompare(c.name,void 0,{sensitivity:"base"})}),o},[e]),i=o=>{const l=kc(o);n(l),a==null||a(l)};return r.jsxs("div",{className:"ntd-dmx-channel",style:{border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:8,padding:12},children:[r.jsxs("strong",{children:[e.channel,". ",e.name]}),r.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(120px, 1fr))",gap:8,marginTop:8,maxHeight:220,overflowY:"auto"},children:s.map((o,l)=>{const c=t>=o.valueFrom&&t<=o.valueTo;return r.jsx("button",{type:"button",onClick:()=>i(o),style:{padding:"8px 10px",borderRadius:8,border:c?"2px solid var(--nice-primary-hover, #2563eb)":"1px solid var(--nice-border, #d1d5db)",background:c?"var(--nice-primary-bg, #eff6ff)":"var(--nice-bg, #fff)",textAlign:"left",cursor:"pointer",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:`${o.name} [${o.valueFrom}..${o.valueTo}]`,children:o.name},`${o.name}-${l}`)})})]})},hs=e=>{switch(e.channel.type){case Ft.Dimmer:case Ft.DimmerWithOff:return r.jsx(Vn,{...e});case Ft.RotationWithOff:case Ft.RotationWithOffAndCcw:return r.jsx(Vn,{...e,showDirectionHint:!0});case Ft.Options:return r.jsx(us,{...e});default:return r.jsx(Vn,{...e})}},oa=e=>Math.max(0,Math.min(255,Math.round(e))),Ig=[{target:".ntd-dmx-editor",titleKey:"tutorial.dmxEditor.intro.title",title:"DMX editor",contentKey:"tutorial.dmxEditor.intro.content",content:"Pick the FTDI device and port, then set each DMX channel’s value with the sliders to control your lighting fixtures live.",placement:"auto"}];function wc({service:e,...t}){const{t:n}=xe();return e?r.jsx(Lg,{service:e,...t}):r.jsx("div",{className:t.className,style:t.style,children:r.jsx("small",{children:n("dmxEditor.provideAServicePropDmxservice","Provide a `service` prop (DmxService) to control hardware.")})})}function Lg({service:e,pollInterval:t=500,className:n,style:a,tutorial:s}){const{t:i}=xe(),[o,l]=d.useState([]),[c,u]=d.useState(null),[h,p]=d.useState(()=>Array(513).fill(0)),[g,y]=d.useState(30),[m,x]=d.useState(0),[b,f]=d.useState(!1),k=d.useRef(null);d.useEffect(()=>{let I=!1;return e.getDevices().then(L=>{I||(l(L),L.length>0&&u(L[0]))}).catch(()=>{}),()=>{I=!0}},[e]),d.useEffect(()=>{if(k.current&&window.clearInterval(k.current),!(t<=0))return k.current=window.setInterval(async()=>{try{const I=await e.getState();Array.isArray(I.frontSnapshot)&&I.frontSnapshot.length>=513&&p(I.frontSnapshot.slice(0,513)),typeof I.fps=="number"&&y(I.fps),typeof I.startCode=="number"&&x(I.startCode)}catch{}},t),()=>{k.current&&window.clearInterval(k.current)}},[e,t]);const v=async()=>{c&&(await e.openPort(c.serialNumber||c.description),f(!0))},w=async()=>{await e.closePort(),f(!1)},R=async()=>{await e.blackout(),p(I=>{const L=[...I];for(let N=1;N<L.length;N++)L[N]=0;return L})},M=()=>e.configure(g,m),j=(I,L)=>{const N=oa(L);p(_=>{const ee=[..._];return ee[I]=N,ee})},T=(I,L)=>e.setChannel(I,oa(L)),P=(c==null?void 0:c.deviceInfo)??null,A=d.useMemo(()=>{var I;return(I=P==null?void 0:P.channels)!=null&&I.length?P.channels:Array.from({length:16},(L,N)=>({channel:N+1,name:`Channel ${N+1}`,type:Ft.Dimmer,segments:[{valueFrom:0,valueTo:255,name:"Intensity"}]}))},[P]);return r.jsxs("div",{className:`ntd-dmx-editor ${n??""}`,style:{position:"relative",padding:16,display:"grid",gap:16,...a},children:[r.jsx("span",{style:{position:"absolute",top:6,right:6,zIndex:30},children:r.jsx(ke.NiceTutorialButton,{steps:ke.resolveTutorial(s,Ig)})}),r.jsxs("section",{style:{display:"grid",gap:12,gridTemplateColumns:"1fr auto auto auto",alignItems:"end"},children:[r.jsxs("div",{children:[r.jsx("label",{style:{display:"block",fontWeight:600,marginBottom:6},children:i("dmxEditor.ftdiDevice","FTDI Device")}),r.jsx("select",{value:(c==null?void 0:c.serialNumber)||"",onChange:I=>u(o.find(L=>L.serialNumber===I.target.value)??null),style:{width:"100%",padding:8,borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)"},children:o.map(I=>{var L,N;return r.jsxs("option",{value:I.serialNumber,children:[((L=I.deviceInfo)==null?void 0:L.manufacturer)??""," ",((N=I.deviceInfo)==null?void 0:N.model)??I.description," (",I.serialNumber||I.description,")"]},I.serialNumber||I.description)})}),P&&r.jsxs("div",{style:{marginTop:6,fontSize:12,color:"var(--nice-text-secondary, #6b7280)"},children:[i("dmxEditor.mode","Mode:")," ",r.jsx("b",{children:P.modeName}),i("dmxEditor.footprint",", footprint:")," ",r.jsx("b",{children:P.footprint})]})]}),r.jsx("button",{onClick:v,disabled:!c||b,style:{padding:"10px 14px",borderRadius:8,border:"1px solid var(--nice-success, #10b981)",background:"var(--nice-success-bg, #ecfdf5)",cursor:"pointer"},children:i("dmxEditor.openPort","Open port")}),r.jsx("button",{onClick:w,disabled:!b,style:{padding:"10px 14px",borderRadius:8,border:"1px solid var(--nice-danger, #ef4444)",background:"var(--nice-danger-bg, #fef2f2)",cursor:"pointer"},children:i("dmxEditor.closePort","Close port")}),r.jsx("button",{onClick:R,style:{padding:"10px 14px",borderRadius:8,border:"1px solid var(--nice-border-color, #4b5563)",background:"var(--nice-bg-secondary, #f3f4f6)",cursor:"pointer"},children:i("dmxEditor.blackout","Blackout")})]}),r.jsxs("section",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(min(160px, 100%), 1fr))",gap:12,alignItems:"end"},children:[r.jsxs("div",{children:[r.jsx("label",{style:{display:"block",fontWeight:600,marginBottom:6},children:"FPS"}),r.jsx("input",{type:"number",min:10,max:44,value:g,onChange:I=>y(Number(I.target.value)),style:{width:"100%",padding:8,borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)"}})]}),r.jsxs("div",{children:[r.jsx("label",{style:{display:"block",fontWeight:600,marginBottom:6},children:i("dmxEditor.startCode","Start Code")}),r.jsx("input",{type:"number",min:0,max:255,value:m,onChange:I=>x(oa(Number(I.target.value))),style:{width:"100%",padding:8,borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)"}})]}),r.jsx("div",{children:r.jsx("button",{onClick:M,style:{padding:"10px 14px",borderRadius:8,border:"1px solid var(--nice-primary, #3b82f6)",background:"var(--nice-primary-bg, #eff6ff)",cursor:"pointer"},children:i("dmxEditor.applyConfiguration","Apply configuration")})})]}),r.jsxs("section",{children:[r.jsx("h3",{style:{margin:"8px 0 12px",fontSize:16},children:i("dmxEditor.channels","Channels")}),r.jsx("div",{style:{display:"grid",gap:12,gridTemplateColumns:"repeat(auto-fill, minmax(240px, 1fr))"},children:A.map(I=>r.jsx(hs,{channel:I,value:h[I.channel]??0,onChange:L=>j(I.channel,L),onCommit:L=>T(I.channel,L)},I.channel))})]})]})}const Cc=[{id:"generic-dimmer-1ch",name:"Generic Dimmer",manufacturer:"Generic",type:"dimmer",channelCount:1,channels:[{name:"Dimmer",type:"dimmer",defaultValue:0}]},{id:"generic-rgb-3ch",name:"Generic RGB",manufacturer:"Generic",type:"rgb",channelCount:3,channels:[{name:"Red",type:"color",defaultValue:0},{name:"Green",type:"color",defaultValue:0},{name:"Blue",type:"color",defaultValue:0}]},{id:"generic-rgbw-4ch",name:"Generic RGBW",manufacturer:"Generic",type:"rgbw",channelCount:4,channels:[{name:"Red",type:"color",defaultValue:0},{name:"Green",type:"color",defaultValue:0},{name:"Blue",type:"color",defaultValue:0},{name:"White",type:"color",defaultValue:0}]},{id:"generic-rgbw-dimmer-5ch",name:"Generic RGBW+D",manufacturer:"Generic",type:"rgbw",channelCount:5,channels:[{name:"Dimmer",type:"dimmer",defaultValue:255},{name:"Red",type:"color",defaultValue:0},{name:"Green",type:"color",defaultValue:0},{name:"Blue",type:"color",defaultValue:0},{name:"White",type:"color",defaultValue:0}]},{id:"generic-par-7ch",name:"Generic PAR 7ch",manufacturer:"Generic",type:"par",channelCount:7,channels:[{name:"Dimmer",type:"dimmer",defaultValue:255},{name:"Red",type:"color",defaultValue:0},{name:"Green",type:"color",defaultValue:0},{name:"Blue",type:"color",defaultValue:0},{name:"White",type:"color",defaultValue:0},{name:"Strobe",type:"strobe",defaultValue:0},{name:"Function",type:"function",defaultValue:0}]},{id:"generic-moving-head-16ch",name:"Generic Moving Head 16ch",manufacturer:"Generic",type:"moving_head",channelCount:16,channels:[{name:"Pan",type:"pan",defaultValue:128,min:0,max:255},{name:"Pan Fine",type:"pan",defaultValue:0},{name:"Tilt",type:"tilt",defaultValue:128,min:0,max:255},{name:"Tilt Fine",type:"tilt",defaultValue:0},{name:"Pan/Tilt Speed",type:"speed",defaultValue:0},{name:"Dimmer",type:"dimmer",defaultValue:0},{name:"Strobe",type:"strobe",defaultValue:0},{name:"Red",type:"color",defaultValue:0},{name:"Green",type:"color",defaultValue:0},{name:"Blue",type:"color",defaultValue:0},{name:"White",type:"color",defaultValue:0},{name:"Color Wheel",type:"function",defaultValue:0},{name:"Gobo",type:"gobo",defaultValue:0},{name:"Gobo Rotation",type:"speed",defaultValue:128},{name:"Prism",type:"function",defaultValue:0},{name:"Function",type:"function",defaultValue:0}]},{id:"generic-strobe-2ch",name:"Generic Strobe",manufacturer:"Generic",type:"strobe",channelCount:2,channels:[{name:"Dimmer",type:"dimmer",defaultValue:0},{name:"Strobe Speed",type:"strobe",defaultValue:0}]},{id:"generic-fog-2ch",name:"Generic Fog Machine",manufacturer:"Generic",type:"fog",channelCount:2,channels:[{name:"Output",type:"dimmer",defaultValue:0},{name:"Fan",type:"speed",defaultValue:128}]}];class jc{constructor(){this.universes=new Map,this.fixtures=new Map,this.profiles=new Map,this.outputCallback=null,this.running=!1,this.frameRate=44,this.intervalId=null,Cc.forEach(t=>this.profiles.set(t.id,t)),this.createUniverse(1,"Universe 1")}createUniverse(t,n){const a={id:String(t),name:n,channels:new Uint8Array(512)};return this.universes.set(t,a),a}getUniverse(t){return this.universes.get(t)}addFixture(t){this.fixtures.set(t.id,t)}removeFixture(t){this.fixtures.delete(t)}getFixture(t){return this.fixtures.get(t)}getAllFixtures(){return Array.from(this.fixtures.values())}getProfile(t){return this.profiles.get(t)}registerProfile(t){this.profiles.set(t.id,t)}setChannel(t,n,a){const s=this.universes.get(t);s&&n>=1&&n<=512&&(s.channels[n-1]=Math.max(0,Math.min(255,a)))}getChannel(t,n){const a=this.universes.get(t);return a&&n>=1&&n<=512?a.channels[n-1]:0}setFixtureValues(t,n){const a=this.fixtures.get(t);if(!a)return;const s=this.profiles.get(a.profileId);if(s)for(let i=0;i<Math.min(n.length,s.channelCount);i++)a.values[i]=n[i],this.setChannel(a.universe,a.startChannel+i,n[i])}setFixtureColor(t,n,a,s,i=0){const o=this.fixtures.get(t);if(!o)return;const l=this.profiles.get(o.profileId);if(!l)return;const c=[...o.values];l.channels.forEach((u,h)=>{u.name.toLowerCase().includes("red")?c[h]=n:u.name.toLowerCase().includes("green")?c[h]=a:u.name.toLowerCase().includes("blue")?c[h]=s:u.name.toLowerCase().includes("white")&&(c[h]=i)}),this.setFixtureValues(t,c)}setFixtureDimmer(t,n){const a=this.fixtures.get(t);if(!a)return;const s=this.profiles.get(a.profileId);s&&s.channels.forEach((i,o)=>{i.type==="dimmer"&&(a.values[o]=Math.max(0,Math.min(255,Math.round(n*255))),this.setChannel(a.universe,a.startChannel+o,a.values[o]))})}fadeFixture(t,n,a,s="linear"){return new Promise(i=>{const o=this.fixtures.get(t);if(!o){i();return}const l=[...o.values],c=performance.now(),u=()=>{const h=performance.now()-c,p=Math.min(1,h/a);let g=p;switch(s){case"ease-in":g=p*p;break;case"ease-out":g=1-(1-p)*(1-p);break;case"ease-in-out":g=p<.5?2*p*p:1-Math.pow(-2*p+2,2)/2;break}const y=l.map((m,x)=>{const b=n[x]??m;return Math.round(m+(b-m)*g)});this.setFixtureValues(t,y),p<1?requestAnimationFrame(u):i()};u()})}setOutputCallback(t){this.outputCallback=t}start(){this.running||(this.running=!0,this.intervalId=window.setInterval(()=>{this.sendOutput()},1e3/this.frameRate))}stop(){this.running=!1,this.intervalId!==null&&(clearInterval(this.intervalId),this.intervalId=null)}sendOutput(){this.outputCallback&&this.universes.forEach((t,n)=>{this.outputCallback(n,t.channels)})}blackout(){this.universes.forEach(t=>{t.channels.fill(0)}),this.fixtures.forEach(t=>{t.values.fill(0)})}fullOn(){this.fixtures.forEach(t=>{this.setFixtureDimmer(t.id,1)})}}const _g=6454,zg=new Uint8Array([65,114,116,45,78,101,116,0]);function Dg(e,t){const n=new Uint8Array(18+t.length);return n.set(zg,0),n[8]=0,n[9]=80,n[10]=0,n[11]=14,n[12]=0,n[13]=0,n[14]=e&255,n[15]=e>>8&255,n[16]=t.length>>8&255,n[17]=t.length&255,n.set(t.slice(0,512),18),n}const Fg=5568;function Og(e,t,n,a=100,s="Nice2Dev DMX"){const i=Math.min(t.length,512),o=126+i,l=new Uint8Array(o),c=new DataView(l.buffer);c.setUint16(0,16,!1),c.setUint16(2,0,!1);const u=[65,83,67,45,69,49,46,49,55,0,0,0];for(let m=0;m<u.length;m++)l[4+m]=u[m];const h=o-16;c.setUint16(16,28672|h&4095,!1),c.setUint32(18,4,!1);for(let m=0;m<16;m++)l[22+m]=m+1;const p=o-38;c.setUint16(38,28672|p&4095,!1),c.setUint32(40,2,!1);const g=new TextEncoder().encode(s.slice(0,63));l.set(g,44),l[108]=a,c.setUint16(109,0,!1),l[111]=n&255,l[112]=0,c.setUint16(113,e,!1);const y=i+11;return c.setUint16(115,28672|y&4095,!1),l[117]=2,l[118]=161,c.setUint16(119,0,!1),c.setUint16(121,1,!1),c.setUint16(123,i+1,!1),l[125]=0,l.set(t.slice(0,i),126),l}function Bg(e){const t=e>>8&255,n=e&255;return`239.255.${t}.${n}`}class Gg{constructor(t,n){this.config=t,this.scenes=n,this.currentStep=0,this.direction=1,this.isRunning=!1,this.timer=null,this.fadeStartTime=0,this.fadeFromValues=new Uint8Array(512),this.fadeToValues=new Uint8Array(512),this.onOutput=null}setOutputCallback(t){this.onOutput=t}start(){this.isRunning||(this.isRunning=!0,this.currentStep=this.config.direction==="backward"?this.config.steps.length-1:0,this.direction=this.config.direction==="backward"?-1:1,this.executeStep())}stop(){this.isRunning=!1,this.timer&&(clearTimeout(this.timer),this.timer=null)}executeStep(){var o;if(!this.isRunning)return;const t=this.config.steps[this.currentStep];if(!t)return;const n=this.scenes.get(t.sceneId);if(!n){this.advanceStep();return}const a=new Uint8Array(512);if(n.channels)for(const l of n.channels)l.channel>=1&&l.channel<=512&&(a[l.channel-1]=l.value);this.fadeFromValues.set(this.fadeToValues),this.fadeToValues.set(a),this.fadeStartTime=performance.now();const s=t.fadeTime/this.config.speed,i=t.holdTime/this.config.speed;s>0?this.runFade(s,()=>{var l;(l=this.onOutput)==null||l.call(this,this.fadeToValues),this.timer=setTimeout(()=>this.advanceStep(),i)}):((o=this.onOutput)==null||o.call(this,a),this.timer=setTimeout(()=>this.advanceStep(),i))}runFade(t,n){const a=performance.now(),s=new Uint8Array(512),i=()=>{var c;if(!this.isRunning)return;const o=performance.now()-a,l=Math.min(o/t,1);for(let u=0;u<512;u++)s[u]=Math.round(this.fadeFromValues[u]+(this.fadeToValues[u]-this.fadeFromValues[u])*l);(c=this.onOutput)==null||c.call(this,s),l<1?requestAnimationFrame(i):n()};requestAnimationFrame(i)}advanceStep(){if(!this.isRunning)return;const{steps:t,loop:n,direction:a}=this.config;if(this.currentStep+=this.direction,a==="bounce"){if(this.currentStep>=t.length?(this.direction=-1,this.currentStep=t.length-2):this.currentStep<0&&(this.direction=1,this.currentStep=1),this.currentStep<0||this.currentStep>=t.length){if(!n){this.stop();return}this.currentStep=0,this.direction=1}}else if(this.currentStep>=t.length||this.currentStep<0){if(!n){this.stop();return}this.currentStep=a==="backward"?t.length-1:0}this.executeStep()}}const Wg=({engine:e,tracks:t=[],scenes:n=[],duration:a=3e5,currentTime:s=0,bpm:i=120,onTimeChange:o,onCueAdd:l,onCueUpdate:c,onCueDelete:u,onTrackAdd:h,onTrackUpdate:p,onPlay:g,onPause:y,onStop:m,className:x=""})=>{const{t:b}=xe(),[f,k]=d.useState(1),[v,w]=d.useState(0),[R,M]=d.useState(!1),[j,T]=d.useState(null),[P,A]=d.useState(null),[I,L]=d.useState(!0),[N,_]=d.useState(1e3),ee=d.useRef(null),Y=d.useRef(null),O=d.useRef(0),U=d.useMemo(()=>.1*f,[f]),V=d.useCallback(E=>E*U,[U]),K=d.useCallback(E=>E/U,[U]),G=d.useCallback(E=>{if(!I)return E;const q=6e4/i;return Math.round(E/q)*q},[I,i]),W=d.useRef(()=>{});d.useEffect(()=>{if(!R)return;const E=performance.now(),q=s,X=()=>{const re=performance.now()-E,oe=q+re;if(oe>=a){M(!1),o==null||o(0),m==null||m();return}W.current(oe),o==null||o(oe),Y.current=requestAnimationFrame(X)};return Y.current=requestAnimationFrame(X),()=>{Y.current!==null&&(cancelAnimationFrame(Y.current),Y.current=null)}},[R,s,a,o,m]);const C=d.useRef(!1);d.useEffect(()=>{R!==C.current&&(C.current=R,R?g==null||g():y==null||y())},[R,g,y]);const $=d.useCallback(E=>{t.forEach(q=>{q.muted||q.cues.forEach(X=>{const re=X.startTime,oe=re+X.duration;if(E>=re&&E<oe&&O.current<re){const se=n.find(D=>D.id===X.sceneId);se&&se.fixtures.forEach(D=>{X.fadeIn&&X.fadeIn>0?e.fadeFixture(D.fixtureId,D.values,X.fadeIn):e.setFixtureValues(D.fixtureId,D.values)})}if(O.current<oe&&E>=oe){const se=n.find(D=>D.id===X.sceneId);se&&se.fixtures.forEach(D=>{if(e.getFixture(D.fixtureId)&&X.fadeOut&&X.fadeOut>0){const ae=new Array(D.values.length).fill(0);e.fadeFixture(D.fixtureId,ae,X.fadeOut)}})}})}),O.current=E},[t,n,e]);W.current=$;const S=E=>{const q=Math.floor(E/1e3),X=Math.floor(q/60),re=q%60,oe=Math.floor(E%1e3/(1e3/30));return`${X}:${re.toString().padStart(2,"0")}:${oe.toString().padStart(2,"0")}`},B=d.useCallback(E=>{if(!ee.current)return;const q=ee.current.getBoundingClientRect(),X=E.clientX-q.left+v,re=G(K(X));o==null||o(Math.max(0,Math.min(a,re)))},[v,K,G,a,o]),H=d.useCallback((E,q,X)=>{const re=t.find(D=>D.id===q),oe=re==null?void 0:re.cues.find(D=>D.id===E);if(!oe)return;const se=G(Math.max(0,oe.startTime+K(X)));c==null||c({...oe,startTime:se})},[t,K,G,c]),z=()=>{const E=6e4/i,q=Math.ceil(a/E),X=[];for(let re=0;re<=q;re++){const oe=re*E,se=V(oe),D=re%4===0;X.push(r.jsx("div",{className:`nice-dmx-timeline__beat ${D?"nice-dmx-timeline__beat--measure":""}`,style:{left:se},children:D&&r.jsx("span",{className:"nice-dmx-timeline__beat-label",children:re/4+1})},re))}return X},Z=(E,q)=>{const X=V(E.startTime),re=V(E.duration),oe=n.find(se=>se.id===E.sceneId);return r.jsxs("div",{className:`nice-dmx-timeline__cue ${j===E.id?"nice-dmx-timeline__cue--selected":""}`,style:{left:X,width:re,backgroundColor:(oe==null?void 0:oe.color)||q.color||"var(--nice-accent, #8b5cf6)"},onClick:se=>{se.stopPropagation(),T(E.id)},draggable:!q.locked,onDragEnd:se=>{var J;const D=(J=se.target.parentElement)==null?void 0:J.getBoundingClientRect();D&&H(E.id,q.id,se.clientX-D.left-X)},children:[r.jsx("span",{className:"nice-dmx-timeline__cue-name",children:E.name||(oe==null?void 0:oe.name)}),E.fadeIn&&E.fadeIn>0&&r.jsx("div",{className:"nice-dmx-timeline__cue-fade nice-dmx-timeline__cue-fade--in",style:{width:V(E.fadeIn)}}),E.fadeOut&&E.fadeOut>0&&r.jsx("div",{className:"nice-dmx-timeline__cue-fade nice-dmx-timeline__cue-fade--out",style:{width:V(E.fadeOut)}})]},E.id)};return r.jsxs("div",{className:`nice-dmx-timeline ${x}`,children:[r.jsxs("div",{className:"nice-dmx-timeline__toolbar",children:[r.jsxs("div",{className:"nice-dmx-timeline__transport",children:[r.jsx("button",{type:"button",onClick:()=>o==null?void 0:o(0),title:b("dmxTimeline.goToStart","Go to start"),"aria-label":b("dmxTimeline.goToStart","Go to start"),children:r.jsx(F.NtdSkipBack,{size:14})}),r.jsx("button",{type:"button",onClick:()=>M(!R),title:R?b("dmxTimeline.pause","Pause"):b("dmxTimeline.play","Play"),"aria-label":R?b("dmxTimeline.pause","Pause"):b("dmxTimeline.play","Play"),children:R?r.jsx(F.NtdPause,{size:14}):r.jsx(F.NtdPlay,{size:14})}),r.jsx("button",{type:"button",onClick:()=>{M(!1),o==null||o(0),e.blackout(),m==null||m()},title:b("dmxTimeline.stop","Stop"),"aria-label":b("dmxTimeline.stop","Stop"),children:r.jsx(F.NtdStop,{size:14})})]}),r.jsx("div",{className:"nice-dmx-timeline__time",children:S(s)}),r.jsxs("div",{className:"nice-dmx-timeline__tools",children:[r.jsx("button",{type:"button",className:`nice-dmx-timeline__tool ${I?"nice-dmx-timeline__tool--active":""}`,onClick:()=>L(!I),title:b("dmxTimeline.snapToGrid","Snap to grid"),"aria-label":b("dmxTimeline.snapToGrid","Snap to grid"),children:r.jsx(F.NtdGrid,{size:14})}),r.jsx("button",{type:"button",onClick:()=>k(Math.max(.25,f-.25)),title:b("dmxTimeline.zoomOut","Zoom out"),"aria-label":b("dmxTimeline.zoomOut","Zoom out"),children:r.jsx(F.NtdZoomOut,{size:14})}),r.jsxs("span",{className:"nice-dmx-timeline__zoom",children:[Math.round(f*100),"%"]}),r.jsx("button",{type:"button",onClick:()=>k(Math.min(4,f+.25)),title:b("dmxTimeline.zoomIn","Zoom in"),"aria-label":b("dmxTimeline.zoomIn","Zoom in"),children:r.jsx(F.NtdZoomIn,{size:14})})]}),r.jsxs("div",{className:"nice-dmx-timeline__bpm",children:[r.jsx("label",{children:b("dmxTimeline.bpm","BPM:")}),r.jsx("span",{children:i})]}),r.jsx("button",{type:"button",className:"nice-dmx-timeline__blackout",onClick:()=>e.blackout(),title:b("dmxTimeline.blackout","Blackout"),"aria-label":b("dmxTimeline.blackout","Blackout"),children:r.jsx(F.NtdMoon,{size:14})})]}),r.jsxs("div",{className:"nice-dmx-timeline__content",children:[r.jsxs("div",{className:"nice-dmx-timeline__headers",children:[t.map(E=>r.jsxs("div",{className:`nice-dmx-timeline__header ${P===E.id?"nice-dmx-timeline__header--selected":""}`,onClick:()=>A(E.id),children:[r.jsx("span",{className:"nice-dmx-timeline__track-color",style:{backgroundColor:E.color||"var(--nice-accent, #8b5cf6)"}}),r.jsx("span",{className:"nice-dmx-timeline__track-name",children:E.name}),r.jsxs("div",{className:"nice-dmx-timeline__track-controls",children:[r.jsx("button",{type:"button",className:`nice-dmx-timeline__track-toggle ${E.muted?"nice-dmx-timeline__track-toggle--active":""}`,onClick:q=>{q.stopPropagation(),p==null||p({...E,muted:!E.muted})},title:b("dmxTimeline.mute","Mute"),children:"M"}),r.jsx("button",{type:"button",className:`nice-dmx-timeline__track-toggle ${E.locked?"nice-dmx-timeline__track-toggle--active":""}`,onClick:q=>{q.stopPropagation(),p==null||p({...E,locked:!E.locked})},title:b("dmxTimeline.lock","Lock"),"aria-label":b("dmxTimeline.lock","Lock"),children:r.jsx(F.NtdLock,{size:14})})]})]},E.id)),r.jsxs("button",{type:"button",className:"nice-dmx-timeline__add-track",onClick:()=>{h==null||h({id:`track-${Date.now()}`,name:`Track ${t.length+1}`,fixtureIds:[],cues:[]})},children:[r.jsx(F.NtdPlus,{size:14})," ",b("dmxTimeline.addTrack","Add Track")]})]}),r.jsxs("div",{className:"nice-dmx-timeline__tracks",ref:ee,onClick:B,onScroll:E=>w(E.currentTarget.scrollLeft),children:[r.jsx("div",{className:"nice-dmx-timeline__ruler",style:{width:V(a)},children:z()}),t.map(E=>r.jsx("div",{className:`nice-dmx-timeline__track ${E.muted?"nice-dmx-timeline__track--muted":""}`,style:{width:V(a)},children:E.cues.map(q=>Z(q,E))},E.id)),r.jsx("div",{className:"nice-dmx-timeline__playhead",style:{left:V(s)}})]})]})]})};function Vg(){const[e]=d.useState(()=>new jc);return d.useEffect(()=>(e.start(),()=>e.stop()),[e]),e}function Ug(e,t,n=120){const[a,s]=d.useState(0),i=d.useRef(0);return d.useEffect(()=>{if(!t)return;const o=60/n,l=()=>{const c=t.currentTime,u=Math.floor(c/o);u!==i.current&&(i.current=u,s(u))};return t.addEventListener("timeupdate",l),()=>t.removeEventListener("timeupdate",l)},[t,n]),{currentBeat:a}}const qg=[],Hg=[],Kg=[{name:"Flat",bands:[{frequency:60,gain:0},{frequency:250,gain:0},{frequency:1e3,gain:0},{frequency:4e3,gain:0},{frequency:16e3,gain:0}]},{name:"Bass Boost",bands:[{frequency:60,gain:8},{frequency:250,gain:4},{frequency:1e3,gain:0},{frequency:4e3,gain:-2},{frequency:16e3,gain:-4}]},{name:"Treble Boost",bands:[{frequency:60,gain:-4},{frequency:250,gain:-2},{frequency:1e3,gain:0},{frequency:4e3,gain:4},{frequency:16e3,gain:8}]},{name:"Voice",bands:[{frequency:60,gain:-6},{frequency:250,gain:2},{frequency:1e3,gain:6},{frequency:4e3,gain:4},{frequency:16e3,gain:-2}]},{name:"Rock",bands:[{frequency:60,gain:4},{frequency:250,gain:2},{frequency:1e3,gain:-2},{frequency:4e3,gain:4},{frequency:16e3,gain:6}]}];function Mc(){const{t:e}=xe(),[t,n]=d.useState(!1),[a,s]=d.useState(.8),[i,o]=d.useState(!1),[l,c]=d.useState(null),[u,h]=d.useState(null),[p,g]=d.useState(null),y=d.useRef(null),m=d.useRef(null),x=d.useRef(null),b=d.useRef(null),f=d.useRef([]),k=d.useRef(null),v=d.useRef(null),w=d.useRef(a),R=d.useCallback(()=>{if(m.current)return;const Y=new AudioContext;m.current=Y;const O=Y.createGain();O.gain.value=w.current,b.current=O;const U=Y.createAnalyser();U.fftSize=256,k.current=U,O.connect(U).connect(Y.destination)},[]),M=d.useCallback(()=>{const Y=y.current,O=m.current,U=b.current;if(!Y||!O||!U||x.current)return;const V=O.createMediaElementSource(Y);x.current=V,f.current.length>0?(V.connect(f.current[0]),f.current[f.current.length-1].connect(U)):V.connect(U)},[]),j=d.useCallback(()=>{var O;const Y=y.current;!Y||!v.current||(Yt(),R(),M(),((O=m.current)==null?void 0:O.state)==="suspended"&&m.current.resume(),Y.play().catch(U=>h(String(U))))},[R,M]),T=d.useCallback(()=>{var Y;(Y=y.current)==null||Y.pause()},[]),P=d.useCallback(()=>{t?T():j()},[t,j,T]),A=d.useCallback(Y=>{const O=Math.max(0,Math.min(1,Y));s(O),w.current=O,b.current&&(b.current.gain.value=O),y.current&&(y.current.volume=O)},[]),I=d.useCallback(Y=>{v.current=Y,h(null),c(null),o(!0),x.current&&(x.current.disconnect(),x.current=null),y.current||(y.current=new Audio,y.current.crossOrigin="anonymous",y.current.addEventListener("playing",()=>{n(!0),o(!1)}),y.current.addEventListener("pause",()=>n(!1)),y.current.addEventListener("waiting",()=>o(!0)),y.current.addEventListener("canplay",()=>o(!1)),y.current.addEventListener("error",()=>h(e("radioPlayer.failedToLoadStream","Failed to load stream")))),y.current.src=Y.streamUrl,y.current.load(),c({genre:Y.genre,bitrate:Y.bitrate})},[e]),L=d.useCallback(Y=>{m.current||R();const U=m.current;f.current.forEach(K=>K.disconnect());const V=Y.bands.map(K=>{const G=U.createBiquadFilter();return G.type="peaking",G.frequency.value=K.frequency,G.gain.value=K.gain,G.Q.value=K.Q??1.4,G});for(let K=0;K<V.length-1;K++)V[K].connect(V[K+1]);f.current=V,x.current&&b.current&&(x.current.disconnect(),x.current.connect(V[0]),V[V.length-1].connect(b.current)),g(Y.name)},[R]),N=d.useCallback(()=>{f.current.forEach(Y=>Y.disconnect()),f.current=[],x.current&&b.current&&(x.current.disconnect(),x.current.connect(b.current)),g(null)},[]);return d.useEffect(()=>()=>{var Y,O,U;(Y=y.current)==null||Y.pause(),y.current=null,f.current.forEach(V=>V.disconnect()),(O=x.current)==null||O.disconnect(),(U=m.current)==null||U.close()},[]),[{isPlaying:t,volume:a,isBuffering:i,metadata:l,error:u,activePreset:p},{play:j,pause:T,toggle:P,setVolume:A,setStation:I,applyEQPreset:L,clearEQ:N}]}function Rc({stations:e=qg,activeStationId:t,onSelect:n,onToggleFavorite:a,className:s}){const{t:i}=xe(),[o,l]=d.useState(""),[c,u]=d.useState(null),[h,p]=d.useState(!1),g=d.useMemo(()=>[...new Set(e.map(m=>m.genre).filter(Boolean))],[e]),y=d.useMemo(()=>e.filter(m=>{var x,b;if(h&&!m.isFavorite||c&&m.genre!==c)return!1;if(o){const f=o.toLowerCase();return m.name.toLowerCase().includes(f)||(((x=m.genre)==null?void 0:x.toLowerCase().includes(f))??!1)||(((b=m.country)==null?void 0:b.toLowerCase().includes(f))??!1)}return!0}),[e,o,c,h]);return r.jsxs("div",{className:`nice-station-browser${s?` ${s}`:""}`,children:[r.jsxs("div",{className:"nice-station-browser__toolbar",children:[r.jsx("input",{type:"text",className:"nice-station-browser__search",placeholder:i("radioPlayer.searchStations","Search stations…"),value:o,onChange:m=>l(m.target.value)}),r.jsxs("select",{className:"nice-station-browser__genre-filter",value:c??"",onChange:m=>u(m.target.value||null),children:[r.jsx("option",{value:"",children:i("radioPlayer.allGenres","All Genres")}),g.map(m=>r.jsx("option",{value:m,children:m},m))]}),r.jsx("button",{className:`nice-station-browser__fav-toggle${h?" nice-station-browser__fav-toggle--active":""}`,onClick:()=>p(!h),title:i("radioPlayer.favorites","Favorites"),"aria-label":i("radioPlayer.favorites","Favorites"),children:r.jsx(F.NtdStar,{size:14,style:{color:"var(--nice-warning, #facc15)"}})})]}),r.jsxs("div",{className:"nice-station-browser__list",children:[y.map(m=>r.jsxs("div",{className:`nice-station-browser__item${m.id===t?" nice-station-browser__item--active":""}`,onClick:()=>n(m),role:"button",tabIndex:0,onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&n(m)},children:[m.logoUrl&&r.jsx("img",{className:"nice-station-browser__logo",src:m.logoUrl,alt:m.name,loading:"lazy"}),r.jsxs("div",{className:"nice-station-browser__info",children:[r.jsx("span",{className:"nice-station-browser__name",children:m.name}),m.genre&&r.jsx("span",{className:"nice-station-browser__genre",children:m.genre}),m.country&&r.jsx("span",{className:"nice-station-browser__country",children:m.country})]}),m.bitrate&&r.jsx("span",{className:"nice-station-browser__bitrate",children:i("radioPlayer.kbps","{bitrate}kbps").replace("{bitrate}",String(m.bitrate))}),a&&r.jsx("button",{className:`nice-station-browser__fav${m.isFavorite?" nice-station-browser__fav--active":""}`,onClick:x=>{x.stopPropagation(),a(m.id)},"aria-label":i("radioPlayer.favorites","Favorites"),children:r.jsx(F.NtdStar,{size:14,style:{color:m.isFavorite?"var(--nice-warning, #facc15)":"var(--nice-text-muted)"}})})]},m.id)),y.length===0&&r.jsx("div",{className:"nice-station-browser__empty",children:i("radioPlayer.noStationsFound","No stations found")})]})]})}function Yg({stations:e=Hg,initialStationId:t,autoPlay:n=!1,eqPresets:a=Kg,onStationChange:s,onPlayingChange:i,onMetadata:o,onToggleFavorite:l,onRecordingStart:c,onRecordingStop:u,showBrowser:h=!0,showEqualizer:p=!1,showVisualizer:g=!1,showMetadataHistory:y=!1,showRecording:m=!1,showSleepTimer:x=!1,className:b,style:f}){var B,H;const{t:k}=xe(),[v,w]=Mc(),[R,M]=d.useState(()=>t?e.find(z=>z.id===t)??null:null),[j,T]=d.useState(p),P=d.useRef(null),A=d.useRef(0),[I,L]=d.useState([]),[N,_]=d.useState(!1),ee=d.useRef(null),Y=d.useRef([]),[O,U]=d.useState(0),V=d.useRef(null),[K,G]=d.useState(0),[W,C]=d.useState(null),$=d.useRef(null);d.useEffect(()=>{i==null||i(v.isPlaying)},[v.isPlaying,i]),d.useEffect(()=>{v.metadata&&(o==null||o(v.metadata),(v.metadata.title||v.metadata.artist)&&L(z=>[{time:new Date,meta:v.metadata},...z.slice(0,49)]))},[v.metadata,o]);const S=d.useCallback(z=>{M(z),w.setStation(z),s==null||s(z),n&&setTimeout(()=>w.play(),100)},[w,s,n]);return d.useEffect(()=>{if(t&&!R){const z=e.find(Z=>Z.id===t);z&&S(z)}},[t,e,R,S]),d.useEffect(()=>{if(!g||!P.current)return;const z=P.current,Z=z.getContext("2d");if(!Z)return;const E=()=>{A.current=requestAnimationFrame(E),Z.clearRect(0,0,z.width,z.height);const q=Z.createLinearGradient(0,z.height,0,0);if(q.addColorStop(0,ke.resolveCssColor("var(--nice-accent-tint-80, rgba(99, 102, 241, 0.8))",Z.canvas)),q.addColorStop(.5,ke.resolveCssColor("var(--nice-accent-tint-50, rgba(168,85,247,0.6))",Z.canvas)),q.addColorStop(1,"rgba(236,72,153,0.4)"),!v.isPlaying){const se=z.width/32;for(let D=0;D<32;D++){const J=4+Math.sin(Date.now()/1e3+D*.3)*3;Z.fillStyle=q,Z.fillRect(D*se+1,z.height-J,se-2,J)}return}const X=32,re=z.width/X;for(let oe=0;oe<X;oe++){const se=oe/X,J=(Math.sin(Date.now()/200+oe*.5)*.3+.5)*z.height*(1-se*.5)*(.5+Math.random()*.5);Z.fillStyle=q,Z.fillRect(oe*re+1,z.height-J,re-2,J)}};return E(),()=>cancelAnimationFrame(A.current)},[g,v.isPlaying]),d.useCallback(()=>{if(v.isPlaying)try{const Z=new AudioContext().createMediaStreamDestination();Y.current=[];const E=new MediaRecorder(Z.stream,{mimeType:"audio/webm"});E.ondataavailable=q=>{q.data.size>0&&Y.current.push(q.data)},E.onstop=()=>{const q=new Blob(Y.current,{type:"audio/webm"});u==null||u(q),U(0),V.current&&window.clearInterval(V.current)},E.start(1e3),ee.current=E,_(!0),U(0),V.current=window.setInterval(()=>{U(q=>q+1)},1e3),c==null||c()}catch{}},[v.isPlaying,c,u]),d.useCallback(()=>{ee.current&&N&&(ee.current.stop(),_(!1),V.current&&window.clearInterval(V.current))},[N]),d.useCallback(z=>{$.current&&window.clearInterval($.current),G(z),C(z*60),$.current=window.setInterval(()=>{C(Z=>!Z||Z<=1?($.current&&window.clearInterval($.current),$.current=null,w.pause(),null):Z-1)},1e3)},[w]),d.useCallback(()=>{$.current&&window.clearInterval($.current),$.current=null,C(null),G(0)},[]),d.useEffect(()=>()=>{V.current&&window.clearInterval(V.current),$.current&&window.clearInterval($.current),cancelAnimationFrame(A.current)},[]),r.jsxs("div",{className:`nice-radio-player${b?` ${b}`:""}`,style:f,children:[r.jsx("div",{className:"nice-radio-player__now-playing",children:R?r.jsxs(r.Fragment,{children:[R.logoUrl&&r.jsx("img",{className:"nice-radio-player__cover",src:R.logoUrl,alt:R.name}),r.jsxs("div",{className:"nice-radio-player__info",children:[r.jsx("span",{className:"nice-radio-player__station-name",children:R.name}),((B=v.metadata)==null?void 0:B.title)&&r.jsx("span",{className:"nice-radio-player__track",children:v.metadata.artist?`${v.metadata.artist} — ${v.metadata.title}`:v.metadata.title}),((H=v.metadata)==null?void 0:H.genre)&&r.jsx("span",{className:"nice-radio-player__genre",children:v.metadata.genre}),v.isBuffering&&r.jsx("span",{className:"nice-radio-player__buffering",children:k("radioPlayer.buffering","Buffering…")})]})]}):r.jsx("div",{className:"nice-radio-player__placeholder",children:k("radioPlayer.selectStation","Select a station")})}),r.jsxs("div",{className:"nice-radio-player__controls",children:[r.jsx("button",{className:"nice-radio-player__play-btn",onClick:w.toggle,disabled:!R,"aria-label":v.isPlaying?k("radioPlayer.pause","Pause"):k("radioPlayer.play","Play"),children:v.isPlaying?r.jsx(F.NtdPause,{size:16}):r.jsx(F.NtdPlay,{size:16})}),r.jsxs("div",{className:"nice-radio-player__volume",children:[r.jsx("span",{className:"nice-radio-player__volume-icon","aria-hidden":"true",children:r.jsx(F.NtdVolume,{size:16})}),r.jsx("input",{type:"range",min:0,max:1,step:.01,value:v.volume,onChange:z=>w.setVolume(parseFloat(z.target.value)),className:"nice-radio-player__volume-slider","aria-label":k("radioPlayer.volume","Volume")})]}),r.jsx("button",{className:`nice-radio-player__eq-btn${j?" nice-radio-player__eq-btn--active":""}`,onClick:()=>T(!j),title:k("radioPlayer.equalizer","Equalizer"),children:"EQ"})]}),v.error&&r.jsx("div",{className:"nice-radio-player__error",children:v.error}),j&&r.jsx("div",{className:"nice-radio-player__equalizer",children:r.jsxs("div",{className:"nice-radio-player__eq-presets",children:[a.map(z=>r.jsx("button",{className:`nice-radio-player__eq-preset${v.activePreset===z.name?" nice-radio-player__eq-preset--active":""}`,onClick:()=>w.applyEQPreset(z),children:z.name},z.name)),v.activePreset&&r.jsx("button",{className:"nice-radio-player__eq-preset",onClick:w.clearEQ,children:k("clear","Clear")})]})}),h&&r.jsx(Rc,{stations:e,activeStationId:R==null?void 0:R.id,onSelect:S})]})}const Zg=[{urls:"stun:stun.l.google.com:19302"},{urls:"stun:stun1.l.google.com:19302"}],Xg={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0,sampleRate:48e3,channelCount:1};class Nc{constructor(t,n={}){this.localStream=null,this.peers=new Map,this.onRemoteStream=null,this.onPeerStateChange=null,this.onSignalingMessage=null,this.localUserId=t,this.config={iceServers:n.iceServers??Zg,audioConstraints:{...Xg,echoCancellation:n.echoCancellation??!0,noiseSuppression:n.noiseSuppression??!0,autoGainControl:n.autoGainControl??!0}}}async initialize(){return this.localStream?this.localStream:(this.localStream=await navigator.mediaDevices.getUserMedia({audio:this.config.audioConstraints,video:!1}),this.localStream)}getLocalStream(){return this.localStream}getPeerIds(){return Array.from(this.peers.keys())}getPeerState(t){var n;return((n=this.peers.get(t))==null?void 0:n.state)??null}async createOffer(t){if(!this.localStream)throw new Error("WebRTCAudioManager not initialized. Call initialize() first.");const n=this.createPeerConnection(t),a=await n.createOffer();await n.setLocalDescription(a),this.sendSignalingMessage({type:"offer",from:this.localUserId,to:t,payload:a})}async handleSignalingMessage(t){if(t.to===this.localUserId)switch(t.type){case"offer":await this.handleOffer(t.from,t.payload);break;case"answer":await this.handleAnswer(t.from,t.payload);break;case"ice-candidate":await this.handleIceCandidate(t.from,t.payload);break;case"leave":this.removePeer(t.from);break}}removePeer(t){const n=this.peers.get(t);n&&(n.pc.close(),this.peers.delete(t))}disconnect(){for(const t of this.peers.keys())this.sendSignalingMessage({type:"leave",from:this.localUserId,to:t,payload:null});for(const t of this.peers.values())t.pc.close();this.peers.clear(),this.localStream&&(this.localStream.getTracks().forEach(t=>t.stop()),this.localStream=null)}setMuted(t){this.localStream&&this.localStream.getAudioTracks().forEach(n=>{n.enabled=!t})}isMuted(){if(!this.localStream)return!0;const t=this.localStream.getAudioTracks()[0];return t?!t.enabled:!0}createPeerConnection(t){const n=new RTCPeerConnection({iceServers:this.config.iceServers}),a={id:t,pc:n,remoteStream:null,state:n.connectionState};return this.peers.set(t,a),this.localStream&&this.localStream.getTracks().forEach(s=>{n.addTrack(s,this.localStream)}),n.onicecandidate=s=>{s.candidate&&this.sendSignalingMessage({type:"ice-candidate",from:this.localUserId,to:t,payload:s.candidate.toJSON()})},n.ontrack=s=>{var o;const[i]=s.streams;i&&(a.remoteStream=i,(o=this.onRemoteStream)==null||o.call(this,t,i))},n.onconnectionstatechange=()=>{var s;a.state=n.connectionState,(s=this.onPeerStateChange)==null||s.call(this,t,n.connectionState),(n.connectionState==="failed"||n.connectionState==="disconnected")&&this.removePeer(t)},n}async handleOffer(t,n){this.localStream||await this.initialize();const a=this.createPeerConnection(t);await a.setRemoteDescription(new RTCSessionDescription(n));const s=await a.createAnswer();await a.setLocalDescription(s),this.sendSignalingMessage({type:"answer",from:this.localUserId,to:t,payload:s})}async handleAnswer(t,n){const a=this.peers.get(t);a&&await a.pc.setRemoteDescription(new RTCSessionDescription(n))}async handleIceCandidate(t,n){const a=this.peers.get(t);a&&n&&await a.pc.addIceCandidate(new RTCIceCandidate(n))}sendSignalingMessage(t){var n;(n=this.onSignalingMessage)==null||n.call(this,t)}}function Qg(){var e;return!!(typeof window<"u"&&window.RTCPeerConnection&&((e=navigator.mediaDevices)!=null&&e.getUserMedia))}async function Jg(){return(await navigator.mediaDevices.enumerateDevices()).filter(t=>t.kind==="audioinput")}function ey(){return new AudioContext({sampleRate:48e3,latencyHint:"interactive"})}const ps=d.forwardRef(function(t,n){const{t:a}=xe(),{mode:s="bars",width:i=300,height:o=100,barCount:l=32,barColor:c="var(--nice-primary, #3b82f6)",backgroundColor:u="transparent",fftSize:h=256,smoothing:p=.8,minDecibels:g=-90,maxDecibels:y=-10,deviceId:m,autoStart:x=!1,onStart:b,onStop:f,onAudioLevel:k,onError:v,className:w,style:R,barBorderRadius:M=2,barGap:j=2,lineWidth:T=2}=t,P=d.useRef(null),A=d.useRef(null),I=d.useRef(null),L=d.useRef(null),N=d.useRef(0),_=d.useRef(null),ee=d.useRef(0),[Y,O]=d.useState(!1),U=Array.isArray(c)?c.join("|"):c,V=d.useMemo(()=>U.split("|").map(z=>ke.resolveCssColor(z,P.current)),[U]),K=d.useCallback((z,Z,E=!0)=>{const q=E?z.createLinearGradient(0,o,0,0):z.createLinearGradient(0,0,i,0);return Z.forEach((X,re)=>{q.addColorStop(re/(Z.length-1),X)}),q},[i,o]),G=d.useCallback((z,Z)=>{const q=(i-(l-1)*j)/l,X=Math.floor(Z.length/l),re=V,oe=re.length>1?K(z,re):re[0];z.fillStyle=oe;for(let se=0;se<l;se++){const J=Z[se*X]/255*o,ae=se*(q+j),ce=o-J;M>0?(z.beginPath(),z.roundRect(ae,ce,q,J,M),z.fill()):z.fillRect(ae,ce,q,J)}},[l,V,j,M,i,o,K]),W=d.useCallback((z,Z)=>{const E=o/2,X=(i-(l-1)*j)/l,re=Math.floor(Z.length/l),oe=V,se=oe.length>1?K(z,oe):oe[0];z.fillStyle=se;for(let D=0;D<l;D++){const ae=Z[D*re]/255*E,ce=D*(X+j);M>0?(z.beginPath(),z.roundRect(ce,E-ae,X,ae,M),z.fill(),z.beginPath(),z.roundRect(ce,E,X,ae,M),z.fill()):(z.fillRect(ce,E-ae,X,ae),z.fillRect(ce,E,X,ae))}},[l,V,j,M,i,o,K]),C=d.useCallback((z,Z)=>{const E=V;z.strokeStyle=E.length>1?K(z,E,!1):E[0],z.lineWidth=T,z.lineCap="round",z.lineJoin="round",z.beginPath();const q=i/Z.length;let X=0;for(let re=0;re<Z.length;re++){const se=Z[re]/128*o/2;re===0?z.moveTo(X,se):z.lineTo(X,se),X+=q}z.stroke()},[V,T,i,o,K]),$=d.useCallback((z,Z)=>{const E=i/2,q=o/2,X=Math.min(i,o)/3,re=V;z.strokeStyle=re.length>1?K(z,re):re[0],z.lineWidth=T;const oe=Math.floor(Z.length/64),se=Math.PI*2/64;z.beginPath();for(let D=0;D<64;D++){const J=Z[D*oe]/255,ae=X+J*X*.5,ce=D*se-Math.PI/2,le=E+Math.cos(ce)*ae,ne=q+Math.sin(ce)*ae;D===0?z.moveTo(le,ne):z.lineTo(le,ne)}z.closePath(),z.stroke()},[V,T,i,o,K]),S=d.useCallback(()=>{const z=P.current,Z=I.current,E=_.current;if(!z||!Z||!E)return;const q=z.getContext("2d");if(!q)return;s==="waveform"?Z.getByteTimeDomainData(E):Z.getByteFrequencyData(E);let X=0;for(let re=0;re<E.length;re++)X+=E[re];switch(ee.current=X/(E.length*255),k==null||k(ee.current),q.clearRect(0,0,i,o),u!=="transparent"&&(q.fillStyle=ke.resolveCssColor(u,q.canvas),q.fillRect(0,0,i,o)),s){case"bars":G(q,E);break;case"mirror-bars":W(q,E);break;case"waveform":C(q,E);break;case"circle":$(q,E);break}N.current=requestAnimationFrame(S)},[s,i,o,u,G,W,C,$,k]),B=d.useCallback(async()=>{try{if(Y)return;const z=await navigator.mediaDevices.getUserMedia({audio:m?{deviceId:{exact:m}}:!0,video:!1});L.current=z;const Z=new AudioContext;A.current=Z;const E=Z.createMediaStreamSource(z),q=Z.createAnalyser();q.fftSize=h,q.smoothingTimeConstant=p,q.minDecibels=g,q.maxDecibels=y,E.connect(q),I.current=q,_.current=new Uint8Array(q.frequencyBinCount),O(!0),b==null||b(),S()}catch(z){v==null||v(z instanceof Error?z:new Error(String(z)))}},[Y,m,h,p,g,y,b,v,S]),H=d.useCallback(()=>{cancelAnimationFrame(N.current),L.current&&(L.current.getTracks().forEach(Z=>Z.stop()),L.current=null),A.current&&(A.current.close(),A.current=null),I.current=null,_.current=null,ee.current=0,O(!1),f==null||f();const z=P.current;if(z){const Z=z.getContext("2d");Z&&(Z.clearRect(0,0,i,o),u!=="transparent"&&(Z.fillStyle=ke.resolveCssColor(u,Z.canvas),Z.fillRect(0,0,i,o)))}},[i,o,u,f]);return d.useImperativeHandle(n,()=>({start:B,stop:H,isCapturing:()=>Y,getAudioLevel:()=>ee.current}),[B,H,Y]),d.useEffect(()=>(x&&B(),()=>{H()}),[x]),r.jsx("canvas",{ref:P,width:i,height:o,className:w,style:{display:"block",...R},"aria-label":a("streamingVisualizer.audioVisualizer","Audio visualizer")})}),Ni=e=>{switch(e){case"top-left":return{top:16,left:16};case"top-right":return{top:16,right:16};case"bottom-left":return{bottom:16,left:16};case"bottom-right":default:return{bottom:16,right:16}}},ty={position:"fixed",display:"flex",flexDirection:"column",gap:8,padding:12,borderRadius:12,boxShadow:"0 4px 20px var(--nice-overlay-15, rgba(0, 0, 0, 0.15))",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',fontSize:14,minWidth:200,maxWidth:280,transition:"all 0.2s ease"},ny={background:"var(--nice-overlay-light-95, rgba(255, 255, 255, 0.95))",text:"var(--nice-overlay-85, rgba(0, 0, 0, 0.85))",textSecondary:"var(--nice-overlay-60, rgba(0, 0, 0, 0.6))",border:"var(--nice-overlay-10, rgba(0, 0, 0, 0.1))",speakingRing:"var(--nice-success, #22c55e)",mutedBg:"var(--nice-danger-bg, #fee2e2)",mutedIcon:"var(--nice-danger, #ef4444)",activeBg:"var(--nice-success-bg, #dcfce7)",activeIcon:"var(--nice-success, #22c55e)",hoverBg:"var(--nice-overlay-5, rgba(0, 0, 0, 0.05))"},ry={background:"var(--nice-overlay-90, rgba(30, 30, 30, 0.95))",text:"var(--nice-color-white, #fff)",textSecondary:"var(--nice-text-muted, #a0a0a0)",border:"var(--nice-overlay-light-10, rgba(255, 255, 255, 0.1))",speakingRing:"var(--nice-success, #22c55e)",mutedBg:"var(--nice-danger-dark, #7f1d1d)",mutedIcon:"var(--nice-danger-light, #fca5a5)",activeBg:"var(--nice-success, #14532d)",activeIcon:"var(--nice-success-light, #86efac)",hoverBg:"var(--nice-overlay-light-10, rgba(255, 255, 255, 0.1))"},Tc=d.forwardRef(function(t,n){const{t:a}=xe(),{userId:s,userName:i,userAvatarUrl:o,participants:l=[],rtcConfig:c,position:u="bottom-right",expanded:h=!0,onSignalingMessage:p,onMuteToggle:g,onLeave:y,onSpeakingChange:m,speakingThreshold:x=.1,theme:b="auto",className:f,style:k,zIndex:v=1e3}=t,w=d.useRef(null),R=d.useRef(null),M=d.useRef(new Map);d.useRef(new Map);const[j,T]=d.useState(!1),[P,A]=d.useState(!1),[I,L]=d.useState(!1),[N,_]=d.useState(h),Y=d.useMemo(()=>b==="auto"?typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":b,[b])==="dark"?ry:ny;d.useEffect(()=>{const C=new Nc(s,c);C.onRemoteStream=(S,B)=>{let H=M.current.get(S);H||(H=new Audio,H.autoplay=!0,M.current.set(S,H)),H.srcObject=B},C.onSignalingMessage=S=>{p==null||p(S)},C.onPeerStateChange=(S,B)=>{B==="connected"&&A(!0)},w.current=C,C.initialize().then(()=>{var S;(S=R.current)==null||S.start()});const $=M.current;return()=>{C.disconnect(),$.forEach(S=>{S.srcObject=null}),$.clear()}},[s,c,p]);const O=d.useCallback(()=>{var $;const C=!j;T(C),($=w.current)==null||$.setMuted(C),g==null||g(C)},[j,g]),U=d.useCallback(()=>{var C,$;(C=w.current)==null||C.disconnect(),($=R.current)==null||$.stop(),A(!1),y==null||y()},[y]),V=d.useCallback(C=>{const $=C>x;$!==I&&(L($),m==null||m(s,$))},[x,I,s,m]),K=d.useCallback(async C=>{var $;await(($=w.current)==null?void 0:$.createOffer(C))},[]),G=d.useCallback(async C=>{var $;await(($=w.current)==null?void 0:$.handleSignalingMessage(C))},[]);d.useImperativeHandle(n,()=>({connectToPeer:K,handleSignalingMessage:G,toggleMute:O,isMuted:()=>j,leave:U,getManager:()=>w.current}),[K,G,O,j,U]);const W=({participant:C,isLocal:$,isSpeaking:S})=>r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"4px 0"},children:[r.jsx("div",{style:{width:32,height:32,borderRadius:"50%",backgroundColor:Y.hoverBg,border:`2px solid ${S?Y.speakingRing:"transparent"}`,overflow:"hidden",display:"flex",alignItems:"center",justifyContent:"center",fontSize:12,fontWeight:600,color:Y.text,transition:"border-color 0.15s ease"},children:C.avatarUrl?r.jsx("img",{src:C.avatarUrl,alt:C.name,style:{width:"100%",height:"100%",objectFit:"cover"}}):C.name.charAt(0).toUpperCase()}),r.jsx("div",{style:{flex:1,minWidth:0},children:r.jsxs("div",{style:{color:Y.text,fontWeight:500,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:[C.name,$&&r.jsxs("span",{style:{color:Y.textSecondary,fontWeight:400},children:[" ",a("voiceChatOverlay.you","(You)")]})]})}),C.isMuted&&r.jsx(F.NtdMicrophoneOff,{size:16,variant:"outline",primaryColor:Y.mutedIcon})]});return N?r.jsxs("div",{className:f,style:{...ty,...Ni(u),backgroundColor:Y.background,border:`1px solid ${Y.border}`,zIndex:v,...k},children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",paddingBottom:8,borderBottom:`1px solid ${Y.border}`},children:[r.jsx("span",{style:{color:Y.text,fontWeight:600},children:a("voiceChatOverlay.voiceChat","Voice Chat")}),r.jsx("button",{onClick:()=>_(!1),style:{background:"none",border:"none",cursor:"pointer",padding:4,display:"flex",alignItems:"center",justifyContent:"center",borderRadius:4},"aria-label":a("voiceChatOverlay.collapse","Collapse"),children:r.jsx(F.NtdMinimize,{size:16,variant:"outline",primaryColor:Y.textSecondary})})]}),r.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:4},children:[r.jsx(W,{participant:{id:s,name:i,avatarUrl:o,isMuted:j},isLocal:!0,isSpeaking:I&&!j}),l.map(C=>r.jsx(W,{participant:C,isSpeaking:C.isSpeaking},C.id))]}),r.jsx(ps,{ref:R,mode:"bars",width:256,height:32,barCount:24,barColor:j?"var(--nice-text-muted, #9ca3af)":["var(--nice-primary, #3b82f6)","var(--nice-accent, #8b5cf6)"],barGap:3,barBorderRadius:2,autoStart:!1,onAudioLevel:V,style:{borderRadius:4,opacity:j?.5:1}}),r.jsxs("div",{style:{display:"flex",gap:8,marginTop:4},children:[r.jsx("button",{onClick:O,style:{flex:1,padding:"8px 12px",borderRadius:8,border:"none",backgroundColor:j?Y.mutedBg:Y.activeBg,color:j?Y.mutedIcon:Y.activeIcon,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",gap:6,fontWeight:500,fontSize:13,transition:"all 0.15s ease"},"aria-label":j?a("voiceChatOverlay.unmute","Unmute"):a("voiceChatOverlay.mute","Mute"),children:j?r.jsxs(r.Fragment,{children:[r.jsx(F.NtdMicrophoneOff,{size:16,variant:"outline"}),a("voiceChatOverlay.muted","Muted")]}):r.jsxs(r.Fragment,{children:[r.jsx(F.NtdMicrophone,{size:16,variant:"outline"}),a("voiceChatOverlay.micOn","Mic On")]})}),r.jsx("button",{onClick:U,style:{padding:"8px 12px",borderRadius:8,border:"none",backgroundColor:"var(--nice-danger-bg, #fef2f2)",color:"var(--nice-danger-dark, #dc2626)",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:500,fontSize:13,transition:"all 0.15s ease"},"aria-label":a("voiceChatOverlay.leaveVoiceChat","Leave voice chat"),children:r.jsx(F.NtdLogOut,{size:16,variant:"outline"})})]})]}):r.jsx("div",{className:f,style:{position:"fixed",...Ni(u),zIndex:v,...k},children:r.jsxs("button",{onClick:()=>_(!0),style:{width:48,height:48,borderRadius:"50%",border:"none",backgroundColor:Y.background,boxShadow:"0 4px 12px var(--nice-overlay-15, rgba(0, 0, 0, 0.15))",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center"},"aria-label":a("voiceChatOverlay.expandVoiceChat","Expand voice chat"),children:[r.jsx(F.NtdMicrophone,{size:24,variant:"outline",primaryColor:Y.text}),l.length>0&&r.jsx("span",{style:{position:"absolute",top:-4,right:-4,width:20,height:20,borderRadius:"50%",backgroundColor:Y.speakingRing,color:"var(--nice-color-white, #fff)",fontSize:11,fontWeight:600,display:"flex",alignItems:"center",justifyContent:"center"},children:l.length+1})]})})});function ay(e,t){const n={...t,id:`op_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,timestamp:Date.now()},a=e.operations.slice(0,e.undoIndex+1);return a.push(n),{...e,operations:a,undoIndex:a.length-1}}function sy(e){return e.undoIndex<0?e:{...e,undoIndex:e.undoIndex-1}}function iy(e){return e.undoIndex>=e.operations.length-1?e:{...e,undoIndex:e.undoIndex+1}}function oy(e,t,n){const s=({"1/1":4,"1/2":2,"1/4":1,"1/8":.5,"1/16":.25,"1/32":.125,"1/4T":.6666666666666666,"1/8T":.3333333333333333,"1/16T":.16666666666666666,"1/4D":1.5,"1/8D":.75}[t.grid]??1)*n,i=t.strength/100;return e.map(o=>{const l=Math.round(o.startTick/s)*s,c=o.startTick+(l-o.startTick)*i,u=(Math.random()-.5)*2*t.humanize;return{...o,startTick:Math.max(0,Math.round(c+u))}})}function ly(e){if(e.length<2)return null;const t=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],n=[...new Set(e.map(s=>s%12))].sort((s,i)=>s-i),a=[{intervals:[0,4,7],quality:"maj"},{intervals:[0,3,7],quality:"min"},{intervals:[0,4,7,11],quality:"maj7"},{intervals:[0,3,7,10],quality:"min7"},{intervals:[0,4,7,10],quality:"7"},{intervals:[0,3,6],quality:"dim"},{intervals:[0,4,8],quality:"aug"},{intervals:[0,3,6,9],quality:"dim7"},{intervals:[0,2,7],quality:"sus2"},{intervals:[0,5,7],quality:"sus4"},{intervals:[0,4,7,9],quality:"6"},{intervals:[0,3,7,9],quality:"min6"}];for(const s of n){const i=n.map(o=>(o-s+12)%12).sort((o,l)=>o-l);for(const o of a)if(o.intervals.length===i.length&&o.intervals.every((l,c)=>l===i[c])){const l=t[s],c=t[e[0]%12];return{root:l,quality:o.quality,bass:c!==l?c:void 0,symbol:`${l}${o.quality==="maj"?"":o.quality}${c!==l?`/${c}`:""}`,intervals:o.intervals}}}return null}const Pc={major:[0,2,4,5,7,9,11],minor:[0,2,3,5,7,8,10],dorian:[0,2,3,5,7,9,10],phrygian:[0,1,3,5,7,8,10],lydian:[0,2,4,6,7,9,11],mixolydian:[0,2,4,5,7,9,10],aeolian:[0,2,3,5,7,8,10],locrian:[0,1,3,5,6,8,10],"harmonic-minor":[0,2,3,5,7,8,11],"melodic-minor":[0,2,3,5,7,9,11],"pentatonic-major":[0,2,4,7,9],"pentatonic-minor":[0,3,5,7,10],blues:[0,3,5,6,7,10],chromatic:[0,1,2,3,4,5,6,7,8,9,10,11],"whole-tone":[0,2,4,6,8,10]};function cy(e,t,n){const a=Pc[n],s=(e-t+120)%12;let i=a[0],o=999;for(const c of a){const u=Math.min(Math.abs(s-c),12-Math.abs(s-c));u<o&&(o=u,i=c)}const l=Math.floor((e-t)/12);return t+l*12+i}function dy(e,t){switch(t.type){case"transpose":return e.map(n=>({...n,pitch:Math.max(0,Math.min(127,n.pitch+(t.params.semitones??0)))}));case"invert":{const n=t.params.axis??60;return e.map(a=>({...a,pitch:Math.max(0,Math.min(127,Math.round(2*n-a.pitch)))}))}case"retrograde":{if(e.length===0)return e;const n=Math.max(...e.map(a=>a.startTick+a.durationTicks));return e.map(a=>({...a,startTick:n-a.startTick-a.durationTicks}))}case"randomize-velocity":return e.map(n=>({...n,velocity:Math.max(1,Math.min(127,n.velocity+Math.round((Math.random()-.5)*2*(t.params.range??20))))}));default:return e}}function uy(e){return e>=95?"S":e>=85?"A":e>=70?"B":e>=55?"C":e>=40?"D":"F"}const hy={"guitar-standard":{instrument:"guitar-6",stringPitches:[40,45,50,55,59,64]},"guitar-drop-d":{instrument:"guitar-6",stringPitches:[38,45,50,55,59,64]},"bass-standard":{instrument:"bass-4",stringPitches:[28,33,38,43]},"ukulele-standard":{instrument:"ukulele",stringPitches:[67,60,64,69]}},py={"Bass Drum":{staffLine:4,noteHead:"normal",stem:"down"},Snare:{staffLine:2,noteHead:"normal",stem:"up"},"Hi-Hat Closed":{staffLine:0,noteHead:"x",stem:"up"},"Hi-Hat Open":{staffLine:0,noteHead:"diamond",stem:"up"},Ride:{staffLine:-1,noteHead:"x",stem:"up"},Crash:{staffLine:-2,noteHead:"x",stem:"up"},"High Tom":{staffLine:1,noteHead:"normal",stem:"up"},"Mid Tom":{staffLine:2,noteHead:"normal",stem:"down"},"Low Tom":{staffLine:3,noteHead:"normal",stem:"down"}};exports.ALL_CAP_STYLES=Wn;exports.ALL_EFFECTS=_l;exports.ALL_TEXTURES=Eo;exports.ARTNET_PORT=_g;exports.ASYMMETRIC_CAPS=ko;exports.AudioEffectType=xc;exports.AudioPlaybackEngine=h0;exports.AudioRecorder=La;exports.AutoSavePanel=Li;exports.CONTROLLER_PROFILES=Kl;exports.ChaseRunner=Gg;exports.CollaboratorPermission=Sc;exports.DEFAULT_ARP_CONFIG=ua;exports.DEFAULT_AUDIO_INPUT_SETTINGS=Dl;exports.DEFAULT_BAR_FILL=Gt;exports.DEFAULT_CAP_STYLE=Co;exports.DEFAULT_EMPTY_BAR_FILL=Dr;exports.DEFAULT_FONT_SETTINGS=Br;exports.DEFAULT_GOLD_EMPTY_BAR_FILL=Fr;exports.DEFAULT_GOLD_FILLED_BAR_FILL=Or;exports.DEFAULT_KARAOKE_SETTINGS=jo;exports.DEFAULT_SEED_CONFIG=Ol;exports.DMXEngine=jc;exports.DRUM_PATTERN_NAMES=M0;exports.DefaultScoringPresets=Da;exports.DmxChannelControl=hs;exports.DmxChannelType=Ft;exports.DmxEditor=wc;exports.DmxOptionsControl=us;exports.DmxSliderControl=Vn;exports.DynamicRuleField=ot;exports.DynamicRuleOperator=lt;exports.EditorTrackProvider=_a;exports.EditorUndoManager=wu;exports.FIXTURE_PROFILES=Cc;exports.GENERIC_PROFILE=as;exports.GM_DRUM_MAP=py;exports.GRADIENT_PRESETS=hl;exports.GROOVE_TEMPLATES=ls;exports.GenericPlaylistItem=Qa;exports.KARAOKE_FONT_OPTIONS=fp;exports.KEY_MAPS=qo;exports.KaraokeFormat=Ya;exports.LANE_COLORS=In;exports.LAUNCH_CONTROL_PROFILE=Hl;exports.LAYER_COLORS=Tg;exports.MINILAB_PROFILE=ql;exports.MPK_MINI_PROFILE=Ul;exports.MasterFXPanel=zi;exports.MidiCCMapper=N0;exports.NOTE_NAMES=x0;exports.NiceArpeggiatorPanel=cu;exports.NiceAudioEffectsRack=o0;exports.NiceAudioErrorBoundary=Oc;exports.NiceAudioInputPicker=u0;exports.NiceAudioPitchAnalyzer=ph;exports.NiceAudioStudio=Gd;exports.NiceAudioTimeline=Ii;exports.NiceAutoSavePanel=Li;exports.NiceBarFillEditor=hh;exports.NiceCCAutomationLaneEditor=iu;exports.NiceCCLane=Qc;exports.NiceDMXTimeline=Wg;exports.NiceDmxChannelControl=hs;exports.NiceDmxEditor=wc;exports.NiceDmxOptionsControl=us;exports.NiceDmxSliderControl=Vn;exports.NiceDynamicRuleEditor=Of;exports.NiceEditorTrackProvider=_a;exports.NiceGenericPlayer=Io;exports.NiceGenericPlayerControls=Mp;exports.NiceGenericPlayerStage=af;exports.NiceGenericPlaylist=vf;exports.NiceGenericPlaylistItem=Qa;exports.NiceI18nProvider=Dc;exports.NiceKaraokeEditorManager=xp;exports.NiceKaraokeLyrics=po;exports.NiceKaraokeManager=Kh;exports.NiceKaraokePhaserRenderer=wp;exports.NiceKaraokeSelectionMode=ul;exports.NiceKaraokeSessionJoin=hp;exports.NiceKaraokeSetupPanel=dl;exports.NiceKaraokeSongBrowser=rp;exports.NiceKaraokeSummaryOverlay=$o;exports.NiceKaraokeTimeline=To;exports.NiceKaraokeUploader=Vo;exports.NiceLFOPanel=hu;exports.NiceLatencyCalibrator=sp;exports.NiceMasterFXPanel=zi;exports.NiceModeSwitcher=ml;exports.NiceMusicLibraryExplorer=uf;exports.NiceNoteParticles=Wm;exports.NiceNoteRiver=_m;exports.NicePadKaraokeOverlay=Uo;exports.NicePianoRoll=Ea;exports.NicePlaylistBrowser=Xf;exports.NicePlaylistDualPane=Wf;exports.NicePlaylistGridView=tm;exports.NicePlaylistImportWizard=um;exports.NicePlaylistList=ts;exports.NicePlaylistOverview=rm;exports.NicePlaylistSearchBar=am;exports.NicePlaylistSidebar=Jf;exports.NicePlaylistTagEditor=xf;exports.NicePlaylistTrackList=Cl;exports.NiceRadioPlayer=Yg;exports.NiceRecordingOptionsPanel=Di;exports.NiceSampleBrowser=Vd;exports.NiceStageVisualizer=gl;exports.NiceStationBrowser=Rc;exports.NiceStepSequencerPanel=gu;exports.NiceStreamingVisualizer=ps;exports.NiceUndoRedoPanel=_i;exports.NiceVocalEffectsRack=c0;exports.NiceVocalPerformanceReport=Qh;exports.NiceVoiceChatOverlay=Tc;exports.NiceWaveform=Pi;exports.NiceYouTubePlayer=sf;exports.NiceZoomSnapControls=$a;exports.OVERLAY_PATTERNS=Pr;exports.OXYGEN25_PROFILE=Vl;exports.PLAYER_COLORS=Xe;exports.PLAYER_COLOR_VARS=ur;exports.PROGRESSION_NAMES=j0;exports.PadNotePlayer=Zo;exports.PaneSide=xl;exports.PianoRoll=Ea;exports.PlaylistList=ts;exports.PlaylistType=Ja;exports.RecordingOptionsPanel=Di;exports.SACN_PORT=Fg;exports.SCALE_INTERVALS=Pc;exports.SCALE_NAMES=C0;exports.SKEW_CAPS=wo;exports.STANDARD_TUNINGS=hy;exports.SYMMETRIC_CAPS=Va;exports.ShortcutManager=vc;exports.SimpleSynth=Fl;exports.SortDirection=dn;exports.SortField=Sl;exports.StreamingVisualizer=ps;exports.TEXTURE_CATEGORIES=Ha;exports.TrackSource=xt;exports.UndoRedoPanel=_i;exports.ViewMode=bl;exports.VocalEffectsEngine=zl;exports.VoiceChatOverlay=Tc;exports.WebRTCAudioManager=Nc;exports.ZoomSnapControls=$a;exports.addEffectToLayer=B0;exports.addMidiNote=U0;exports.analyzeAudioFileWithAlgorithm=eg;exports.applyGroove=og;exports.applyGrooveTemplate=gc;exports.applyHumanize=mc;exports.applyKaraokeDisplayVars=Xa;exports.applyMidiTransform=dy;exports.applySwing=fc;exports.arrow_L=Ot;exports.arrow_R=Nt;exports.autoCorrelate=zo;exports.bracket_L=Oa;exports.bracket_R=xo;exports.buildArpSequence=so;exports.buildLanes=Ho;exports.buildNoteDescriptors=Ka;exports.buildPadNoteEvents=Yo;exports.buildSegmentScores=Do;exports.canRedo=Ui;exports.canUndo=Vi;exports.chamfer_L=Mr;exports.chamfer_R=fn;exports.clearMidiNotes=H0;exports.clearPattern=sc;exports.computeGrade=uy;exports.computeTheoreticalMax=nl;exports.computeVocalPerformanceReport=ol;exports.convertBrowserSongToKaraokeSongFile=$h;exports.copyCCEvents=da;exports.createAnalyserNode=dc;exports.createArpPattern=$0;exports.createArtNetPacket=Dg;exports.createBasslinePattern=A0;exports.createCCHistory=Oi;exports.createCompressorNode=hc;exports.createDefaultLFO=_r;exports.createDefaultShortcuts=bg;exports.createDropZoneHandlers=Rg;exports.createEmptyPattern=Zt;exports.createEmptyStep=ss;exports.createGainNode=uc;exports.createHiHatPattern=E0;exports.createKickPattern=T0;exports.createLoopRegion=pg;exports.createSACNPacket=Og;exports.createSnarePattern=P0;exports.createVocoderNode=pc;exports.createVoiceChatAudioContext=ey;exports.cutCCEvents=Hi;exports.deleteCCEventsInRange=Ki;exports.deserializeLFO=nu;exports.deserializePattern=L0;exports.detectChord=ly;exports.downsampleAndQuantizePitchPoints=Fo;exports.drawGlossyBarOnCanvas=Tn;exports.drawTimeline=ma;exports.estimateLatencyMs=Oo;exports.estimateLatencyMsFromRecording=cl;exports.evaluateLFO=Aa;exports.evaluateLFOAsCC=Ia;exports.exportCCLane=Xi;exports.extractBpmFromNotes=fo;exports.findTextureByUrl=ch;exports.formatShortcut=xg;exports.generateArpEvents=lu;exports.generatePlaceholderWaveform=sg;exports.generateSeed=Wl;exports.generateUltrastarText=tg;exports.getActiveGradient=fl;exports.getActiveLyrics=Tu;exports.getActiveWords=Pu;exports.getAlgorithmColor=Ph;exports.getAlgorithmCssVar=Eh;exports.getAlgorithmLabel=Th;exports.getArpModes=io;exports.getArpRates=oo;exports.getAudioContext=qn;exports.getAudioInputDevices=Jg;exports.getAudioWorkletProcessorCode=lc;exports.getBackgroundUrl=Nh;exports.getCachedImage=ih;exports.getCapStyleByName=Rn;exports.getComboMultiplier=el;exports.getCoverUrl=Rh;exports.getGrooveTemplate=lg;exports.getGrooveTemplateNames=cg;exports.getLaneForPitch=Ko;exports.getNextPlayerColor=sd;exports.getNextPlayerColorCss=id;exports.getOverlayCanvasPattern=An;exports.getPatternByName=Nn;exports.getSACNMulticastAddress=Bg;exports.getScoringPreset=zr;exports.getTexturePattern=En;exports.getVerseRatingLabel=Jo;exports.handleAddCCEvent=Y0;exports.handleRedo=ku;exports.handleRemoveCCEvent=X0;exports.handleSelectCCLane=K0;exports.handleUndo=Su;exports.handleUpdateCCEvent=Z0;exports.hexToHsl=Er;exports.humanizeMidiNotes=hg;exports.hydrateKaraokeDisplayFromBackend=mp;exports.hydratePlayerKaraokeSettingsFromBackend=Ou;exports.hzToUltrastarPitch=mo;exports.importCCLane=Qi;exports.initKaraokeDisplaySettings=yp;exports.instrumentPresets=p0;exports.isAudioContextRunning=Ei;exports.isInLoopRegion=gg;exports.isWebRTCSupported=Qg;exports.loadAllKaraokeSettings=Bu;exports.loadAudioWorkletModule=cc;exports.loadKaraokeDisplaySettings=pl;exports.loadKaraokeSettings=Ua;exports.loadRemoteScoringPresets=zu;exports.makeClickReference=ll;exports.makeClipSelectionId=ng;exports.mergeWaveforms=ag;exports.midiSeedGenerator=R0;exports.midiToHz=ga;exports.normalizeHex=$r;exports.openAudioFilePicker=Ng;exports.ornate_L=Ga;exports.ornate_R=Tr;exports.parseLyrics=Ru;exports.parseNotes=Hn;exports.parseUltraStarText=Wo;exports.parseVersesWithSyllables=ho;exports.parseVersesWithWords=Nu;exports.parseVideoMetadata=_o;exports.pasteCCEvents=qi;exports.pill_L=qt;exports.pill_R=Dt;exports.preloadTexture=qa;exports.preloadTextures=oh;exports.probeAudioFile=bc;exports.pushCCState=Bi;exports.pushOperation=ay;exports.quantizeMidiNotes=dg;exports.quantizeNotes=oy;exports.quantizeStepInBeats=yc;exports.quantizeStepInSeconds=cs;exports.randomizeVelocity=ac;exports.recordCCEvent=Yi;exports.redoCC=Wi;exports.redoOperation=iy;exports.removeEffectFromLayer=G0;exports.removeMidiNote=q0;exports.renderGlossyBarSvg=Mo;exports.resumeAudioContext=Yt;exports.reversePattern=nc;exports.sampleLFOForDisplay=ro;exports.sampleLFOToCCEvents=no;exports.saveKaraokeDisplaySettings=gp;exports.saveKaraokeSettings=Fu;exports.scaleResult=al;exports.scaleTo10k=rl;exports.scoreNotesWithPitchPoints=tl;exports.selectCCEventsInRange=Ud;exports.serializeLFO=tu;exports.serializePattern=I0;exports.setLoopFromSelection=fg;exports.setProjectWithUndo=co;exports.setStepGate=Ql;exports.setStepNote=Zl;exports.setStepProbability=Jl;exports.setStepVelocity=Xl;exports.sharp_L=hn;exports.sharp_R=pn;exports.shield_L=Rr;exports.shield_R=bo;exports.shiftPattern=rc;exports.shouldTrigger=oc;exports.skewTL_L=hr;exports.skewTL_R=fa;exports.skewTR_L=pa;exports.skewTR_R=pr;exports.snapLoopToGrid=mg;exports.snapTimeToQuantize=Na;exports.snapToGrid=rg;exports.snapToScale=cy;exports.soft_L=Fa;exports.soft_R=vo;exports.stepDuration=is;exports.stepTimeOffset=ic;exports.syncDivisionToHz=eo;exports.tab_L=Ba;exports.tab_R=So;exports.thinCCEvents=Zi;exports.toTrack=Go;exports.toggleEffectBypass=W0;exports.toggleStep=Yl;exports.toggleStepSlide=ec;exports.transposePattern=tc;exports.undoCC=Gi;exports.undoOperation=sy;exports.updateEffectParams=V0;exports.useAudioWorklet=O0;exports.useAutoSave=yu;exports.useCCAutomation=Ji;exports.useCanPickSong=up;exports.useDMXAudioSync=Ug;exports.useDMXEngine=Vg;exports.useEditorTrack=Mu;exports.useKaraokePitch=Qo;exports.useKaraokeScoring=sl;exports.useLocalPlaylists=es;exports.useMPE=y0;exports.useMidiLearn=m0;exports.useNiceTranslation=xe;exports.useOxygen25=b0;exports.usePitchWorker=z0;exports.usePlaybackEngine=vu;exports.useProjectCRUD=ju;exports.useRadioStream=Mc;exports.useRecording=bu;exports.useScoringWorker=D0;exports.useStepSequencer=_0;exports.useWebMidi=Vr;exports.useWorker=os;exports.validateAudioFiles=ds;exports.wave_L=Nr;exports.wave_R=Wa;exports.waveformValue=to;exports.wrapTimeInLoop=yg;
430
+ E`}}function ng(e,t){return`${e}:${t}`}function rg(e,t,n,a=1){if(t==="off")return e;const s=60/n;if(t==="beat")return Math.round(e/(s/a))*(s/a);if(t==="bar"){const i=s*4;return Math.round(e/i)*i}return e}function ag(e){return e.length===0?[]:e.flat()}function sg(e,t=44100){return new Array(Math.floor(e*t)).fill(0)}const ls=[{id:"mpc-60-tight",name:"MPC 60 Tight",stepsPerBar:16,timingOffsets:[0,.02,0,.01,0,.03,0,.01,0,.02,0,.01,0,.03,0,.01],velocityScales:[1.1,.85,.95,.8,1.05,.85,.9,.8,1.1,.85,.95,.8,1.05,.85,.9,.8],durationScales:[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]},{id:"mpc-60-swing",name:"MPC 60 Swing",stepsPerBar:16,timingOffsets:[0,.06,0,.04,0,.07,0,.04,0,.06,0,.04,0,.07,0,.04],velocityScales:[1.15,.7,.9,.75,1.1,.7,.85,.75,1.15,.7,.9,.75,1.1,.7,.85,.75],durationScales:[1.05,.9,1,.95,1.05,.9,1,.95,1.05,.9,1,.95,1.05,.9,1,.95]},{id:"hip-hop-lazy",name:"Hip-Hop Lazy",stepsPerBar:16,timingOffsets:[0,.04,.01,.05,0,.04,.02,.06,0,.04,.01,.05,0,.04,.02,.06],velocityScales:[1.2,.65,.85,.6,1.1,.65,.8,.6,1.2,.65,.85,.6,1.1,.65,.8,.6],durationScales:[1.1,1,1,.9,1.1,1,1,.9,1.1,1,1,.9,1.1,1,1,.9]},{id:"funk-pocket",name:"Funk Pocket",stepsPerBar:16,timingOffsets:[0,-.01,.03,0,0,-.01,.04,0,0,-.01,.03,0,0,-.01,.04,0],velocityScales:[1.2,.9,.7,1.05,.85,.9,.7,1,1.15,.9,.7,1.05,.85,.9,.7,1],durationScales:[1,.95,1.1,1,1,.95,1.1,1,1,.95,1.1,1,1,.95,1.1,1]},{id:"shuffle-blues",name:"Shuffle / Blues",stepsPerBar:8,timingOffsets:[0,.11,0,.11,0,.11,0,.11],velocityScales:[1.2,.8,1.1,.8,1.2,.8,1.1,.8],durationScales:[1.1,.8,1.1,.8,1.1,.8,1.1,.8]},{id:"reggaeton",name:"Reggaeton",stepsPerBar:16,timingOffsets:[0,0,0,.03,0,0,0,.03,0,0,0,.03,0,0,0,.03],velocityScales:[1.3,.6,.9,1.1,.7,.6,.9,1.1,1.3,.6,.9,1.1,.7,.6,.9,1.1],durationScales:[1,1,1,.9,1,1,1,.9,1,1,1,.9,1,1,1,.9]}];function ig(e){let t=e;return()=>(t=t*1664525+1013904223&4294967295,(t>>>0)/4294967295)}function fc(e,t){return t.amount===0?e:e.map(n=>{const a=n.time/t.grid;if(Math.round(a)%2===1){const o=t.grid*t.amount*.5;return{...n,time:n.time+o}}return{...n}})}function mc(e,t){const n=t.seed!=null?ig(t.seed):Math.random;return e.map(a=>{const s=(n()-.5)*2*t.timingAmount,i=Math.round((n()-.5)*2*t.velocityAmount),o=(n()-.5)*2*t.durationAmount;return{...a,time:Math.max(0,a.time+s),velocity:Math.max(1,Math.min(127,a.velocity+i)),duration:Math.max(.01,a.duration+o)}})}function gc(e,t,n=1){const a=4/t.stepsPerBar;return e.map(s=>{const i=s.time/a,o=Math.round(i)%t.stepsPerBar,l=t.timingOffsets[o]*a*n,c=1+(t.velocityScales[o]-1)*n,u=1+(t.durationScales[o]-1)*n;return{...s,time:Math.max(0,s.time+l),velocity:Math.max(1,Math.min(127,Math.round(s.velocity*c))),duration:Math.max(.01,s.duration*u)}})}function og(e,t){let n=[...e.map(a=>({...a}))];return t.template&&t.grooveStrength>0&&(n=gc(n,t.template,t.grooveStrength)),t.swing&&t.swing.amount>0&&(n=fc(n,t.swing)),t.humanize&&(n=mc(n,t.humanize)),n}function lg(e){return ls.find(t=>t.id===e)}function cg(){return ls.map(({id:e,name:t})=>({id:e,name:t}))}function yc(e){switch(e){case"1/4":return 1;case"1/8":return .5;case"1/16":return .25;case"1/32":return .125;case"1/4T":return 2/3;case"1/8T":return 1/3;case"1/16T":return 1/6}}function cs(e,t){return yc(e)*60/t}function Na(e,t,n){const a=cs(t,n);return Math.round(e/a)*a}function dg(e,t){const{value:n,bpm:a,strength:s=1,quantizeStarts:i=!0,quantizeDurations:o=!1}=t,l=cs(n,a);return e.map(c=>{let{start:u,duration:h}=c;if(i){const p=Math.round(u/l)*l;u=u+(p-u)*s}if(o){const p=Math.max(l,Math.round(h/l)*l);h=h+(p-h)*s}return u===c.start&&h===c.duration?c:{...c,start:u,duration:h}})}function ug(e){let t=e;return()=>(t=t*1664525+1013904223&4294967295,(t>>>0)/4294967295)}function hg(e,t={}){const{timingRange:n=.02,velocityRange:a=10,seed:s}=t,i=s!=null?ug(s):Math.random;return e.map(o=>{const l=(i()*2-1)*n,c=Math.round((i()*2-1)*a);return{...o,start:Math.max(0,o.start+l),velocity:o.velocity!=null?Math.max(1,Math.min(127,(o.velocity??100)+c)):void 0}})}function pg(){return{start:0,end:0,enabled:!1}}function fg(e,t){return{...e<t?{start:e,end:t}:{start:t,end:e},enabled:!0}}function mg(e,t,n){return{start:Na(e.start,t,n),end:Na(e.end,t,n),enabled:e.enabled}}function gg(e,t){return t.enabled?e>=t.start&&e<=t.end:!1}function yg(e,t){if(!t.enabled||t.end<=t.start||e<t.start)return e;if(e>=t.end){const n=t.end-t.start;return t.start+(e-t.start)%n}return e}function Ta(e){return e.length===1?e.toLowerCase():e}function Cr(e){var n,a,s,i;const t=[];return(n=e.modifiers)!=null&&n.ctrl&&t.push("Ctrl"),(a=e.modifiers)!=null&&a.shift&&t.push("Shift"),(s=e.modifiers)!=null&&s.alt&&t.push("Alt"),(i=e.modifiers)!=null&&i.meta&&t.push("Meta"),t.push(Ta(e.key)),t.join("+")}function vg(e,t){var l,c,u,h;const n=Ta(e.key)===Ta(t.key),a=!!e.ctrlKey==!!((l=t.modifiers)!=null&&l.ctrl),s=!!e.shiftKey==!!((c=t.modifiers)!=null&&c.shift),i=!!e.altKey==!!((u=t.modifiers)!=null&&u.alt),o=!!e.metaKey==!!((h=t.modifiers)!=null&&h.meta);return n&&a&&s&&i&&o}class vc{constructor(){this.actions=new Map,this.activeScopes=new Set(["global"]),this.enabled=!0,this.listener=null}register(t){this.actions.set(t.id,{...t,enabled:t.enabled??!0})}unregister(t){this.actions.delete(t)}rebind(t,n){const a=this.actions.get(t);a&&(a.binding=n)}setActiveScopes(t){this.activeScopes.clear(),this.activeScopes.add("global");for(const n of t)this.activeScopes.add(n)}setEnabled(t){this.enabled=t}setActionEnabled(t,n){const a=this.actions.get(t);a&&(a.enabled=n)}findConflicts(){const t=[],n=[...this.actions.values()];for(let a=0;a<n.length;a++)for(let s=a+1;s<n.length;s++){const i=n[a],o=n[s];Cr(i.binding)===Cr(o.binding)&&(i.scope===o.scope||i.scope==="global"||o.scope==="global")&&t.push([i,o])}return t}getGrouped(){const t={};for(const n of this.actions.values())t[n.group]||(t[n.group]=[]),t[n.group].push(n);return t}getAll(){return[...this.actions.values()]}exportConfig(){return[...this.actions.values()].map(t=>({id:t.id,binding:t.binding}))}importConfig(t){for(const n of t)this.rebind(n.id,n.binding)}formatBinding(t){const n=this.actions.get(t);return n?Cr(n.binding):""}handleKeyDown(t){if(!this.enabled)return!1;for(const n of this.actions.values())if(n.enabled&&this.activeScopes.has(n.scope)&&vg(t,n.binding))return t.preventDefault(),t.stopPropagation(),n.callback(),!0;return!1}attach(){this.listener||(this.listener=t=>{const n=t.target;n.tagName==="INPUT"||n.tagName==="TEXTAREA"||n.isContentEditable||this.handleKeyDown(t)},window.addEventListener("keydown",this.listener,!0))}detach(){this.listener&&(window.removeEventListener("keydown",this.listener,!0),this.listener=null)}destroy(){this.detach(),this.actions.clear()}}function bg(e={}){const t=new vc,n=()=>{},a=[{id:"transport.play",label:"Play / Pause",group:"Transport",scope:"global",binding:{key:" "}},{id:"transport.stop",label:"Stop",group:"Transport",scope:"global",binding:{key:"Escape"}},{id:"transport.record",label:"Record",group:"Transport",scope:"global",binding:{key:"r",modifiers:{ctrl:!0}}},{id:"transport.rewind",label:"Rewind",group:"Transport",scope:"global",binding:{key:"Home"}},{id:"transport.forward",label:"Forward",group:"Transport",scope:"global",binding:{key:"End"}},{id:"transport.loopToggle",label:"Toggle Loop",group:"Transport",scope:"global",binding:{key:"l"}},{id:"edit.undo",label:"Undo",group:"Edit",scope:"global",binding:{key:"z",modifiers:{ctrl:!0}}},{id:"edit.redo",label:"Redo",group:"Edit",scope:"global",binding:{key:"z",modifiers:{ctrl:!0,shift:!0}}},{id:"edit.cut",label:"Cut",group:"Edit",scope:"editor",binding:{key:"x",modifiers:{ctrl:!0}}},{id:"edit.copy",label:"Copy",group:"Edit",scope:"editor",binding:{key:"c",modifiers:{ctrl:!0}}},{id:"edit.paste",label:"Paste",group:"Edit",scope:"editor",binding:{key:"v",modifiers:{ctrl:!0}}},{id:"edit.delete",label:"Delete",group:"Edit",scope:"editor",binding:{key:"Delete"}},{id:"edit.selectAll",label:"Select All",group:"Edit",scope:"editor",binding:{key:"a",modifiers:{ctrl:!0}}},{id:"edit.duplicate",label:"Duplicate",group:"Edit",scope:"editor",binding:{key:"d",modifiers:{ctrl:!0}}},{id:"view.zoomIn",label:"Zoom In",group:"View",scope:"global",binding:{key:"=",modifiers:{ctrl:!0}}},{id:"view.zoomOut",label:"Zoom Out",group:"View",scope:"global",binding:{key:"-",modifiers:{ctrl:!0}}},{id:"view.zoomFit",label:"Zoom to Fit",group:"View",scope:"global",binding:{key:"0",modifiers:{ctrl:!0}}},{id:"view.toggleMixer",label:"Toggle Mixer",group:"View",scope:"global",binding:{key:"m"}},{id:"view.togglePianoRoll",label:"Toggle Piano Roll",group:"View",scope:"global",binding:{key:"p"}},{id:"pianoRoll.quantize",label:"Quantize Selection",group:"Piano Roll",scope:"piano-roll",binding:{key:"q"}},{id:"pianoRoll.humanize",label:"Humanize Selection",group:"Piano Roll",scope:"piano-roll",binding:{key:"h"}},{id:"pianoRoll.velocityUp",label:"Velocity +10",group:"Piano Roll",scope:"piano-roll",binding:{key:"ArrowUp",modifiers:{shift:!0}}},{id:"pianoRoll.velocityDown",label:"Velocity -10",group:"Piano Roll",scope:"piano-roll",binding:{key:"ArrowDown",modifiers:{shift:!0}}},{id:"pianoRoll.octaveUp",label:"Octave Up",group:"Piano Roll",scope:"piano-roll",binding:{key:"ArrowUp",modifiers:{ctrl:!0,shift:!0}}},{id:"pianoRoll.octaveDown",label:"Octave Down",group:"Piano Roll",scope:"piano-roll",binding:{key:"ArrowDown",modifiers:{ctrl:!0,shift:!0}}},{id:"timeline.split",label:"Split at Cursor",group:"Timeline",scope:"timeline",binding:{key:"s"}},{id:"timeline.mute",label:"Mute Track",group:"Timeline",scope:"timeline",binding:{key:"m",modifiers:{ctrl:!0}}},{id:"timeline.solo",label:"Solo Track",group:"Timeline",scope:"timeline",binding:{key:"s",modifiers:{ctrl:!0}}},{id:"timeline.addTrack",label:"Add Track",group:"Timeline",scope:"timeline",binding:{key:"t",modifiers:{ctrl:!0}}},{id:"mixer.resetFader",label:"Reset Fader",group:"Mixer",scope:"mixer",binding:{key:"0"}},{id:"mixer.bypassFx",label:"Bypass All FX",group:"Mixer",scope:"mixer",binding:{key:"b"}}];for(const s of a)t.register({...s,callback:e[s.id]??n});return t}function xg(e){return Cr(e)}const Sg=["audio/mpeg","audio/wav","audio/ogg","audio/flac","audio/aac","audio/webm","audio/mp4","audio/x-m4a","audio/x-wav","audio/x-aiff","audio/aiff","audio/midi","audio/x-midi"],kg=["mp3","wav","ogg","flac","aac","m4a","webm","wma","aiff","aif","mid","midi","opus"],wg=500*1024*1024,Cg=20;function Bt(e){const t=e.split(".");return t.length>1?t[t.length-1].toLowerCase():""}function jg(e,t){return!!(e.type&&t.some(n=>e.type.startsWith(n.replace("*","")))||e.type.startsWith("audio/"))}function Mg(e,t){const n=Bt(e.name);return n!==""&&t.includes(n)}function ds(e,t={}){const n=t.maxSize??wg,a=t.allowedTypes??Sg,s=t.allowedExtensions??kg,i=t.maxFiles??Cg,o=[],l=[];for(let c=0;c<e.length;c++){const u=e[c];if(c>=i){l.push({file:u,reason:"limit",message:`Exceeded maximum of ${i} files`});continue}if(u.size>n){l.push({file:u,reason:"size",message:`File exceeds ${Math.round(n/1024/1024)}MB limit`});continue}if(!jg(u,a)&&!Mg(u,s)){l.push({file:u,reason:"type",message:`Unsupported file type: ${u.type||Bt(u.name)}`});continue}o.push(u)}return{valid:o,errors:l}}async function bc(e){const t={file:e,name:e.name.replace(/\.[^.]+$/,""),extension:Bt(e.name),sizeBytes:e.size,mimeType:e.type||`audio/${Bt(e.name)}`};try{const n=await e.arrayBuffer(),s=await new OfflineAudioContext(1,1,44100).decodeAudioData(n);t.duration=s.duration,t.sampleRate=s.sampleRate,t.channels=s.numberOfChannels}catch{}return t}function Rg(e){let t=0;return{onDragEnter:n=>{var a;n.preventDefault(),n.stopPropagation(),t++,t===1&&((a=e.onDragEnter)==null||a.call(e))},onDragOver:n=>{n.preventDefault(),n.stopPropagation(),(n instanceof DragEvent&&n.dataTransfer||"dataTransfer"in n&&n.dataTransfer)&&(n.dataTransfer.dropEffect="copy")},onDragLeave:n=>{var a;n.preventDefault(),n.stopPropagation(),t--,t===0&&((a=e.onDragLeave)==null||a.call(e))},onDrop:async n=>{var u,h;n.preventDefault(),n.stopPropagation(),t=0,(u=e.onDragLeave)==null||u.call(e);const a="dataTransfer"in n?n.dataTransfer:null;if(!((h=a==null?void 0:a.files)!=null&&h.length))return;const s=Array.from(a.files),{valid:i,errors:o}=ds(s,e.validation),l=[],c=[...o];for(const p of i)if(e.probe)try{l.push(await bc(p))}catch{c.push({file:p,reason:"decode",message:"Failed to decode audio"})}else l.push({file:p,name:p.name.replace(/\.[^.]+$/,""),extension:Bt(p.name),sizeBytes:p.size,mimeType:p.type||`audio/${Bt(p.name)}`});e.onDrop({accepted:l,rejected:c})}}}function Ng(e={}){return new Promise(t=>{const n=document.createElement("input");n.type="file",n.accept="audio/*,.mid,.midi",n.multiple=e.multiple??!0,n.onchange=async()=>{var l;if(!((l=n.files)!=null&&l.length)){t({accepted:[],rejected:[]});return}const a=Array.from(n.files),{valid:s,errors:i}=ds(a,e.validation),o=s.map(c=>({file:c,name:c.name.replace(/\.[^.]+$/,""),extension:Bt(c.name),sizeBytes:c.size,mimeType:c.type||`audio/${Bt(c.name)}`}));t({accepted:o,rejected:i})},n.click()})}var Ft=(e=>(e.Unknown="Unknown",e.Dimmer="Dimmer",e.DimmerWithOff="DimmerWithOff",e.RotationWithOff="RotationWithOff",e.RotationWithOffAndCcw="RotationWithOffAndCcw",e.Options="Options",e))(Ft||{}),xc=(e=>(e[e.Equalizer=0]="Equalizer",e[e.Compressor=1]="Compressor",e[e.Reverb=2]="Reverb",e[e.Delay=3]="Delay",e[e.Distortion=4]="Distortion",e[e.Chorus=5]="Chorus",e[e.Flanger=6]="Flanger",e[e.Phaser=7]="Phaser",e))(xc||{}),Sc=(e=>(e[e.ReadOnly=0]="ReadOnly",e[e.Edit=1]="Edit",e[e.Owner=2]="Owner",e))(Sc||{});const Tg=["var(--nice-success, #4caf50)","var(--nice-primary, #2196f3)","var(--nice-warning, #ff9800)","var(--nice-color-accent-pink, #e91e63)","var(--nice-accent, #9c27b0)","var(--nice-info, #00bcd4)","var(--nice-success, #8bc34a)","var(--nice-warning, #ffc107)"],Lr=["off","no function","brak"],Pg=e=>e.segments.some(t=>t.isOff||Lr.some(n=>t.name.toLowerCase().includes(n))),Eg=e=>e.segments.find(t=>t.isOff||Lr.some(n=>t.name.toLowerCase().includes(n))),kc=e=>Math.floor((e.valueFrom+e.valueTo)/2),$g=e=>{const t=Eg(e);return t?kc(t):0},Ag=(e,t)=>e.segments.find(n=>t>=n.valueFrom&&t<=n.valueTo),Mn=(e,t=0,n=255)=>Math.max(t,Math.min(n,Math.round(e))),Un=({channel:e,value:t,onChange:n,onCommit:a,showDirectionHint:s})=>{const{t:i}=xe(),[o,l]=d.useState(Mn(t)),c=d.useMemo(()=>Ag(e,o),[e,o]);d.useEffect(()=>l(Mn(t)),[t]);const u=h=>{const p=Mn(h);l(p),n(p),a==null||a(p)};return r.jsxs("div",{className:"ntd-dmx-channel",style:{border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:8,padding:12},children:[r.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:6},children:[r.jsxs("strong",{children:[e.channel,". ",e.name]}),s&&c&&r.jsx("span",{style:{fontSize:12,color:"var(--nice-text-secondary, #6b7280)"},children:c.name})]}),r.jsx("input",{type:"range",min:0,max:255,value:o,onChange:h=>{const p=Mn(Number(h.target.value));l(p),n(p)},onMouseUp:()=>a==null?void 0:a(o),onTouchEnd:()=>a==null?void 0:a(o),style:{width:"100%"}}),r.jsx("div",{style:{marginTop:6},children:r.jsx("input",{type:"number",min:0,max:255,value:o,onChange:h=>{const p=Mn(Number(h.target.value));l(p),n(p)},onBlur:()=>a==null?void 0:a(o),style:{width:80,padding:6,border:"1px solid var(--nice-border, #d1d5db)",borderRadius:6}})}),Pg(e)&&r.jsx("button",{type:"button",onClick:()=>u($g(e)),style:{width:"100%",marginTop:8,padding:"6px 10px",borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)",background:"var(--nice-bg-secondary, #f9fafb)",cursor:"pointer"},children:i("dmxChannelControls.off","OFF")})]})},us=({channel:e,value:t,onChange:n,onCommit:a})=>{const s=d.useMemo(()=>{const o=[...e.segments];return o.sort((l,c)=>{const u=(l.isOff?-1:0)+(Lr.some(p=>l.name.toLowerCase().includes(p))?-1:0),h=(c.isOff?-1:0)+(Lr.some(p=>c.name.toLowerCase().includes(p))?-1:0);return u!==h?u-h:l.name.localeCompare(c.name,void 0,{sensitivity:"base"})}),o},[e]),i=o=>{const l=kc(o);n(l),a==null||a(l)};return r.jsxs("div",{className:"ntd-dmx-channel",style:{border:"1px solid var(--nice-border, #e5e7eb)",borderRadius:8,padding:12},children:[r.jsxs("strong",{children:[e.channel,". ",e.name]}),r.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(120px, 1fr))",gap:8,marginTop:8,maxHeight:220,overflowY:"auto"},children:s.map((o,l)=>{const c=t>=o.valueFrom&&t<=o.valueTo;return r.jsx("button",{type:"button",onClick:()=>i(o),style:{padding:"8px 10px",borderRadius:8,border:c?"2px solid var(--nice-primary-hover, #2563eb)":"1px solid var(--nice-border, #d1d5db)",background:c?"var(--nice-primary-bg, #eff6ff)":"var(--nice-bg, #fff)",textAlign:"left",cursor:"pointer",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:`${o.name} [${o.valueFrom}..${o.valueTo}]`,children:o.name},`${o.name}-${l}`)})})]})},hs=e=>{switch(e.channel.type){case Ft.Dimmer:case Ft.DimmerWithOff:return r.jsx(Un,{...e});case Ft.RotationWithOff:case Ft.RotationWithOffAndCcw:return r.jsx(Un,{...e,showDirectionHint:!0});case Ft.Options:return r.jsx(us,{...e});default:return r.jsx(Un,{...e})}},oa=e=>Math.max(0,Math.min(255,Math.round(e))),Ig=[{target:".ntd-dmx-editor",titleKey:"tutorial.dmxEditor.intro.title",title:"DMX editor",contentKey:"tutorial.dmxEditor.intro.content",content:"Pick the FTDI device and port, then set each DMX channel’s value with the sliders to control your lighting fixtures live.",placement:"auto"}];function wc({service:e,...t}){const{t:n}=xe();return e?r.jsx(Lg,{service:e,...t}):r.jsx("div",{className:t.className,style:t.style,children:r.jsx("small",{children:n("dmxEditor.provideAServicePropDmxservice","Provide a `service` prop (DmxService) to control hardware.")})})}function Lg({service:e,pollInterval:t=500,className:n,style:a,tutorial:s}){const{t:i}=xe(),[o,l]=d.useState([]),[c,u]=d.useState(null),[h,p]=d.useState(()=>Array(513).fill(0)),[g,y]=d.useState(30),[m,x]=d.useState(0),[b,f]=d.useState(!1),j=d.useRef(null);d.useEffect(()=>{let I=!1;return e.getDevices().then(L=>{I||(l(L),L.length>0&&u(L[0]))}).catch(()=>{}),()=>{I=!0}},[e]),d.useEffect(()=>{if(j.current&&window.clearInterval(j.current),!(t<=0))return j.current=window.setInterval(async()=>{try{const I=await e.getState();Array.isArray(I.frontSnapshot)&&I.frontSnapshot.length>=513&&p(I.frontSnapshot.slice(0,513)),typeof I.fps=="number"&&y(I.fps),typeof I.startCode=="number"&&x(I.startCode)}catch{}},t),()=>{j.current&&window.clearInterval(j.current)}},[e,t]);const v=async()=>{c&&(await e.openPort(c.serialNumber||c.description),f(!0))},C=async()=>{await e.closePort(),f(!1)},N=async()=>{await e.blackout(),p(I=>{const L=[...I];for(let P=1;P<L.length;P++)L[P]=0;return L})},M=()=>e.configure(g,m),k=(I,L)=>{const P=oa(L);p(_=>{const ee=[..._];return ee[I]=P,ee})},T=(I,L)=>e.setChannel(I,oa(L)),E=(c==null?void 0:c.deviceInfo)??null,A=d.useMemo(()=>{var I;return(I=E==null?void 0:E.channels)!=null&&I.length?E.channels:Array.from({length:16},(L,P)=>({channel:P+1,name:`Channel ${P+1}`,type:Ft.Dimmer,segments:[{valueFrom:0,valueTo:255,name:"Intensity"}]}))},[E]);return r.jsxs("div",{className:`ntd-dmx-editor ${n??""}`,style:{position:"relative",padding:16,display:"grid",gap:16,...a},children:[r.jsx("span",{style:{position:"absolute",top:6,right:6,zIndex:30},children:r.jsx(ve.NiceTutorialButton,{steps:ve.resolveTutorial(s,Ig)})}),r.jsxs("section",{style:{display:"grid",gap:12,gridTemplateColumns:"1fr auto auto auto",alignItems:"end"},children:[r.jsxs("div",{children:[r.jsx("label",{style:{display:"block",fontWeight:600,marginBottom:6},children:i("dmxEditor.ftdiDevice","FTDI Device")}),r.jsx("select",{value:(c==null?void 0:c.serialNumber)||"",onChange:I=>u(o.find(L=>L.serialNumber===I.target.value)??null),style:{width:"100%",padding:8,borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)"},children:o.map(I=>{var L,P;return r.jsxs("option",{value:I.serialNumber,children:[((L=I.deviceInfo)==null?void 0:L.manufacturer)??""," ",((P=I.deviceInfo)==null?void 0:P.model)??I.description," (",I.serialNumber||I.description,")"]},I.serialNumber||I.description)})}),E&&r.jsxs("div",{style:{marginTop:6,fontSize:12,color:"var(--nice-text-secondary, #6b7280)"},children:[i("dmxEditor.mode","Mode:")," ",r.jsx("b",{children:E.modeName}),i("dmxEditor.footprint",", footprint:")," ",r.jsx("b",{children:E.footprint})]})]}),r.jsx("button",{onClick:v,disabled:!c||b,style:{padding:"10px 14px",borderRadius:8,border:"1px solid var(--nice-success, #10b981)",background:"var(--nice-success-bg, #ecfdf5)",cursor:"pointer"},children:i("dmxEditor.openPort","Open port")}),r.jsx("button",{onClick:C,disabled:!b,style:{padding:"10px 14px",borderRadius:8,border:"1px solid var(--nice-danger, #ef4444)",background:"var(--nice-danger-bg, #fef2f2)",cursor:"pointer"},children:i("dmxEditor.closePort","Close port")}),r.jsx("button",{onClick:N,style:{padding:"10px 14px",borderRadius:8,border:"1px solid var(--nice-border-color, #4b5563)",background:"var(--nice-bg-secondary, #f3f4f6)",cursor:"pointer"},children:i("dmxEditor.blackout","Blackout")})]}),r.jsxs("section",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(min(160px, 100%), 1fr))",gap:12,alignItems:"end"},children:[r.jsxs("div",{children:[r.jsx("label",{style:{display:"block",fontWeight:600,marginBottom:6},children:"FPS"}),r.jsx("input",{type:"number",min:10,max:44,value:g,onChange:I=>y(Number(I.target.value)),style:{width:"100%",padding:8,borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)"}})]}),r.jsxs("div",{children:[r.jsx("label",{style:{display:"block",fontWeight:600,marginBottom:6},children:i("dmxEditor.startCode","Start Code")}),r.jsx("input",{type:"number",min:0,max:255,value:m,onChange:I=>x(oa(Number(I.target.value))),style:{width:"100%",padding:8,borderRadius:6,border:"1px solid var(--nice-border, #d1d5db)"}})]}),r.jsx("div",{children:r.jsx("button",{onClick:M,style:{padding:"10px 14px",borderRadius:8,border:"1px solid var(--nice-primary, #3b82f6)",background:"var(--nice-primary-bg, #eff6ff)",cursor:"pointer"},children:i("dmxEditor.applyConfiguration","Apply configuration")})})]}),r.jsxs("section",{children:[r.jsx("h3",{style:{margin:"8px 0 12px",fontSize:16},children:i("dmxEditor.channels","Channels")}),r.jsx("div",{style:{display:"grid",gap:12,gridTemplateColumns:"repeat(auto-fill, minmax(240px, 1fr))"},children:A.map(I=>r.jsx(hs,{channel:I,value:h[I.channel]??0,onChange:L=>k(I.channel,L),onCommit:L=>T(I.channel,L)},I.channel))})]})]})}const Cc=[{id:"generic-dimmer-1ch",name:"Generic Dimmer",manufacturer:"Generic",type:"dimmer",channelCount:1,channels:[{name:"Dimmer",type:"dimmer",defaultValue:0}]},{id:"generic-rgb-3ch",name:"Generic RGB",manufacturer:"Generic",type:"rgb",channelCount:3,channels:[{name:"Red",type:"color",defaultValue:0},{name:"Green",type:"color",defaultValue:0},{name:"Blue",type:"color",defaultValue:0}]},{id:"generic-rgbw-4ch",name:"Generic RGBW",manufacturer:"Generic",type:"rgbw",channelCount:4,channels:[{name:"Red",type:"color",defaultValue:0},{name:"Green",type:"color",defaultValue:0},{name:"Blue",type:"color",defaultValue:0},{name:"White",type:"color",defaultValue:0}]},{id:"generic-rgbw-dimmer-5ch",name:"Generic RGBW+D",manufacturer:"Generic",type:"rgbw",channelCount:5,channels:[{name:"Dimmer",type:"dimmer",defaultValue:255},{name:"Red",type:"color",defaultValue:0},{name:"Green",type:"color",defaultValue:0},{name:"Blue",type:"color",defaultValue:0},{name:"White",type:"color",defaultValue:0}]},{id:"generic-par-7ch",name:"Generic PAR 7ch",manufacturer:"Generic",type:"par",channelCount:7,channels:[{name:"Dimmer",type:"dimmer",defaultValue:255},{name:"Red",type:"color",defaultValue:0},{name:"Green",type:"color",defaultValue:0},{name:"Blue",type:"color",defaultValue:0},{name:"White",type:"color",defaultValue:0},{name:"Strobe",type:"strobe",defaultValue:0},{name:"Function",type:"function",defaultValue:0}]},{id:"generic-moving-head-16ch",name:"Generic Moving Head 16ch",manufacturer:"Generic",type:"moving_head",channelCount:16,channels:[{name:"Pan",type:"pan",defaultValue:128,min:0,max:255},{name:"Pan Fine",type:"pan",defaultValue:0},{name:"Tilt",type:"tilt",defaultValue:128,min:0,max:255},{name:"Tilt Fine",type:"tilt",defaultValue:0},{name:"Pan/Tilt Speed",type:"speed",defaultValue:0},{name:"Dimmer",type:"dimmer",defaultValue:0},{name:"Strobe",type:"strobe",defaultValue:0},{name:"Red",type:"color",defaultValue:0},{name:"Green",type:"color",defaultValue:0},{name:"Blue",type:"color",defaultValue:0},{name:"White",type:"color",defaultValue:0},{name:"Color Wheel",type:"function",defaultValue:0},{name:"Gobo",type:"gobo",defaultValue:0},{name:"Gobo Rotation",type:"speed",defaultValue:128},{name:"Prism",type:"function",defaultValue:0},{name:"Function",type:"function",defaultValue:0}]},{id:"generic-strobe-2ch",name:"Generic Strobe",manufacturer:"Generic",type:"strobe",channelCount:2,channels:[{name:"Dimmer",type:"dimmer",defaultValue:0},{name:"Strobe Speed",type:"strobe",defaultValue:0}]},{id:"generic-fog-2ch",name:"Generic Fog Machine",manufacturer:"Generic",type:"fog",channelCount:2,channels:[{name:"Output",type:"dimmer",defaultValue:0},{name:"Fan",type:"speed",defaultValue:128}]}];class jc{constructor(){this.universes=new Map,this.fixtures=new Map,this.profiles=new Map,this.outputCallback=null,this.running=!1,this.frameRate=44,this.intervalId=null,Cc.forEach(t=>this.profiles.set(t.id,t)),this.createUniverse(1,"Universe 1")}createUniverse(t,n){const a={id:String(t),name:n,channels:new Uint8Array(512)};return this.universes.set(t,a),a}getUniverse(t){return this.universes.get(t)}addFixture(t){this.fixtures.set(t.id,t)}removeFixture(t){this.fixtures.delete(t)}getFixture(t){return this.fixtures.get(t)}getAllFixtures(){return Array.from(this.fixtures.values())}getProfile(t){return this.profiles.get(t)}registerProfile(t){this.profiles.set(t.id,t)}setChannel(t,n,a){const s=this.universes.get(t);s&&n>=1&&n<=512&&(s.channels[n-1]=Math.max(0,Math.min(255,a)))}getChannel(t,n){const a=this.universes.get(t);return a&&n>=1&&n<=512?a.channels[n-1]:0}setFixtureValues(t,n){const a=this.fixtures.get(t);if(!a)return;const s=this.profiles.get(a.profileId);if(s)for(let i=0;i<Math.min(n.length,s.channelCount);i++)a.values[i]=n[i],this.setChannel(a.universe,a.startChannel+i,n[i])}setFixtureColor(t,n,a,s,i=0){const o=this.fixtures.get(t);if(!o)return;const l=this.profiles.get(o.profileId);if(!l)return;const c=[...o.values];l.channels.forEach((u,h)=>{u.name.toLowerCase().includes("red")?c[h]=n:u.name.toLowerCase().includes("green")?c[h]=a:u.name.toLowerCase().includes("blue")?c[h]=s:u.name.toLowerCase().includes("white")&&(c[h]=i)}),this.setFixtureValues(t,c)}setFixtureDimmer(t,n){const a=this.fixtures.get(t);if(!a)return;const s=this.profiles.get(a.profileId);s&&s.channels.forEach((i,o)=>{i.type==="dimmer"&&(a.values[o]=Math.max(0,Math.min(255,Math.round(n*255))),this.setChannel(a.universe,a.startChannel+o,a.values[o]))})}fadeFixture(t,n,a,s="linear"){return new Promise(i=>{const o=this.fixtures.get(t);if(!o){i();return}const l=[...o.values],c=performance.now(),u=()=>{const h=performance.now()-c,p=Math.min(1,h/a);let g=p;switch(s){case"ease-in":g=p*p;break;case"ease-out":g=1-(1-p)*(1-p);break;case"ease-in-out":g=p<.5?2*p*p:1-Math.pow(-2*p+2,2)/2;break}const y=l.map((m,x)=>{const b=n[x]??m;return Math.round(m+(b-m)*g)});this.setFixtureValues(t,y),p<1?requestAnimationFrame(u):i()};u()})}setOutputCallback(t){this.outputCallback=t}start(){this.running||(this.running=!0,this.intervalId=window.setInterval(()=>{this.sendOutput()},1e3/this.frameRate))}stop(){this.running=!1,this.intervalId!==null&&(clearInterval(this.intervalId),this.intervalId=null)}sendOutput(){this.outputCallback&&this.universes.forEach((t,n)=>{this.outputCallback(n,t.channels)})}blackout(){this.universes.forEach(t=>{t.channels.fill(0)}),this.fixtures.forEach(t=>{t.values.fill(0)})}fullOn(){this.fixtures.forEach(t=>{this.setFixtureDimmer(t.id,1)})}}const _g=6454,Dg=new Uint8Array([65,114,116,45,78,101,116,0]);function zg(e,t){const n=new Uint8Array(18+t.length);return n.set(Dg,0),n[8]=0,n[9]=80,n[10]=0,n[11]=14,n[12]=0,n[13]=0,n[14]=e&255,n[15]=e>>8&255,n[16]=t.length>>8&255,n[17]=t.length&255,n.set(t.slice(0,512),18),n}const Fg=5568;function Og(e,t,n,a=100,s="Nice2Dev DMX"){const i=Math.min(t.length,512),o=126+i,l=new Uint8Array(o),c=new DataView(l.buffer);c.setUint16(0,16,!1),c.setUint16(2,0,!1);const u=[65,83,67,45,69,49,46,49,55,0,0,0];for(let m=0;m<u.length;m++)l[4+m]=u[m];const h=o-16;c.setUint16(16,28672|h&4095,!1),c.setUint32(18,4,!1);for(let m=0;m<16;m++)l[22+m]=m+1;const p=o-38;c.setUint16(38,28672|p&4095,!1),c.setUint32(40,2,!1);const g=new TextEncoder().encode(s.slice(0,63));l.set(g,44),l[108]=a,c.setUint16(109,0,!1),l[111]=n&255,l[112]=0,c.setUint16(113,e,!1);const y=i+11;return c.setUint16(115,28672|y&4095,!1),l[117]=2,l[118]=161,c.setUint16(119,0,!1),c.setUint16(121,1,!1),c.setUint16(123,i+1,!1),l[125]=0,l.set(t.slice(0,i),126),l}function Bg(e){const t=e>>8&255,n=e&255;return`239.255.${t}.${n}`}class Gg{constructor(t,n){this.config=t,this.scenes=n,this.currentStep=0,this.direction=1,this.isRunning=!1,this.timer=null,this.fadeStartTime=0,this.fadeFromValues=new Uint8Array(512),this.fadeToValues=new Uint8Array(512),this.onOutput=null}setOutputCallback(t){this.onOutput=t}start(){this.isRunning||(this.isRunning=!0,this.currentStep=this.config.direction==="backward"?this.config.steps.length-1:0,this.direction=this.config.direction==="backward"?-1:1,this.executeStep())}stop(){this.isRunning=!1,this.timer&&(clearTimeout(this.timer),this.timer=null)}executeStep(){var o;if(!this.isRunning)return;const t=this.config.steps[this.currentStep];if(!t)return;const n=this.scenes.get(t.sceneId);if(!n){this.advanceStep();return}const a=new Uint8Array(512);if(n.channels)for(const l of n.channels)l.channel>=1&&l.channel<=512&&(a[l.channel-1]=l.value);this.fadeFromValues.set(this.fadeToValues),this.fadeToValues.set(a),this.fadeStartTime=performance.now();const s=t.fadeTime/this.config.speed,i=t.holdTime/this.config.speed;s>0?this.runFade(s,()=>{var l;(l=this.onOutput)==null||l.call(this,this.fadeToValues),this.timer=setTimeout(()=>this.advanceStep(),i)}):((o=this.onOutput)==null||o.call(this,a),this.timer=setTimeout(()=>this.advanceStep(),i))}runFade(t,n){const a=performance.now(),s=new Uint8Array(512),i=()=>{var c;if(!this.isRunning)return;const o=performance.now()-a,l=Math.min(o/t,1);for(let u=0;u<512;u++)s[u]=Math.round(this.fadeFromValues[u]+(this.fadeToValues[u]-this.fadeFromValues[u])*l);(c=this.onOutput)==null||c.call(this,s),l<1?requestAnimationFrame(i):n()};requestAnimationFrame(i)}advanceStep(){if(!this.isRunning)return;const{steps:t,loop:n,direction:a}=this.config;if(this.currentStep+=this.direction,a==="bounce"){if(this.currentStep>=t.length?(this.direction=-1,this.currentStep=t.length-2):this.currentStep<0&&(this.direction=1,this.currentStep=1),this.currentStep<0||this.currentStep>=t.length){if(!n){this.stop();return}this.currentStep=0,this.direction=1}}else if(this.currentStep>=t.length||this.currentStep<0){if(!n){this.stop();return}this.currentStep=a==="backward"?t.length-1:0}this.executeStep()}}const Wg=({engine:e,tracks:t=[],scenes:n=[],duration:a=3e5,currentTime:s=0,bpm:i=120,onTimeChange:o,onCueAdd:l,onCueUpdate:c,onCueDelete:u,onTrackAdd:h,onTrackUpdate:p,onPlay:g,onPause:y,onStop:m,className:x=""})=>{const{t:b}=xe(),[f,j]=d.useState(1),[v,C]=d.useState(0),[N,M]=d.useState(!1),[k,T]=d.useState(null),[E,A]=d.useState(null),[I,L]=d.useState(!0),[P,_]=d.useState(1e3),ee=d.useRef(null),K=d.useRef(null),z=d.useRef(0),V=d.useMemo(()=>.1*f,[f]),W=d.useCallback($=>$*V,[V]),H=d.useCallback($=>$/V,[V]),G=d.useCallback($=>{if(!I)return $;const q=6e4/i;return Math.round($/q)*q},[I,i]),Z=d.useRef(()=>{});d.useEffect(()=>{if(!N)return;const $=performance.now(),q=s,X=()=>{const re=performance.now()-$,oe=q+re;if(oe>=a){M(!1),o==null||o(0),m==null||m();return}Z.current(oe),o==null||o(oe),K.current=requestAnimationFrame(X)};return K.current=requestAnimationFrame(X),()=>{K.current!==null&&(cancelAnimationFrame(K.current),K.current=null)}},[N,s,a,o,m]);const w=d.useRef(!1);d.useEffect(()=>{N!==w.current&&(w.current=N,N?g==null||g():y==null||y())},[N,g,y]);const R=d.useCallback($=>{t.forEach(q=>{q.muted||q.cues.forEach(X=>{const re=X.startTime,oe=re+X.duration;if($>=re&&$<oe&&z.current<re){const se=n.find(D=>D.id===X.sceneId);se&&se.fixtures.forEach(D=>{X.fadeIn&&X.fadeIn>0?e.fadeFixture(D.fixtureId,D.values,X.fadeIn):e.setFixtureValues(D.fixtureId,D.values)})}if(z.current<oe&&$>=oe){const se=n.find(D=>D.id===X.sceneId);se&&se.fixtures.forEach(D=>{if(e.getFixture(D.fixtureId)&&X.fadeOut&&X.fadeOut>0){const ae=new Array(D.values.length).fill(0);e.fadeFixture(D.fixtureId,ae,X.fadeOut)}})}})}),z.current=$},[t,n,e]);Z.current=R;const S=$=>{const q=Math.floor($/1e3),X=Math.floor(q/60),re=q%60,oe=Math.floor($%1e3/(1e3/30));return`${X}:${re.toString().padStart(2,"0")}:${oe.toString().padStart(2,"0")}`},F=d.useCallback($=>{if(!ee.current)return;const q=ee.current.getBoundingClientRect(),X=$.clientX-q.left+v,re=G(H(X));o==null||o(Math.max(0,Math.min(a,re)))},[v,H,G,a,o]),Y=d.useCallback(($,q,X)=>{const re=t.find(D=>D.id===q),oe=re==null?void 0:re.cues.find(D=>D.id===$);if(!oe)return;const se=G(Math.max(0,oe.startTime+H(X)));c==null||c({...oe,startTime:se})},[t,H,G,c]),O=()=>{const $=6e4/i,q=Math.ceil(a/$),X=[];for(let re=0;re<=q;re++){const oe=re*$,se=W(oe),D=re%4===0;X.push(r.jsx("div",{className:`nice-dmx-timeline__beat ${D?"nice-dmx-timeline__beat--measure":""}`,style:{left:se},children:D&&r.jsx("span",{className:"nice-dmx-timeline__beat-label",children:re/4+1})},re))}return X},U=($,q)=>{const X=W($.startTime),re=W($.duration),oe=n.find(se=>se.id===$.sceneId);return r.jsxs("div",{role:"button",tabIndex:0,onKeyDown:ve.clickOnActivationKey,className:`nice-dmx-timeline__cue ${k===$.id?"nice-dmx-timeline__cue--selected":""}`,style:{left:X,width:re,backgroundColor:(oe==null?void 0:oe.color)||q.color||"var(--nice-accent, #8b5cf6)"},onClick:se=>{se.stopPropagation(),T($.id)},draggable:!q.locked,onDragEnd:se=>{var J;const D=(J=se.target.parentElement)==null?void 0:J.getBoundingClientRect();D&&Y($.id,q.id,se.clientX-D.left-X)},children:[r.jsx("span",{className:"nice-dmx-timeline__cue-name",children:$.name||(oe==null?void 0:oe.name)}),$.fadeIn&&$.fadeIn>0&&r.jsx("div",{className:"nice-dmx-timeline__cue-fade nice-dmx-timeline__cue-fade--in",style:{width:W($.fadeIn)}}),$.fadeOut&&$.fadeOut>0&&r.jsx("div",{className:"nice-dmx-timeline__cue-fade nice-dmx-timeline__cue-fade--out",style:{width:W($.fadeOut)}})]},$.id)};return r.jsxs("div",{className:`nice-dmx-timeline ${x}`,children:[r.jsxs("div",{className:"nice-dmx-timeline__toolbar",children:[r.jsxs("div",{className:"nice-dmx-timeline__transport",children:[r.jsx("button",{type:"button",onClick:()=>o==null?void 0:o(0),title:b("dmxTimeline.goToStart","Go to start"),"aria-label":b("dmxTimeline.goToStart","Go to start"),children:r.jsx(B.NtdSkipBack,{size:14})}),r.jsx("button",{type:"button",onClick:()=>M(!N),title:N?b("dmxTimeline.pause","Pause"):b("dmxTimeline.play","Play"),"aria-label":N?b("dmxTimeline.pause","Pause"):b("dmxTimeline.play","Play"),children:N?r.jsx(B.NtdPause,{size:14}):r.jsx(B.NtdPlay,{size:14})}),r.jsx("button",{type:"button",onClick:()=>{M(!1),o==null||o(0),e.blackout(),m==null||m()},title:b("dmxTimeline.stop","Stop"),"aria-label":b("dmxTimeline.stop","Stop"),children:r.jsx(B.NtdStop,{size:14})})]}),r.jsx("div",{className:"nice-dmx-timeline__time",children:S(s)}),r.jsxs("div",{className:"nice-dmx-timeline__tools",children:[r.jsx("button",{type:"button",className:`nice-dmx-timeline__tool ${I?"nice-dmx-timeline__tool--active":""}`,onClick:()=>L(!I),title:b("dmxTimeline.snapToGrid","Snap to grid"),"aria-label":b("dmxTimeline.snapToGrid","Snap to grid"),children:r.jsx(B.NtdGrid,{size:14})}),r.jsx("button",{type:"button",onClick:()=>j(Math.max(.25,f-.25)),title:b("dmxTimeline.zoomOut","Zoom out"),"aria-label":b("dmxTimeline.zoomOut","Zoom out"),children:r.jsx(B.NtdZoomOut,{size:14})}),r.jsxs("span",{className:"nice-dmx-timeline__zoom",children:[Math.round(f*100),"%"]}),r.jsx("button",{type:"button",onClick:()=>j(Math.min(4,f+.25)),title:b("dmxTimeline.zoomIn","Zoom in"),"aria-label":b("dmxTimeline.zoomIn","Zoom in"),children:r.jsx(B.NtdZoomIn,{size:14})})]}),r.jsxs("div",{className:"nice-dmx-timeline__bpm",children:[r.jsx("label",{children:b("dmxTimeline.bpm","BPM:")}),r.jsx("span",{children:i})]}),r.jsx("button",{type:"button",className:"nice-dmx-timeline__blackout",onClick:()=>e.blackout(),title:b("dmxTimeline.blackout","Blackout"),"aria-label":b("dmxTimeline.blackout","Blackout"),children:r.jsx(B.NtdMoon,{size:14})})]}),r.jsxs("div",{className:"nice-dmx-timeline__content",children:[r.jsxs("div",{className:"nice-dmx-timeline__headers",children:[t.map($=>r.jsxs("div",{role:"button",tabIndex:0,onKeyDown:ve.clickOnActivationKey,className:`nice-dmx-timeline__header ${E===$.id?"nice-dmx-timeline__header--selected":""}`,onClick:()=>A($.id),children:[r.jsx("span",{className:"nice-dmx-timeline__track-color",style:{backgroundColor:$.color||"var(--nice-accent, #8b5cf6)"}}),r.jsx("span",{className:"nice-dmx-timeline__track-name",children:$.name}),r.jsxs("div",{className:"nice-dmx-timeline__track-controls",children:[r.jsx("button",{type:"button",className:`nice-dmx-timeline__track-toggle ${$.muted?"nice-dmx-timeline__track-toggle--active":""}`,onClick:q=>{q.stopPropagation(),p==null||p({...$,muted:!$.muted})},title:b("dmxTimeline.mute","Mute"),children:"M"}),r.jsx("button",{type:"button",className:`nice-dmx-timeline__track-toggle ${$.locked?"nice-dmx-timeline__track-toggle--active":""}`,onClick:q=>{q.stopPropagation(),p==null||p({...$,locked:!$.locked})},title:b("dmxTimeline.lock","Lock"),"aria-label":b("dmxTimeline.lock","Lock"),children:r.jsx(B.NtdLock,{size:14})})]})]},$.id)),r.jsxs("button",{type:"button",className:"nice-dmx-timeline__add-track",onClick:()=>{h==null||h({id:`track-${Date.now()}`,name:`Track ${t.length+1}`,fixtureIds:[],cues:[]})},children:[r.jsx(B.NtdPlus,{size:14})," ",b("dmxTimeline.addTrack","Add Track")]})]}),r.jsxs("div",{role:"presentation",className:"nice-dmx-timeline__tracks",ref:ee,onClick:F,onScroll:$=>C($.currentTarget.scrollLeft),children:[r.jsx("div",{className:"nice-dmx-timeline__ruler",style:{width:W(a)},children:O()}),t.map($=>r.jsx("div",{className:`nice-dmx-timeline__track ${$.muted?"nice-dmx-timeline__track--muted":""}`,style:{width:W(a)},children:$.cues.map(q=>U(q,$))},$.id)),r.jsx("div",{className:"nice-dmx-timeline__playhead",style:{left:W(s)}})]})]})]})};function Ug(){const[e]=d.useState(()=>new jc);return d.useEffect(()=>(e.start(),()=>e.stop()),[e]),e}function Vg(e,t,n=120){const[a,s]=d.useState(0),i=d.useRef(0);return d.useEffect(()=>{if(!t)return;const o=60/n,l=()=>{const c=t.currentTime,u=Math.floor(c/o);u!==i.current&&(i.current=u,s(u))};return t.addEventListener("timeupdate",l),()=>t.removeEventListener("timeupdate",l)},[t,n]),{currentBeat:a}}const qg=[],Hg=[],Kg=[{name:"Flat",bands:[{frequency:60,gain:0},{frequency:250,gain:0},{frequency:1e3,gain:0},{frequency:4e3,gain:0},{frequency:16e3,gain:0}]},{name:"Bass Boost",bands:[{frequency:60,gain:8},{frequency:250,gain:4},{frequency:1e3,gain:0},{frequency:4e3,gain:-2},{frequency:16e3,gain:-4}]},{name:"Treble Boost",bands:[{frequency:60,gain:-4},{frequency:250,gain:-2},{frequency:1e3,gain:0},{frequency:4e3,gain:4},{frequency:16e3,gain:8}]},{name:"Voice",bands:[{frequency:60,gain:-6},{frequency:250,gain:2},{frequency:1e3,gain:6},{frequency:4e3,gain:4},{frequency:16e3,gain:-2}]},{name:"Rock",bands:[{frequency:60,gain:4},{frequency:250,gain:2},{frequency:1e3,gain:-2},{frequency:4e3,gain:4},{frequency:16e3,gain:6}]}];function Mc(){const{t:e}=xe(),[t,n]=d.useState(!1),[a,s]=d.useState(.8),[i,o]=d.useState(!1),[l,c]=d.useState(null),[u,h]=d.useState(null),[p,g]=d.useState(null),y=d.useRef(null),m=d.useRef(null),x=d.useRef(null),b=d.useRef(null),f=d.useRef([]),j=d.useRef(null),v=d.useRef(null),C=d.useRef(a),N=d.useCallback(()=>{if(m.current)return;const K=new AudioContext;m.current=K;const z=K.createGain();z.gain.value=C.current,b.current=z;const V=K.createAnalyser();V.fftSize=256,j.current=V,z.connect(V).connect(K.destination)},[]),M=d.useCallback(()=>{const K=y.current,z=m.current,V=b.current;if(!K||!z||!V||x.current)return;const W=z.createMediaElementSource(K);x.current=W,f.current.length>0?(W.connect(f.current[0]),f.current[f.current.length-1].connect(V)):W.connect(V)},[]),k=d.useCallback(()=>{var z;const K=y.current;!K||!v.current||(Yt(),N(),M(),((z=m.current)==null?void 0:z.state)==="suspended"&&m.current.resume(),K.play().catch(V=>h(String(V))))},[N,M]),T=d.useCallback(()=>{var K;(K=y.current)==null||K.pause()},[]),E=d.useCallback(()=>{t?T():k()},[t,k,T]),A=d.useCallback(K=>{const z=Math.max(0,Math.min(1,K));s(z),C.current=z,b.current&&(b.current.gain.value=z),y.current&&(y.current.volume=z)},[]),I=d.useCallback(K=>{v.current=K,h(null),c(null),o(!0),x.current&&(x.current.disconnect(),x.current=null),y.current||(y.current=new Audio,y.current.crossOrigin="anonymous",y.current.addEventListener("playing",()=>{n(!0),o(!1)}),y.current.addEventListener("pause",()=>n(!1)),y.current.addEventListener("waiting",()=>o(!0)),y.current.addEventListener("canplay",()=>o(!1)),y.current.addEventListener("error",()=>h(e("radioPlayer.failedToLoadStream","Failed to load stream")))),y.current.src=K.streamUrl,y.current.load(),c({genre:K.genre,bitrate:K.bitrate})},[e]),L=d.useCallback(K=>{m.current||N();const V=m.current;f.current.forEach(H=>H.disconnect());const W=K.bands.map(H=>{const G=V.createBiquadFilter();return G.type="peaking",G.frequency.value=H.frequency,G.gain.value=H.gain,G.Q.value=H.Q??1.4,G});for(let H=0;H<W.length-1;H++)W[H].connect(W[H+1]);f.current=W,x.current&&b.current&&(x.current.disconnect(),x.current.connect(W[0]),W[W.length-1].connect(b.current)),g(K.name)},[N]),P=d.useCallback(()=>{f.current.forEach(K=>K.disconnect()),f.current=[],x.current&&b.current&&(x.current.disconnect(),x.current.connect(b.current)),g(null)},[]);return d.useEffect(()=>()=>{var K,z,V;(K=y.current)==null||K.pause(),y.current=null,f.current.forEach(W=>W.disconnect()),(z=x.current)==null||z.disconnect(),(V=m.current)==null||V.close()},[]),[{isPlaying:t,volume:a,isBuffering:i,metadata:l,error:u,activePreset:p},{play:k,pause:T,toggle:E,setVolume:A,setStation:I,applyEQPreset:L,clearEQ:P}]}function Rc({stations:e=qg,activeStationId:t,onSelect:n,onToggleFavorite:a,className:s}){const{t:i}=xe(),[o,l]=d.useState(""),[c,u]=d.useState(null),[h,p]=d.useState(!1),g=d.useMemo(()=>[...new Set(e.map(m=>m.genre).filter(Boolean))],[e]),y=d.useMemo(()=>e.filter(m=>{var x,b;if(h&&!m.isFavorite||c&&m.genre!==c)return!1;if(o){const f=o.toLowerCase();return m.name.toLowerCase().includes(f)||(((x=m.genre)==null?void 0:x.toLowerCase().includes(f))??!1)||(((b=m.country)==null?void 0:b.toLowerCase().includes(f))??!1)}return!0}),[e,o,c,h]);return r.jsxs("div",{className:`nice-station-browser${s?` ${s}`:""}`,children:[r.jsxs("div",{className:"nice-station-browser__toolbar",children:[r.jsx("input",{type:"text",className:"nice-station-browser__search",placeholder:i("radioPlayer.searchStations","Search stations…"),value:o,onChange:m=>l(m.target.value)}),r.jsxs("select",{className:"nice-station-browser__genre-filter",value:c??"",onChange:m=>u(m.target.value||null),children:[r.jsx("option",{value:"",children:i("radioPlayer.allGenres","All Genres")}),g.map(m=>r.jsx("option",{value:m,children:m},m))]}),r.jsx("button",{className:`nice-station-browser__fav-toggle${h?" nice-station-browser__fav-toggle--active":""}`,onClick:()=>p(!h),title:i("radioPlayer.favorites","Favorites"),"aria-label":i("radioPlayer.favorites","Favorites"),children:r.jsx(B.NtdStar,{size:14,style:{color:"var(--nice-warning, #facc15)"}})})]}),r.jsxs("div",{className:"nice-station-browser__list",children:[y.map(m=>r.jsxs("div",{className:`nice-station-browser__item${m.id===t?" nice-station-browser__item--active":""}`,onClick:()=>n(m),role:"button",tabIndex:0,onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&n(m)},children:[m.logoUrl&&r.jsx("img",{className:"nice-station-browser__logo",src:m.logoUrl,alt:m.name,loading:"lazy"}),r.jsxs("div",{className:"nice-station-browser__info",children:[r.jsx("span",{className:"nice-station-browser__name",children:m.name}),m.genre&&r.jsx("span",{className:"nice-station-browser__genre",children:m.genre}),m.country&&r.jsx("span",{className:"nice-station-browser__country",children:m.country})]}),m.bitrate&&r.jsx("span",{className:"nice-station-browser__bitrate",children:i("radioPlayer.kbps","{bitrate}kbps").replace("{bitrate}",String(m.bitrate))}),a&&r.jsx("button",{className:`nice-station-browser__fav${m.isFavorite?" nice-station-browser__fav--active":""}`,onClick:x=>{x.stopPropagation(),a(m.id)},"aria-label":i("radioPlayer.favorites","Favorites"),children:r.jsx(B.NtdStar,{size:14,style:{color:m.isFavorite?"var(--nice-warning, #facc15)":"var(--nice-text-muted)"}})})]},m.id)),y.length===0&&r.jsx("div",{className:"nice-station-browser__empty",children:i("radioPlayer.noStationsFound","No stations found")})]})]})}function Yg({stations:e=Hg,initialStationId:t,autoPlay:n=!1,eqPresets:a=Kg,onStationChange:s,onPlayingChange:i,onMetadata:o,onToggleFavorite:l,onRecordingStart:c,onRecordingStop:u,showBrowser:h=!0,showEqualizer:p=!1,showVisualizer:g=!1,showMetadataHistory:y=!1,showRecording:m=!1,showSleepTimer:x=!1,className:b,style:f}){var F,Y;const{t:j}=xe(),[v,C]=Mc(),[N,M]=d.useState(()=>t?e.find(O=>O.id===t)??null:null),[k,T]=d.useState(p),E=d.useRef(null),A=d.useRef(0),[I,L]=d.useState([]),[P,_]=d.useState(!1),ee=d.useRef(null),K=d.useRef([]),[z,V]=d.useState(0),W=d.useRef(null),[H,G]=d.useState(0),[Z,w]=d.useState(null),R=d.useRef(null);d.useEffect(()=>{i==null||i(v.isPlaying)},[v.isPlaying,i]),d.useEffect(()=>{v.metadata&&(o==null||o(v.metadata),(v.metadata.title||v.metadata.artist)&&L(O=>[{time:new Date,meta:v.metadata},...O.slice(0,49)]))},[v.metadata,o]);const S=d.useCallback(O=>{M(O),C.setStation(O),s==null||s(O),n&&setTimeout(()=>C.play(),100)},[C,s,n]);return d.useEffect(()=>{if(t&&!N){const O=e.find(U=>U.id===t);O&&S(O)}},[t,e,N,S]),d.useEffect(()=>{if(!g||!E.current)return;const O=E.current,U=O.getContext("2d");if(!U)return;const $=()=>{A.current=requestAnimationFrame($),U.clearRect(0,0,O.width,O.height);const q=U.createLinearGradient(0,O.height,0,0);if(q.addColorStop(0,ve.resolveCssColor("var(--nice-accent-tint-80, rgba(99, 102, 241, 0.8))",U.canvas)),q.addColorStop(.5,ve.resolveCssColor("var(--nice-accent-tint-50, rgba(168,85,247,0.6))",U.canvas)),q.addColorStop(1,"rgba(236,72,153,0.4)"),!v.isPlaying){const se=O.width/32;for(let D=0;D<32;D++){const J=4+Math.sin(Date.now()/1e3+D*.3)*3;U.fillStyle=q,U.fillRect(D*se+1,O.height-J,se-2,J)}return}const X=32,re=O.width/X;for(let oe=0;oe<X;oe++){const se=oe/X,J=(Math.sin(Date.now()/200+oe*.5)*.3+.5)*O.height*(1-se*.5)*(.5+Math.random()*.5);U.fillStyle=q,U.fillRect(oe*re+1,O.height-J,re-2,J)}};return $(),()=>cancelAnimationFrame(A.current)},[g,v.isPlaying]),d.useCallback(()=>{if(v.isPlaying)try{const U=new AudioContext().createMediaStreamDestination();K.current=[];const $=new MediaRecorder(U.stream,{mimeType:"audio/webm"});$.ondataavailable=q=>{q.data.size>0&&K.current.push(q.data)},$.onstop=()=>{const q=new Blob(K.current,{type:"audio/webm"});u==null||u(q),V(0),W.current&&window.clearInterval(W.current)},$.start(1e3),ee.current=$,_(!0),V(0),W.current=window.setInterval(()=>{V(q=>q+1)},1e3),c==null||c()}catch{}},[v.isPlaying,c,u]),d.useCallback(()=>{ee.current&&P&&(ee.current.stop(),_(!1),W.current&&window.clearInterval(W.current))},[P]),d.useCallback(O=>{R.current&&window.clearInterval(R.current),G(O),w(O*60),R.current=window.setInterval(()=>{w(U=>!U||U<=1?(R.current&&window.clearInterval(R.current),R.current=null,C.pause(),null):U-1)},1e3)},[C]),d.useCallback(()=>{R.current&&window.clearInterval(R.current),R.current=null,w(null),G(0)},[]),d.useEffect(()=>()=>{W.current&&window.clearInterval(W.current),R.current&&window.clearInterval(R.current),cancelAnimationFrame(A.current)},[]),r.jsxs("div",{className:`nice-radio-player${b?` ${b}`:""}`,style:f,children:[r.jsx("div",{className:"nice-radio-player__now-playing",children:N?r.jsxs(r.Fragment,{children:[N.logoUrl&&r.jsx("img",{className:"nice-radio-player__cover",src:N.logoUrl,alt:N.name}),r.jsxs("div",{className:"nice-radio-player__info",children:[r.jsx("span",{className:"nice-radio-player__station-name",children:N.name}),((F=v.metadata)==null?void 0:F.title)&&r.jsx("span",{className:"nice-radio-player__track",children:v.metadata.artist?`${v.metadata.artist} — ${v.metadata.title}`:v.metadata.title}),((Y=v.metadata)==null?void 0:Y.genre)&&r.jsx("span",{className:"nice-radio-player__genre",children:v.metadata.genre}),v.isBuffering&&r.jsx("span",{className:"nice-radio-player__buffering",children:j("radioPlayer.buffering","Buffering…")})]})]}):r.jsx("div",{className:"nice-radio-player__placeholder",children:j("radioPlayer.selectStation","Select a station")})}),r.jsxs("div",{className:"nice-radio-player__controls",children:[r.jsx("button",{className:"nice-radio-player__play-btn",onClick:C.toggle,disabled:!N,"aria-label":v.isPlaying?j("radioPlayer.pause","Pause"):j("radioPlayer.play","Play"),children:v.isPlaying?r.jsx(B.NtdPause,{size:16}):r.jsx(B.NtdPlay,{size:16})}),r.jsxs("div",{className:"nice-radio-player__volume",children:[r.jsx("span",{className:"nice-radio-player__volume-icon","aria-hidden":"true",children:r.jsx(B.NtdVolume,{size:16})}),r.jsx("input",{type:"range",min:0,max:1,step:.01,value:v.volume,onChange:O=>C.setVolume(parseFloat(O.target.value)),className:"nice-radio-player__volume-slider","aria-label":j("radioPlayer.volume","Volume")})]}),r.jsx("button",{className:`nice-radio-player__eq-btn${k?" nice-radio-player__eq-btn--active":""}`,onClick:()=>T(!k),title:j("radioPlayer.equalizer","Equalizer"),children:"EQ"})]}),v.error&&r.jsx("div",{className:"nice-radio-player__error",children:v.error}),k&&r.jsx("div",{className:"nice-radio-player__equalizer",children:r.jsxs("div",{className:"nice-radio-player__eq-presets",children:[a.map(O=>r.jsx("button",{className:`nice-radio-player__eq-preset${v.activePreset===O.name?" nice-radio-player__eq-preset--active":""}`,onClick:()=>C.applyEQPreset(O),children:O.name},O.name)),v.activePreset&&r.jsx("button",{className:"nice-radio-player__eq-preset",onClick:C.clearEQ,children:j("clear","Clear")})]})}),h&&r.jsx(Rc,{stations:e,activeStationId:N==null?void 0:N.id,onSelect:S})]})}const Zg=[{urls:"stun:stun.l.google.com:19302"},{urls:"stun:stun1.l.google.com:19302"}],Xg={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0,sampleRate:48e3,channelCount:1};class Nc{constructor(t,n={}){this.localStream=null,this.peers=new Map,this.onRemoteStream=null,this.onPeerStateChange=null,this.onSignalingMessage=null,this.localUserId=t,this.config={iceServers:n.iceServers??Zg,audioConstraints:{...Xg,echoCancellation:n.echoCancellation??!0,noiseSuppression:n.noiseSuppression??!0,autoGainControl:n.autoGainControl??!0}}}async initialize(){return this.localStream?this.localStream:(this.localStream=await navigator.mediaDevices.getUserMedia({audio:this.config.audioConstraints,video:!1}),this.localStream)}getLocalStream(){return this.localStream}getPeerIds(){return Array.from(this.peers.keys())}getPeerState(t){var n;return((n=this.peers.get(t))==null?void 0:n.state)??null}async createOffer(t){if(!this.localStream)throw new Error("WebRTCAudioManager not initialized. Call initialize() first.");const n=this.createPeerConnection(t),a=await n.createOffer();await n.setLocalDescription(a),this.sendSignalingMessage({type:"offer",from:this.localUserId,to:t,payload:a})}async handleSignalingMessage(t){if(t.to===this.localUserId)switch(t.type){case"offer":await this.handleOffer(t.from,t.payload);break;case"answer":await this.handleAnswer(t.from,t.payload);break;case"ice-candidate":await this.handleIceCandidate(t.from,t.payload);break;case"leave":this.removePeer(t.from);break}}removePeer(t){const n=this.peers.get(t);n&&(n.pc.close(),this.peers.delete(t))}disconnect(){for(const t of this.peers.keys())this.sendSignalingMessage({type:"leave",from:this.localUserId,to:t,payload:null});for(const t of this.peers.values())t.pc.close();this.peers.clear(),this.localStream&&(this.localStream.getTracks().forEach(t=>t.stop()),this.localStream=null)}setMuted(t){this.localStream&&this.localStream.getAudioTracks().forEach(n=>{n.enabled=!t})}isMuted(){if(!this.localStream)return!0;const t=this.localStream.getAudioTracks()[0];return t?!t.enabled:!0}createPeerConnection(t){const n=new RTCPeerConnection({iceServers:this.config.iceServers}),a={id:t,pc:n,remoteStream:null,state:n.connectionState};return this.peers.set(t,a),this.localStream&&this.localStream.getTracks().forEach(s=>{n.addTrack(s,this.localStream)}),n.onicecandidate=s=>{s.candidate&&this.sendSignalingMessage({type:"ice-candidate",from:this.localUserId,to:t,payload:s.candidate.toJSON()})},n.ontrack=s=>{var o;const[i]=s.streams;i&&(a.remoteStream=i,(o=this.onRemoteStream)==null||o.call(this,t,i))},n.onconnectionstatechange=()=>{var s;a.state=n.connectionState,(s=this.onPeerStateChange)==null||s.call(this,t,n.connectionState),(n.connectionState==="failed"||n.connectionState==="disconnected")&&this.removePeer(t)},n}async handleOffer(t,n){this.localStream||await this.initialize();const a=this.createPeerConnection(t);await a.setRemoteDescription(new RTCSessionDescription(n));const s=await a.createAnswer();await a.setLocalDescription(s),this.sendSignalingMessage({type:"answer",from:this.localUserId,to:t,payload:s})}async handleAnswer(t,n){const a=this.peers.get(t);a&&await a.pc.setRemoteDescription(new RTCSessionDescription(n))}async handleIceCandidate(t,n){const a=this.peers.get(t);a&&n&&await a.pc.addIceCandidate(new RTCIceCandidate(n))}sendSignalingMessage(t){var n;(n=this.onSignalingMessage)==null||n.call(this,t)}}function Qg(){var e;return!!(typeof window<"u"&&window.RTCPeerConnection&&((e=navigator.mediaDevices)!=null&&e.getUserMedia))}async function Jg(){return(await navigator.mediaDevices.enumerateDevices()).filter(t=>t.kind==="audioinput")}function ey(){return new AudioContext({sampleRate:48e3,latencyHint:"interactive"})}const ps=d.forwardRef(function(t,n){const{t:a}=xe(),{mode:s="bars",width:i=300,height:o=100,barCount:l=32,barColor:c="var(--nice-primary, #3b82f6)",backgroundColor:u="transparent",fftSize:h=256,smoothing:p=.8,minDecibels:g=-90,maxDecibels:y=-10,deviceId:m,autoStart:x=!1,onStart:b,onStop:f,onAudioLevel:j,onError:v,className:C,style:N,barBorderRadius:M=2,barGap:k=2,lineWidth:T=2}=t,E=d.useRef(null),A=d.useRef(null),I=d.useRef(null),L=d.useRef(null),P=d.useRef(0),_=d.useRef(null),ee=d.useRef(0),[K,z]=d.useState(!1),V=Array.isArray(c)?c.join("|"):c,W=d.useMemo(()=>V.split("|").map(O=>ve.resolveCssColor(O,E.current)),[V]),H=d.useCallback((O,U,$=!0)=>{const q=$?O.createLinearGradient(0,o,0,0):O.createLinearGradient(0,0,i,0);return U.forEach((X,re)=>{q.addColorStop(re/(U.length-1),X)}),q},[i,o]),G=d.useCallback((O,U)=>{const q=(i-(l-1)*k)/l,X=Math.floor(U.length/l),re=W,oe=re.length>1?H(O,re):re[0];O.fillStyle=oe;for(let se=0;se<l;se++){const J=U[se*X]/255*o,ae=se*(q+k),ce=o-J;M>0?(O.beginPath(),O.roundRect(ae,ce,q,J,M),O.fill()):O.fillRect(ae,ce,q,J)}},[l,W,k,M,i,o,H]),Z=d.useCallback((O,U)=>{const $=o/2,X=(i-(l-1)*k)/l,re=Math.floor(U.length/l),oe=W,se=oe.length>1?H(O,oe):oe[0];O.fillStyle=se;for(let D=0;D<l;D++){const ae=U[D*re]/255*$,ce=D*(X+k);M>0?(O.beginPath(),O.roundRect(ce,$-ae,X,ae,M),O.fill(),O.beginPath(),O.roundRect(ce,$,X,ae,M),O.fill()):(O.fillRect(ce,$-ae,X,ae),O.fillRect(ce,$,X,ae))}},[l,W,k,M,i,o,H]),w=d.useCallback((O,U)=>{const $=W;O.strokeStyle=$.length>1?H(O,$,!1):$[0],O.lineWidth=T,O.lineCap="round",O.lineJoin="round",O.beginPath();const q=i/U.length;let X=0;for(let re=0;re<U.length;re++){const se=U[re]/128*o/2;re===0?O.moveTo(X,se):O.lineTo(X,se),X+=q}O.stroke()},[W,T,i,o,H]),R=d.useCallback((O,U)=>{const $=i/2,q=o/2,X=Math.min(i,o)/3,re=W;O.strokeStyle=re.length>1?H(O,re):re[0],O.lineWidth=T;const oe=Math.floor(U.length/64),se=Math.PI*2/64;O.beginPath();for(let D=0;D<64;D++){const J=U[D*oe]/255,ae=X+J*X*.5,ce=D*se-Math.PI/2,le=$+Math.cos(ce)*ae,ne=q+Math.sin(ce)*ae;D===0?O.moveTo(le,ne):O.lineTo(le,ne)}O.closePath(),O.stroke()},[W,T,i,o,H]),S=d.useCallback(()=>{const O=E.current,U=I.current,$=_.current;if(!O||!U||!$)return;const q=O.getContext("2d");if(!q)return;s==="waveform"?U.getByteTimeDomainData($):U.getByteFrequencyData($);let X=0;for(let re=0;re<$.length;re++)X+=$[re];switch(ee.current=X/($.length*255),j==null||j(ee.current),q.clearRect(0,0,i,o),u!=="transparent"&&(q.fillStyle=ve.resolveCssColor(u,q.canvas),q.fillRect(0,0,i,o)),s){case"bars":G(q,$);break;case"mirror-bars":Z(q,$);break;case"waveform":w(q,$);break;case"circle":R(q,$);break}P.current=requestAnimationFrame(S)},[s,i,o,u,G,Z,w,R,j]),F=d.useCallback(async()=>{try{if(K)return;const O=await navigator.mediaDevices.getUserMedia({audio:m?{deviceId:{exact:m}}:!0,video:!1});L.current=O;const U=new AudioContext;A.current=U;const $=U.createMediaStreamSource(O),q=U.createAnalyser();q.fftSize=h,q.smoothingTimeConstant=p,q.minDecibels=g,q.maxDecibels=y,$.connect(q),I.current=q,_.current=new Uint8Array(q.frequencyBinCount),z(!0),b==null||b(),S()}catch(O){v==null||v(O instanceof Error?O:new Error(String(O)))}},[K,m,h,p,g,y,b,v,S]),Y=d.useCallback(()=>{cancelAnimationFrame(P.current),L.current&&(L.current.getTracks().forEach(U=>U.stop()),L.current=null),A.current&&(A.current.close(),A.current=null),I.current=null,_.current=null,ee.current=0,z(!1),f==null||f();const O=E.current;if(O){const U=O.getContext("2d");U&&(U.clearRect(0,0,i,o),u!=="transparent"&&(U.fillStyle=ve.resolveCssColor(u,U.canvas),U.fillRect(0,0,i,o)))}},[i,o,u,f]);return d.useImperativeHandle(n,()=>({start:F,stop:Y,isCapturing:()=>K,getAudioLevel:()=>ee.current}),[F,Y,K]),d.useEffect(()=>(x&&F(),()=>{Y()}),[x]),r.jsx("canvas",{ref:E,width:i,height:o,className:C,style:{display:"block",...N},"aria-label":a("streamingVisualizer.audioVisualizer","Audio visualizer")})}),Ni=e=>{switch(e){case"top-left":return{top:16,left:16};case"top-right":return{top:16,right:16};case"bottom-left":return{bottom:16,left:16};case"bottom-right":default:return{bottom:16,right:16}}},ty={position:"fixed",display:"flex",flexDirection:"column",gap:8,padding:12,borderRadius:12,boxShadow:"0 4px 20px var(--nice-overlay-15, rgba(0, 0, 0, 0.15))",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',fontSize:14,minWidth:200,maxWidth:280,transition:"all 0.2s ease"},ny={background:"var(--nice-overlay-light-95, rgba(255, 255, 255, 0.95))",text:"var(--nice-overlay-85, rgba(0, 0, 0, 0.85))",textSecondary:"var(--nice-overlay-60, rgba(0, 0, 0, 0.6))",border:"var(--nice-overlay-10, rgba(0, 0, 0, 0.1))",speakingRing:"var(--nice-success, #22c55e)",mutedBg:"var(--nice-danger-bg, #fee2e2)",mutedIcon:"var(--nice-danger, #ef4444)",activeBg:"var(--nice-success-bg, #dcfce7)",activeIcon:"var(--nice-success, #22c55e)",hoverBg:"var(--nice-overlay-5, rgba(0, 0, 0, 0.05))"},ry={background:"var(--nice-overlay-90, rgba(30, 30, 30, 0.95))",text:"var(--nice-color-white, #fff)",textSecondary:"var(--nice-text-muted, #a0a0a0)",border:"var(--nice-overlay-light-10, rgba(255, 255, 255, 0.1))",speakingRing:"var(--nice-success, #22c55e)",mutedBg:"var(--nice-danger-dark, #7f1d1d)",mutedIcon:"var(--nice-danger-light, #fca5a5)",activeBg:"var(--nice-success, #14532d)",activeIcon:"var(--nice-success-light, #86efac)",hoverBg:"var(--nice-overlay-light-10, rgba(255, 255, 255, 0.1))"},Tc=d.forwardRef(function(t,n){const{t:a}=xe(),{userId:s,userName:i,userAvatarUrl:o,participants:l=[],rtcConfig:c,position:u="bottom-right",expanded:h=!0,onSignalingMessage:p,onMuteToggle:g,onLeave:y,onSpeakingChange:m,speakingThreshold:x=.1,theme:b="auto",className:f,style:j,zIndex:v=1e3}=t,C=d.useRef(null),N=d.useRef(null),M=d.useRef(new Map);d.useRef(new Map);const[k,T]=d.useState(!1),[E,A]=d.useState(!1),[I,L]=d.useState(!1),[P,_]=d.useState(h),K=d.useMemo(()=>b==="auto"?typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":b,[b])==="dark"?ry:ny;d.useEffect(()=>{const w=new Nc(s,c);w.onRemoteStream=(S,F)=>{let Y=M.current.get(S);Y||(Y=new Audio,Y.autoplay=!0,M.current.set(S,Y)),Y.srcObject=F},w.onSignalingMessage=S=>{p==null||p(S)},w.onPeerStateChange=(S,F)=>{F==="connected"&&A(!0)},C.current=w,w.initialize().then(()=>{var S;(S=N.current)==null||S.start()});const R=M.current;return()=>{w.disconnect(),R.forEach(S=>{S.srcObject=null}),R.clear()}},[s,c,p]);const z=d.useCallback(()=>{var R;const w=!k;T(w),(R=C.current)==null||R.setMuted(w),g==null||g(w)},[k,g]),V=d.useCallback(()=>{var w,R;(w=C.current)==null||w.disconnect(),(R=N.current)==null||R.stop(),A(!1),y==null||y()},[y]),W=d.useCallback(w=>{const R=w>x;R!==I&&(L(R),m==null||m(s,R))},[x,I,s,m]),H=d.useCallback(async w=>{var R;await((R=C.current)==null?void 0:R.createOffer(w))},[]),G=d.useCallback(async w=>{var R;await((R=C.current)==null?void 0:R.handleSignalingMessage(w))},[]);d.useImperativeHandle(n,()=>({connectToPeer:H,handleSignalingMessage:G,toggleMute:z,isMuted:()=>k,leave:V,getManager:()=>C.current}),[H,G,z,k,V]);const Z=({participant:w,isLocal:R,isSpeaking:S})=>r.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"4px 0"},children:[r.jsx("div",{style:{width:32,height:32,borderRadius:"50%",backgroundColor:K.hoverBg,border:`2px solid ${S?K.speakingRing:"transparent"}`,overflow:"hidden",display:"flex",alignItems:"center",justifyContent:"center",fontSize:12,fontWeight:600,color:K.text,transition:"border-color 0.15s ease"},children:w.avatarUrl?r.jsx("img",{src:w.avatarUrl,alt:w.name,style:{width:"100%",height:"100%",objectFit:"cover"}}):w.name.charAt(0).toUpperCase()}),r.jsx("div",{style:{flex:1,minWidth:0},children:r.jsxs("div",{style:{color:K.text,fontWeight:500,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:[w.name,R&&r.jsxs("span",{style:{color:K.textSecondary,fontWeight:400},children:[" ",a("voiceChatOverlay.you","(You)")]})]})}),w.isMuted&&r.jsx(B.NtdMicrophoneOff,{size:16,variant:"outline",primaryColor:K.mutedIcon})]});return P?r.jsxs("div",{className:f,style:{...ty,...Ni(u),backgroundColor:K.background,border:`1px solid ${K.border}`,zIndex:v,...j},children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",paddingBottom:8,borderBottom:`1px solid ${K.border}`},children:[r.jsx("span",{style:{color:K.text,fontWeight:600},children:a("voiceChatOverlay.voiceChat","Voice Chat")}),r.jsx("button",{onClick:()=>_(!1),style:{background:"none",border:"none",cursor:"pointer",padding:4,display:"flex",alignItems:"center",justifyContent:"center",borderRadius:4},"aria-label":a("voiceChatOverlay.collapse","Collapse"),children:r.jsx(B.NtdMinimize,{size:16,variant:"outline",primaryColor:K.textSecondary})})]}),r.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:4},children:[r.jsx(Z,{participant:{id:s,name:i,avatarUrl:o,isMuted:k},isLocal:!0,isSpeaking:I&&!k}),l.map(w=>r.jsx(Z,{participant:w,isSpeaking:w.isSpeaking},w.id))]}),r.jsx(ps,{ref:N,mode:"bars",width:256,height:32,barCount:24,barColor:k?"var(--nice-text-muted, #9ca3af)":["var(--nice-primary, #3b82f6)","var(--nice-accent, #8b5cf6)"],barGap:3,barBorderRadius:2,autoStart:!1,onAudioLevel:W,style:{borderRadius:4,opacity:k?.5:1}}),r.jsxs("div",{style:{display:"flex",gap:8,marginTop:4},children:[r.jsx("button",{onClick:z,style:{flex:1,padding:"8px 12px",borderRadius:8,border:"none",backgroundColor:k?K.mutedBg:K.activeBg,color:k?K.mutedIcon:K.activeIcon,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",gap:6,fontWeight:500,fontSize:13,transition:"all 0.15s ease"},"aria-label":k?a("voiceChatOverlay.unmute","Unmute"):a("voiceChatOverlay.mute","Mute"),children:k?r.jsxs(r.Fragment,{children:[r.jsx(B.NtdMicrophoneOff,{size:16,variant:"outline"}),a("voiceChatOverlay.muted","Muted")]}):r.jsxs(r.Fragment,{children:[r.jsx(B.NtdMicrophone,{size:16,variant:"outline"}),a("voiceChatOverlay.micOn","Mic On")]})}),r.jsx("button",{onClick:V,style:{padding:"8px 12px",borderRadius:8,border:"none",backgroundColor:"var(--nice-danger-bg, #fef2f2)",color:"var(--nice-danger-dark, #dc2626)",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:500,fontSize:13,transition:"all 0.15s ease"},"aria-label":a("voiceChatOverlay.leaveVoiceChat","Leave voice chat"),children:r.jsx(B.NtdLogOut,{size:16,variant:"outline"})})]})]}):r.jsx("div",{className:f,style:{position:"fixed",...Ni(u),zIndex:v,...j},children:r.jsxs("button",{onClick:()=>_(!0),style:{width:48,height:48,borderRadius:"50%",border:"none",backgroundColor:K.background,boxShadow:"0 4px 12px var(--nice-overlay-15, rgba(0, 0, 0, 0.15))",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center"},"aria-label":a("voiceChatOverlay.expandVoiceChat","Expand voice chat"),children:[r.jsx(B.NtdMicrophone,{size:24,variant:"outline",primaryColor:K.text}),l.length>0&&r.jsx("span",{style:{position:"absolute",top:-4,right:-4,width:20,height:20,borderRadius:"50%",backgroundColor:K.speakingRing,color:"var(--nice-color-white, #fff)",fontSize:11,fontWeight:600,display:"flex",alignItems:"center",justifyContent:"center"},children:l.length+1})]})})});function ay(e,t){const n={...t,id:`op_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,timestamp:Date.now()},a=e.operations.slice(0,e.undoIndex+1);return a.push(n),{...e,operations:a,undoIndex:a.length-1}}function sy(e){return e.undoIndex<0?e:{...e,undoIndex:e.undoIndex-1}}function iy(e){return e.undoIndex>=e.operations.length-1?e:{...e,undoIndex:e.undoIndex+1}}function oy(e,t,n){const s=({"1/1":4,"1/2":2,"1/4":1,"1/8":.5,"1/16":.25,"1/32":.125,"1/4T":.6666666666666666,"1/8T":.3333333333333333,"1/16T":.16666666666666666,"1/4D":1.5,"1/8D":.75}[t.grid]??1)*n,i=t.strength/100;return e.map(o=>{const l=Math.round(o.startTick/s)*s,c=o.startTick+(l-o.startTick)*i,u=(Math.random()-.5)*2*t.humanize;return{...o,startTick:Math.max(0,Math.round(c+u))}})}function ly(e){if(e.length<2)return null;const t=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],n=[...new Set(e.map(s=>s%12))].sort((s,i)=>s-i),a=[{intervals:[0,4,7],quality:"maj"},{intervals:[0,3,7],quality:"min"},{intervals:[0,4,7,11],quality:"maj7"},{intervals:[0,3,7,10],quality:"min7"},{intervals:[0,4,7,10],quality:"7"},{intervals:[0,3,6],quality:"dim"},{intervals:[0,4,8],quality:"aug"},{intervals:[0,3,6,9],quality:"dim7"},{intervals:[0,2,7],quality:"sus2"},{intervals:[0,5,7],quality:"sus4"},{intervals:[0,4,7,9],quality:"6"},{intervals:[0,3,7,9],quality:"min6"}];for(const s of n){const i=n.map(o=>(o-s+12)%12).sort((o,l)=>o-l);for(const o of a)if(o.intervals.length===i.length&&o.intervals.every((l,c)=>l===i[c])){const l=t[s],c=t[e[0]%12];return{root:l,quality:o.quality,bass:c!==l?c:void 0,symbol:`${l}${o.quality==="maj"?"":o.quality}${c!==l?`/${c}`:""}`,intervals:o.intervals}}}return null}const Pc={major:[0,2,4,5,7,9,11],minor:[0,2,3,5,7,8,10],dorian:[0,2,3,5,7,9,10],phrygian:[0,1,3,5,7,8,10],lydian:[0,2,4,6,7,9,11],mixolydian:[0,2,4,5,7,9,10],aeolian:[0,2,3,5,7,8,10],locrian:[0,1,3,5,6,8,10],"harmonic-minor":[0,2,3,5,7,8,11],"melodic-minor":[0,2,3,5,7,9,11],"pentatonic-major":[0,2,4,7,9],"pentatonic-minor":[0,3,5,7,10],blues:[0,3,5,6,7,10],chromatic:[0,1,2,3,4,5,6,7,8,9,10,11],"whole-tone":[0,2,4,6,8,10]};function cy(e,t,n){const a=Pc[n],s=(e-t+120)%12;let i=a[0],o=999;for(const c of a){const u=Math.min(Math.abs(s-c),12-Math.abs(s-c));u<o&&(o=u,i=c)}const l=Math.floor((e-t)/12);return t+l*12+i}function dy(e,t){switch(t.type){case"transpose":return e.map(n=>({...n,pitch:Math.max(0,Math.min(127,n.pitch+(t.params.semitones??0)))}));case"invert":{const n=t.params.axis??60;return e.map(a=>({...a,pitch:Math.max(0,Math.min(127,Math.round(2*n-a.pitch)))}))}case"retrograde":{if(e.length===0)return e;const n=Math.max(...e.map(a=>a.startTick+a.durationTicks));return e.map(a=>({...a,startTick:n-a.startTick-a.durationTicks}))}case"randomize-velocity":return e.map(n=>({...n,velocity:Math.max(1,Math.min(127,n.velocity+Math.round((Math.random()-.5)*2*(t.params.range??20))))}));default:return e}}function uy(e){return e>=95?"S":e>=85?"A":e>=70?"B":e>=55?"C":e>=40?"D":"F"}const hy={"guitar-standard":{instrument:"guitar-6",stringPitches:[40,45,50,55,59,64]},"guitar-drop-d":{instrument:"guitar-6",stringPitches:[38,45,50,55,59,64]},"bass-standard":{instrument:"bass-4",stringPitches:[28,33,38,43]},"ukulele-standard":{instrument:"ukulele",stringPitches:[67,60,64,69]}},py={"Bass Drum":{staffLine:4,noteHead:"normal",stem:"down"},Snare:{staffLine:2,noteHead:"normal",stem:"up"},"Hi-Hat Closed":{staffLine:0,noteHead:"x",stem:"up"},"Hi-Hat Open":{staffLine:0,noteHead:"diamond",stem:"up"},Ride:{staffLine:-1,noteHead:"x",stem:"up"},Crash:{staffLine:-2,noteHead:"x",stem:"up"},"High Tom":{staffLine:1,noteHead:"normal",stem:"up"},"Mid Tom":{staffLine:2,noteHead:"normal",stem:"down"},"Low Tom":{staffLine:3,noteHead:"normal",stem:"down"}};exports.ALL_CAP_STYLES=Wn;exports.ALL_EFFECTS=_l;exports.ALL_TEXTURES=Eo;exports.ARTNET_PORT=_g;exports.ASYMMETRIC_CAPS=ko;exports.AudioEffectType=xc;exports.AudioPlaybackEngine=h0;exports.AudioRecorder=La;exports.AutoSavePanel=Li;exports.CONTROLLER_PROFILES=Kl;exports.ChaseRunner=Gg;exports.CollaboratorPermission=Sc;exports.DEFAULT_ARP_CONFIG=ua;exports.DEFAULT_AUDIO_INPUT_SETTINGS=zl;exports.DEFAULT_BAR_FILL=Gt;exports.DEFAULT_CAP_STYLE=Co;exports.DEFAULT_EMPTY_BAR_FILL=zr;exports.DEFAULT_FONT_SETTINGS=Br;exports.DEFAULT_GOLD_EMPTY_BAR_FILL=Fr;exports.DEFAULT_GOLD_FILLED_BAR_FILL=Or;exports.DEFAULT_KARAOKE_SETTINGS=jo;exports.DEFAULT_SEED_CONFIG=Ol;exports.DMXEngine=jc;exports.DRUM_PATTERN_NAMES=M0;exports.DefaultScoringPresets=za;exports.DmxChannelControl=hs;exports.DmxChannelType=Ft;exports.DmxEditor=wc;exports.DmxOptionsControl=us;exports.DmxSliderControl=Un;exports.DynamicRuleField=ot;exports.DynamicRuleOperator=lt;exports.EditorTrackProvider=_a;exports.EditorUndoManager=wu;exports.FIXTURE_PROFILES=Cc;exports.GENERIC_PROFILE=as;exports.GM_DRUM_MAP=py;exports.GRADIENT_PRESETS=hl;exports.GROOVE_TEMPLATES=ls;exports.GenericPlaylistItem=Qa;exports.KARAOKE_FONT_OPTIONS=fp;exports.KEY_MAPS=qo;exports.KaraokeFormat=Ya;exports.LANE_COLORS=In;exports.LAUNCH_CONTROL_PROFILE=Hl;exports.LAYER_COLORS=Tg;exports.MINILAB_PROFILE=ql;exports.MPK_MINI_PROFILE=Vl;exports.MasterFXPanel=Di;exports.MidiCCMapper=N0;exports.NOTE_NAMES=x0;exports.NiceArpeggiatorPanel=cu;exports.NiceAudioEffectsRack=o0;exports.NiceAudioErrorBoundary=Oc;exports.NiceAudioInputPicker=u0;exports.NiceAudioPitchAnalyzer=ph;exports.NiceAudioStudio=Gd;exports.NiceAudioTimeline=Ii;exports.NiceAutoSavePanel=Li;exports.NiceBarFillEditor=hh;exports.NiceCCAutomationLaneEditor=iu;exports.NiceCCLane=Qc;exports.NiceDMXTimeline=Wg;exports.NiceDmxChannelControl=hs;exports.NiceDmxEditor=wc;exports.NiceDmxOptionsControl=us;exports.NiceDmxSliderControl=Un;exports.NiceDynamicRuleEditor=Of;exports.NiceEditorTrackProvider=_a;exports.NiceGenericPlayer=Io;exports.NiceGenericPlayerControls=Mp;exports.NiceGenericPlayerStage=af;exports.NiceGenericPlaylist=vf;exports.NiceGenericPlaylistItem=Qa;exports.NiceI18nProvider=zc;exports.NiceKaraokeEditorManager=xp;exports.NiceKaraokeLyrics=po;exports.NiceKaraokeManager=Kh;exports.NiceKaraokePhaserRenderer=wp;exports.NiceKaraokeSelectionMode=ul;exports.NiceKaraokeSessionJoin=hp;exports.NiceKaraokeSetupPanel=dl;exports.NiceKaraokeSongBrowser=rp;exports.NiceKaraokeSummaryOverlay=$o;exports.NiceKaraokeTimeline=To;exports.NiceKaraokeUploader=Uo;exports.NiceLFOPanel=hu;exports.NiceLatencyCalibrator=sp;exports.NiceMasterFXPanel=Di;exports.NiceModeSwitcher=ml;exports.NiceMusicLibraryExplorer=uf;exports.NiceNoteParticles=Wm;exports.NiceNoteRiver=_m;exports.NicePadKaraokeOverlay=Vo;exports.NicePianoRoll=Ea;exports.NicePlaylistBrowser=Xf;exports.NicePlaylistDualPane=Wf;exports.NicePlaylistGridView=tm;exports.NicePlaylistImportWizard=um;exports.NicePlaylistList=ts;exports.NicePlaylistOverview=rm;exports.NicePlaylistSearchBar=am;exports.NicePlaylistSidebar=Jf;exports.NicePlaylistTagEditor=xf;exports.NicePlaylistTrackList=Cl;exports.NiceRadioPlayer=Yg;exports.NiceRecordingOptionsPanel=zi;exports.NiceSampleBrowser=Ud;exports.NiceStageVisualizer=gl;exports.NiceStationBrowser=Rc;exports.NiceStepSequencerPanel=gu;exports.NiceStreamingVisualizer=ps;exports.NiceUndoRedoPanel=_i;exports.NiceVocalEffectsRack=c0;exports.NiceVocalPerformanceReport=Qh;exports.NiceVoiceChatOverlay=Tc;exports.NiceWaveform=Pi;exports.NiceYouTubePlayer=sf;exports.NiceZoomSnapControls=$a;exports.OVERLAY_PATTERNS=Pr;exports.OXYGEN25_PROFILE=Ul;exports.PLAYER_COLORS=Xe;exports.PLAYER_COLOR_VARS=ur;exports.PROGRESSION_NAMES=j0;exports.PadNotePlayer=Zo;exports.PaneSide=xl;exports.PianoRoll=Ea;exports.PlaylistList=ts;exports.PlaylistType=Ja;exports.RecordingOptionsPanel=zi;exports.SACN_PORT=Fg;exports.SCALE_INTERVALS=Pc;exports.SCALE_NAMES=C0;exports.SKEW_CAPS=wo;exports.STANDARD_TUNINGS=hy;exports.SYMMETRIC_CAPS=Ua;exports.ShortcutManager=vc;exports.SimpleSynth=Fl;exports.SortDirection=dn;exports.SortField=Sl;exports.StreamingVisualizer=ps;exports.TEXTURE_CATEGORIES=Ha;exports.TrackSource=xt;exports.UndoRedoPanel=_i;exports.ViewMode=bl;exports.VocalEffectsEngine=Dl;exports.VoiceChatOverlay=Tc;exports.WebRTCAudioManager=Nc;exports.ZoomSnapControls=$a;exports.addEffectToLayer=B0;exports.addMidiNote=V0;exports.analyzeAudioFileWithAlgorithm=eg;exports.applyGroove=og;exports.applyGrooveTemplate=gc;exports.applyHumanize=mc;exports.applyKaraokeDisplayVars=Xa;exports.applyMidiTransform=dy;exports.applySwing=fc;exports.arrow_L=Ot;exports.arrow_R=Nt;exports.autoCorrelate=Do;exports.bracket_L=Oa;exports.bracket_R=xo;exports.buildArpSequence=so;exports.buildLanes=Ho;exports.buildNoteDescriptors=Ka;exports.buildPadNoteEvents=Yo;exports.buildSegmentScores=zo;exports.canRedo=Vi;exports.canUndo=Ui;exports.chamfer_L=Mr;exports.chamfer_R=fn;exports.clearMidiNotes=H0;exports.clearPattern=sc;exports.computeGrade=uy;exports.computeTheoreticalMax=nl;exports.computeVocalPerformanceReport=ol;exports.convertBrowserSongToKaraokeSongFile=$h;exports.copyCCEvents=da;exports.createAnalyserNode=dc;exports.createArpPattern=$0;exports.createArtNetPacket=zg;exports.createBasslinePattern=A0;exports.createCCHistory=Oi;exports.createCompressorNode=hc;exports.createDefaultLFO=_r;exports.createDefaultShortcuts=bg;exports.createDropZoneHandlers=Rg;exports.createEmptyPattern=Zt;exports.createEmptyStep=ss;exports.createGainNode=uc;exports.createHiHatPattern=E0;exports.createKickPattern=T0;exports.createLoopRegion=pg;exports.createSACNPacket=Og;exports.createSnarePattern=P0;exports.createVocoderNode=pc;exports.createVoiceChatAudioContext=ey;exports.cutCCEvents=Hi;exports.deleteCCEventsInRange=Ki;exports.deserializeLFO=nu;exports.deserializePattern=L0;exports.detectChord=ly;exports.downsampleAndQuantizePitchPoints=Fo;exports.drawGlossyBarOnCanvas=Tn;exports.drawTimeline=ma;exports.estimateLatencyMs=Oo;exports.estimateLatencyMsFromRecording=cl;exports.evaluateLFO=Aa;exports.evaluateLFOAsCC=Ia;exports.exportCCLane=Xi;exports.extractBpmFromNotes=fo;exports.findTextureByUrl=ch;exports.formatShortcut=xg;exports.generateArpEvents=lu;exports.generatePlaceholderWaveform=sg;exports.generateSeed=Wl;exports.generateUltrastarText=tg;exports.getActiveGradient=fl;exports.getActiveLyrics=Tu;exports.getActiveWords=Pu;exports.getAlgorithmColor=Ph;exports.getAlgorithmCssVar=Eh;exports.getAlgorithmLabel=Th;exports.getArpModes=io;exports.getArpRates=oo;exports.getAudioContext=qn;exports.getAudioInputDevices=Jg;exports.getAudioWorkletProcessorCode=lc;exports.getBackgroundUrl=Nh;exports.getCachedImage=ih;exports.getCapStyleByName=Rn;exports.getComboMultiplier=el;exports.getCoverUrl=Rh;exports.getGrooveTemplate=lg;exports.getGrooveTemplateNames=cg;exports.getLaneForPitch=Ko;exports.getNextPlayerColor=sd;exports.getNextPlayerColorCss=id;exports.getOverlayCanvasPattern=An;exports.getPatternByName=Nn;exports.getSACNMulticastAddress=Bg;exports.getScoringPreset=Dr;exports.getTexturePattern=En;exports.getVerseRatingLabel=Jo;exports.handleAddCCEvent=Y0;exports.handleRedo=ku;exports.handleRemoveCCEvent=X0;exports.handleSelectCCLane=K0;exports.handleUndo=Su;exports.handleUpdateCCEvent=Z0;exports.hexToHsl=Er;exports.humanizeMidiNotes=hg;exports.hydrateKaraokeDisplayFromBackend=mp;exports.hydratePlayerKaraokeSettingsFromBackend=Ou;exports.hzToUltrastarPitch=mo;exports.importCCLane=Qi;exports.initKaraokeDisplaySettings=yp;exports.instrumentPresets=p0;exports.isAudioContextRunning=Ei;exports.isInLoopRegion=gg;exports.isWebRTCSupported=Qg;exports.loadAllKaraokeSettings=Bu;exports.loadAudioWorkletModule=cc;exports.loadKaraokeDisplaySettings=pl;exports.loadKaraokeSettings=Va;exports.loadRemoteScoringPresets=Du;exports.makeClickReference=ll;exports.makeClipSelectionId=ng;exports.mergeWaveforms=ag;exports.midiSeedGenerator=R0;exports.midiToHz=ga;exports.normalizeHex=$r;exports.openAudioFilePicker=Ng;exports.ornate_L=Ga;exports.ornate_R=Tr;exports.parseLyrics=Ru;exports.parseNotes=Hn;exports.parseUltraStarText=Wo;exports.parseVersesWithSyllables=ho;exports.parseVersesWithWords=Nu;exports.parseVideoMetadata=_o;exports.pasteCCEvents=qi;exports.pill_L=qt;exports.pill_R=zt;exports.preloadTexture=qa;exports.preloadTextures=oh;exports.probeAudioFile=bc;exports.pushCCState=Bi;exports.pushOperation=ay;exports.quantizeMidiNotes=dg;exports.quantizeNotes=oy;exports.quantizeStepInBeats=yc;exports.quantizeStepInSeconds=cs;exports.randomizeVelocity=ac;exports.recordCCEvent=Yi;exports.redoCC=Wi;exports.redoOperation=iy;exports.removeEffectFromLayer=G0;exports.removeMidiNote=q0;exports.renderGlossyBarSvg=Mo;exports.resumeAudioContext=Yt;exports.reversePattern=nc;exports.sampleLFOForDisplay=ro;exports.sampleLFOToCCEvents=no;exports.saveKaraokeDisplaySettings=gp;exports.saveKaraokeSettings=Fu;exports.scaleResult=al;exports.scaleTo10k=rl;exports.scoreNotesWithPitchPoints=tl;exports.selectCCEventsInRange=Vd;exports.serializeLFO=tu;exports.serializePattern=I0;exports.setLoopFromSelection=fg;exports.setProjectWithUndo=co;exports.setStepGate=Ql;exports.setStepNote=Zl;exports.setStepProbability=Jl;exports.setStepVelocity=Xl;exports.sharp_L=hn;exports.sharp_R=pn;exports.shield_L=Rr;exports.shield_R=bo;exports.shiftPattern=rc;exports.shouldTrigger=oc;exports.skewTL_L=hr;exports.skewTL_R=fa;exports.skewTR_L=pa;exports.skewTR_R=pr;exports.snapLoopToGrid=mg;exports.snapTimeToQuantize=Na;exports.snapToGrid=rg;exports.snapToScale=cy;exports.soft_L=Fa;exports.soft_R=vo;exports.stepDuration=is;exports.stepTimeOffset=ic;exports.syncDivisionToHz=eo;exports.tab_L=Ba;exports.tab_R=So;exports.thinCCEvents=Zi;exports.toTrack=Go;exports.toggleEffectBypass=W0;exports.toggleStep=Yl;exports.toggleStepSlide=ec;exports.transposePattern=tc;exports.undoCC=Gi;exports.undoOperation=sy;exports.updateEffectParams=U0;exports.useAudioWorklet=O0;exports.useAutoSave=yu;exports.useCCAutomation=Ji;exports.useCanPickSong=up;exports.useDMXAudioSync=Vg;exports.useDMXEngine=Ug;exports.useEditorTrack=Mu;exports.useKaraokePitch=Qo;exports.useKaraokeScoring=sl;exports.useLocalPlaylists=es;exports.useMPE=y0;exports.useMidiLearn=m0;exports.useNiceTranslation=xe;exports.useOxygen25=b0;exports.usePitchWorker=D0;exports.usePlaybackEngine=vu;exports.useProjectCRUD=ju;exports.useRadioStream=Mc;exports.useRecording=bu;exports.useScoringWorker=z0;exports.useStepSequencer=_0;exports.useWebMidi=Ur;exports.useWorker=os;exports.validateAudioFiles=ds;exports.wave_L=Nr;exports.wave_R=Wa;exports.waveformValue=to;exports.wrapTimeInLoop=yg;