From 9a9275dae51c03e410c74641a009dc18f7389b09 Mon Sep 17 00:00:00 2001 From: floegger Date: Sun, 17 May 2026 00:04:52 +0200 Subject: [PATCH] update ui --- .../{index-CanNU2CV.js => index-D7ESsBgL.js} | 10 +- audiocontrol/dist/assets/index-DqwSTyl8.css | 1 - audiocontrol/dist/assets/index-SAHpcFVS.css | 1 + audiocontrol/dist/index.html | 4 +- .../node_modules/.vite/deps/_metadata.json | 46 ++ .../chunk-373CG7ZK.js | 0 .../chunk-373CG7ZK.js.map | 0 .../chunk-REFQX4J5.js | 0 .../chunk-REFQX4J5.js.map | 0 .../{deps_temp_23962ec5 => deps}/package.json | 0 .../{deps_temp_23962ec5 => deps}/react-dom.js | 0 .../react-dom.js.map | 0 .../react-dom_client.js | 0 .../react-dom_client.js.map | 0 .../{deps_temp_23962ec5 => deps}/react.js | 0 .../{deps_temp_23962ec5 => deps}/react.js.map | 0 .../react_jsx-dev-runtime.js | 0 .../react_jsx-dev-runtime.js.map | 0 .../react_jsx-runtime.js | 0 .../react_jsx-runtime.js.map | 0 audiocontrol/src/App.css | 553 +++++++++++++++++- audiocontrol/src/App.jsx | 7 +- audiocontrol/src/hooks/useArtworkTheme.js | 10 + mopidy/mopidy.conf | 2 +- scripts/snapcast-now-playing.py | 15 +- snapserver/Dockerfile | 3 +- 26 files changed, 618 insertions(+), 34 deletions(-) rename audiocontrol/dist/assets/{index-CanNU2CV.js => index-D7ESsBgL.js} (86%) delete mode 100644 audiocontrol/dist/assets/index-DqwSTyl8.css create mode 100644 audiocontrol/dist/assets/index-SAHpcFVS.css create mode 100644 audiocontrol/node_modules/.vite/deps/_metadata.json rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/chunk-373CG7ZK.js (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/chunk-373CG7ZK.js.map (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/chunk-REFQX4J5.js (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/chunk-REFQX4J5.js.map (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/package.json (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/react-dom.js (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/react-dom.js.map (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/react-dom_client.js (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/react-dom_client.js.map (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/react.js (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/react.js.map (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/react_jsx-dev-runtime.js (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/react_jsx-dev-runtime.js.map (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/react_jsx-runtime.js (100%) rename audiocontrol/node_modules/.vite/{deps_temp_23962ec5 => deps}/react_jsx-runtime.js.map (100%) diff --git a/audiocontrol/dist/assets/index-CanNU2CV.js b/audiocontrol/dist/assets/index-D7ESsBgL.js similarity index 86% rename from audiocontrol/dist/assets/index-CanNU2CV.js rename to audiocontrol/dist/assets/index-D7ESsBgL.js index 16012be..823f627 100644 --- a/audiocontrol/dist/assets/index-CanNU2CV.js +++ b/audiocontrol/dist/assets/index-D7ESsBgL.js @@ -22,7 +22,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */(function(e){function t(P,k){var L=P.length;P.push(k);e:for(;0>>1,U=P[R];if(0>>1;Rl(ft,L))etl(Qe,ft)?(P[R]=Qe,P[et]=L,R=et):(P[R]=ft,P[Se]=L,R=Se);else if(etl(Qe,L))P[R]=Qe,P[et]=L,R=et;else break e}}return k}function l(P,k){var L=P.sortIndex-k.sortIndex;return L!==0?L:P.id-k.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var i=Date,o=i.now();e.unstable_now=function(){return i.now()-o}}var u=[],c=[],f=1,p=null,h=3,g=!1,x=!1,w=!1,S=typeof setTimeout=="function"?setTimeout:null,v=typeof clearTimeout=="function"?clearTimeout:null,d=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function m(P){for(var k=n(c);k!==null;){if(k.callback===null)r(c);else if(k.startTime<=P)r(c),k.sortIndex=k.expirationTime,t(u,k);else break;k=n(c)}}function y(P){if(w=!1,m(P),!x)if(n(u)!==null)x=!0,F(N);else{var k=n(c);k!==null&&ke(y,k.startTime-P)}}function N(P,k){x=!1,w&&(w=!1,v(M),M=-1),g=!0;var L=h;try{for(m(k),p=n(u);p!==null&&(!(p.expirationTime>k)||P&&!ie());){var R=p.callback;if(typeof R=="function"){p.callback=null,h=p.priorityLevel;var U=R(p.expirationTime<=k);k=e.unstable_now(),typeof U=="function"?p.callback=U:p===n(u)&&r(u),m(k)}else r(u);p=n(u)}if(p!==null)var Le=!0;else{var Se=n(c);Se!==null&&ke(y,Se.startTime-k),Le=!1}return Le}finally{p=null,h=L,g=!1}}var E=!1,_=null,M=-1,A=5,z=-1;function ie(){return!(e.unstable_now()-zP||125R?(P.sortIndex=L,t(c,P),n(u)===null&&P===n(c)&&(w?(v(M),M=-1):w=!0,ke(y,L-R))):(P.sortIndex=U,t(u,P),x||g||(x=!0,F(N))),P},e.unstable_shouldYield=ie,e.unstable_wrapCallback=function(P){var k=h;return function(){var L=h;h=k;try{return P.apply(this,arguments)}finally{h=L}}}})(zu);Ru.exports=zu;var ld=Ru.exports;/** + */(function(e){function t(P,k){var L=P.length;P.push(k);e:for(;0>>1,U=P[R];if(0>>1;Rl(mt,L))ttl(qe,mt)?(P[R]=qe,P[tt]=L,R=tt):(P[R]=mt,P[Se]=L,R=Se);else if(ttl(qe,L))P[R]=qe,P[tt]=L,R=tt;else break e}}return k}function l(P,k){var L=P.sortIndex-k.sortIndex;return L!==0?L:P.id-k.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var i=Date,o=i.now();e.unstable_now=function(){return i.now()-o}}var u=[],c=[],f=1,p=null,h=3,g=!1,x=!1,w=!1,S=typeof setTimeout=="function"?setTimeout:null,v=typeof clearTimeout=="function"?clearTimeout:null,d=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function m(P){for(var k=n(c);k!==null;){if(k.callback===null)r(c);else if(k.startTime<=P)r(c),k.sortIndex=k.expirationTime,t(u,k);else break;k=n(c)}}function y(P){if(w=!1,m(P),!x)if(n(u)!==null)x=!0,F(N);else{var k=n(c);k!==null&&ke(y,k.startTime-P)}}function N(P,k){x=!1,w&&(w=!1,v(M),M=-1),g=!0;var L=h;try{for(m(k),p=n(u);p!==null&&(!(p.expirationTime>k)||P&&!ie());){var R=p.callback;if(typeof R=="function"){p.callback=null,h=p.priorityLevel;var U=R(p.expirationTime<=k);k=e.unstable_now(),typeof U=="function"?p.callback=U:p===n(u)&&r(u),m(k)}else r(u);p=n(u)}if(p!==null)var Le=!0;else{var Se=n(c);Se!==null&&ke(y,Se.startTime-k),Le=!1}return Le}finally{p=null,h=L,g=!1}}var E=!1,_=null,M=-1,A=5,z=-1;function ie(){return!(e.unstable_now()-zP||125R?(P.sortIndex=L,t(c,P),n(u)===null&&P===n(c)&&(w?(v(M),M=-1):w=!0,ke(y,L-R))):(P.sortIndex=U,t(u,P),x||g||(x=!0,F(N))),P},e.unstable_shouldYield=ie,e.unstable_wrapCallback=function(P){var k=h;return function(){var L=h;h=k;try{return P.apply(this,arguments)}finally{h=L}}}})(zu);Ru.exports=zu;var ld=Ru.exports;/** * @license React * react-dom.production.min.js * @@ -30,11 +30,11 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var sd=j,_e=ld;function C(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),vs=Object.prototype.hasOwnProperty,id=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ao={},co={};function od(e){return vs.call(co,e)?!0:vs.call(ao,e)?!1:id.test(e)?co[e]=!0:(ao[e]=!0,!1)}function ud(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function ad(e,t,n,r){if(t===null||typeof t>"u"||ud(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function he(e,t,n,r,l,s,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=s,this.removeEmptyString=i}var se={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){se[e]=new he(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];se[t]=new he(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){se[e]=new he(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){se[e]=new he(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){se[e]=new he(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){se[e]=new he(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){se[e]=new he(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){se[e]=new he(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){se[e]=new he(e,5,!1,e.toLowerCase(),null,!1,!1)});var hi=/[\-:]([a-z])/g;function vi(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(hi,vi);se[t]=new he(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(hi,vi);se[t]=new he(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(hi,vi);se[t]=new he(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){se[e]=new he(e,1,!1,e.toLowerCase(),null,!1,!1)});se.xlinkHref=new he("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){se[e]=new he(e,1,!1,e.toLowerCase(),null,!0,!0)});function gi(e,t,n,r){var l=se.hasOwnProperty(t)?se[t]:null;(l!==null?l.type!==0:r||!(2"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),vs=Object.prototype.hasOwnProperty,id=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ao={},co={};function od(e){return vs.call(co,e)?!0:vs.call(ao,e)?!1:id.test(e)?co[e]=!0:(ao[e]=!0,!1)}function ud(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function ad(e,t,n,r){if(t===null||typeof t>"u"||ud(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function he(e,t,n,r,l,s,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=s,this.removeEmptyString=i}var se={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){se[e]=new he(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];se[t]=new he(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){se[e]=new he(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){se[e]=new he(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){se[e]=new he(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){se[e]=new he(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){se[e]=new he(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){se[e]=new he(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){se[e]=new he(e,5,!1,e.toLowerCase(),null,!1,!1)});var hi=/[\-:]([a-z])/g;function vi(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(hi,vi);se[t]=new he(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(hi,vi);se[t]=new he(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(hi,vi);se[t]=new he(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){se[e]=new he(e,1,!1,e.toLowerCase(),null,!1,!1)});se.xlinkHref=new he("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){se[e]=new he(e,1,!1,e.toLowerCase(),null,!0,!0)});function gi(e,t,n,r){var l=se.hasOwnProperty(t)?se[t]:null;(l!==null?l.type!==0:r||!(2o||l[i]!==s[o]){var u=` -`+l[i].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}while(1<=i&&0<=o);break}}}finally{Vl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?$n(e):""}function cd(e){switch(e.tag){case 5:return $n(e.type);case 16:return $n("Lazy");case 13:return $n("Suspense");case 19:return $n("SuspenseList");case 0:case 2:case 15:return e=Hl(e.type,!1),e;case 11:return e=Hl(e.type.render,!1),e;case 1:return e=Hl(e.type,!0),e;default:return""}}function xs(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Jt:return"Fragment";case Zt:return"Portal";case gs:return"Profiler";case yi:return"StrictMode";case ys:return"Suspense";case ws:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case $u:return(e.displayName||"Context")+".Consumer";case Ou:return(e._context.displayName||"Context")+".Provider";case wi:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case xi:return t=e.displayName||null,t!==null?t:xs(e.type)||"Memo";case mt:t=e._payload,e=e._init;try{return xs(e(t))}catch{}}return null}function dd(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return xs(t);case 8:return t===yi?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Pt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Du(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function fd(e){var t=Du(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,s=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(i){r=""+i,s.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Sr(e){e._valueTracker||(e._valueTracker=fd(e))}function Au(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Du(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Jr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function ks(e,t){var n=t.checked;return K({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function po(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=Pt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Uu(e,t){t=t.checked,t!=null&&gi(e,"checked",t,!1)}function Ss(e,t){Uu(e,t);var n=Pt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ns(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ns(e,t.type,Pt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function mo(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ns(e,t,n){(t!=="number"||Jr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Fn=Array.isArray;function cn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Nr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Jn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Bn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},pd=["Webkit","ms","Moz","O"];Object.keys(Bn).forEach(function(e){pd.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Bn[t]=Bn[e]})});function Wu(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Bn.hasOwnProperty(e)&&Bn[e]?(""+t).trim():t+"px"}function Qu(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=Wu(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var md=K({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Es(e,t){if(t){if(md[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(C(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(C(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(C(61))}if(t.style!=null&&typeof t.style!="object")throw Error(C(62))}}function _s(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ps=null;function ki(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Ts=null,dn=null,fn=null;function go(e){if(e=yr(e)){if(typeof Ts!="function")throw Error(C(280));var t=e.stateNode;t&&(t=Pl(t),Ts(e.stateNode,e.type,t))}}function qu(e){dn?fn?fn.push(e):fn=[e]:dn=e}function Gu(){if(dn){var e=dn,t=fn;if(fn=dn=null,go(e),t)for(e=0;e>>=0,e===0?32:31-(Cd(e)/Ed|0)|0}var jr=64,Cr=4194304;function Dn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function nl(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,s=e.pingedLanes,i=n&268435455;if(i!==0){var o=i&~l;o!==0?r=Dn(o):(s&=i,s!==0&&(r=Dn(s)))}else i=n&~l,i!==0?r=Dn(i):s!==0&&(r=Dn(s));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,s=t&-t,l>=s||l===16&&(s&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function vr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ve(t),e[t]=n}function Md(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Hn),Eo=" ",_o=!1;function pa(e,t){switch(e){case"keyup":return lf.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ma(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var bt=!1;function of(e,t){switch(e){case"compositionend":return ma(t);case"keypress":return t.which!==32?null:(_o=!0,Eo);case"textInput":return e=t.data,e===Eo&&_o?null:e;default:return null}}function uf(e,t){if(bt)return e==="compositionend"||!Ti&&pa(e,t)?(e=da(),Br=Ei=yt=null,bt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Lo(n)}}function ya(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ya(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function wa(){for(var e=window,t=Jr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Jr(e.document)}return t}function Mi(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function gf(e){var t=wa(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&ya(n.ownerDocument.documentElement,n)){if(r!==null&&Mi(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,s=Math.min(r.start,l);r=r.end===void 0?s:Math.min(r.end,l),!e.extend&&s>r&&(l=r,r=s,s=l),l=Ro(n,s);var i=Ro(n,r);l&&i&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),s>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,en=null,Os=null,Qn=null,$s=!1;function zo(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;$s||en==null||en!==Jr(r)||(r=en,"selectionStart"in r&&Mi(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Qn&&lr(Qn,r)||(Qn=r,r=sl(Os,"onSelect"),0rn||(e.current=Vs[rn],Vs[rn]=null,rn--)}function V(e,t){rn++,Vs[rn]=e.current,e.current=t}var Tt={},de=Lt(Tt),ye=Lt(!1),Vt=Tt;function gn(e,t){var n=e.type.contextTypes;if(!n)return Tt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},s;for(s in n)l[s]=t[s];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function we(e){return e=e.childContextTypes,e!=null}function ol(){W(ye),W(de)}function Uo(e,t,n){if(de.current!==Tt)throw Error(C(168));V(de,t),V(ye,n)}function Pa(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(C(108,dd(e)||"Unknown",l));return K({},n,r)}function ul(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Tt,Vt=de.current,V(de,e),V(ye,ye.current),!0}function Bo(e,t,n){var r=e.stateNode;if(!r)throw Error(C(169));n?(e=Pa(e,t,Vt),r.__reactInternalMemoizedMergedChildContext=e,W(ye),W(de),V(de,e)):W(ye),V(ye,n)}var rt=null,Tl=!1,rs=!1;function Ta(e){rt===null?rt=[e]:rt.push(e)}function Tf(e){Tl=!0,Ta(e)}function Rt(){if(!rs&&rt!==null){rs=!0;var e=0,t=B;try{var n=rt;for(B=1;e>=i,l-=i,lt=1<<32-Ve(t)+l|n<M?(A=_,_=null):A=_.sibling;var z=h(v,_,m[M],y);if(z===null){_===null&&(_=A);break}e&&_&&z.alternate===null&&t(v,_),d=s(z,d,M),E===null?N=z:E.sibling=z,E=z,_=A}if(M===m.length)return n(v,_),Q&&Ot(v,M),N;if(_===null){for(;MM?(A=_,_=null):A=_.sibling;var ie=h(v,_,z.value,y);if(ie===null){_===null&&(_=A);break}e&&_&&ie.alternate===null&&t(v,_),d=s(ie,d,M),E===null?N=ie:E.sibling=ie,E=ie,_=A}if(z.done)return n(v,_),Q&&Ot(v,M),N;if(_===null){for(;!z.done;M++,z=m.next())z=p(v,z.value,y),z!==null&&(d=s(z,d,M),E===null?N=z:E.sibling=z,E=z);return Q&&Ot(v,M),N}for(_=r(v,_);!z.done;M++,z=m.next())z=g(_,v,M,z.value,y),z!==null&&(e&&z.alternate!==null&&_.delete(z.key===null?M:z.key),d=s(z,d,M),E===null?N=z:E.sibling=z,E=z);return e&&_.forEach(function(Me){return t(v,Me)}),Q&&Ot(v,M),N}function S(v,d,m,y){if(typeof m=="object"&&m!==null&&m.type===Jt&&m.key===null&&(m=m.props.children),typeof m=="object"&&m!==null){switch(m.$$typeof){case kr:e:{for(var N=m.key,E=d;E!==null;){if(E.key===N){if(N=m.type,N===Jt){if(E.tag===7){n(v,E.sibling),d=l(E,m.props.children),d.return=v,v=d;break e}}else if(E.elementType===N||typeof N=="object"&&N!==null&&N.$$typeof===mt&&Wo(N)===E.type){n(v,E.sibling),d=l(E,m.props),d.ref=Rn(v,E,m),d.return=v,v=d;break e}n(v,E);break}else t(v,E);E=E.sibling}m.type===Jt?(d=Bt(m.props.children,v.mode,y,m.key),d.return=v,v=d):(y=Yr(m.type,m.key,m.props,null,v.mode,y),y.ref=Rn(v,d,m),y.return=v,v=y)}return i(v);case Zt:e:{for(E=m.key;d!==null;){if(d.key===E)if(d.tag===4&&d.stateNode.containerInfo===m.containerInfo&&d.stateNode.implementation===m.implementation){n(v,d.sibling),d=l(d,m.children||[]),d.return=v,v=d;break e}else{n(v,d);break}else t(v,d);d=d.sibling}d=ds(m,v.mode,y),d.return=v,v=d}return i(v);case mt:return E=m._init,S(v,d,E(m._payload),y)}if(Fn(m))return x(v,d,m,y);if(_n(m))return w(v,d,m,y);Rr(v,m)}return typeof m=="string"&&m!==""||typeof m=="number"?(m=""+m,d!==null&&d.tag===6?(n(v,d.sibling),d=l(d,m),d.return=v,v=d):(n(v,d),d=cs(m,v.mode,y),d.return=v,v=d),i(v)):n(v,d)}return S}var wn=za(!0),Ia=za(!1),dl=Lt(null),fl=null,on=null,Ii=null;function Oi(){Ii=on=fl=null}function $i(e){var t=dl.current;W(dl),e._currentValue=t}function Qs(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function mn(e,t){fl=e,Ii=on=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(ge=!0),e.firstContext=null)}function $e(e){var t=e._currentValue;if(Ii!==e)if(e={context:e,memoizedValue:t,next:null},on===null){if(fl===null)throw Error(C(308));on=e,fl.dependencies={lanes:0,firstContext:e}}else on=on.next=e;return t}var Dt=null;function Fi(e){Dt===null?Dt=[e]:Dt.push(e)}function Oa(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,Fi(t)):(n.next=l.next,l.next=n),t.interleaved=n,at(e,r)}function at(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var ht=!1;function Di(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function $a(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function it(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function jt(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,D&2){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,at(e,n)}return l=r.interleaved,l===null?(t.next=t,Fi(r)):(t.next=l.next,l.next=t),r.interleaved=t,at(e,n)}function Hr(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ni(e,n)}}function Qo(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,s=null;if(n=n.firstBaseUpdate,n!==null){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};s===null?l=s=i:s=s.next=i,n=n.next}while(n!==null);s===null?l=s=t:s=s.next=t}else l=s=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:s,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function pl(e,t,n,r){var l=e.updateQueue;ht=!1;var s=l.firstBaseUpdate,i=l.lastBaseUpdate,o=l.shared.pending;if(o!==null){l.shared.pending=null;var u=o,c=u.next;u.next=null,i===null?s=c:i.next=c,i=u;var f=e.alternate;f!==null&&(f=f.updateQueue,o=f.lastBaseUpdate,o!==i&&(o===null?f.firstBaseUpdate=c:o.next=c,f.lastBaseUpdate=u))}if(s!==null){var p=l.baseState;i=0,f=c=u=null,o=s;do{var h=o.lane,g=o.eventTime;if((r&h)===h){f!==null&&(f=f.next={eventTime:g,lane:0,tag:o.tag,payload:o.payload,callback:o.callback,next:null});e:{var x=e,w=o;switch(h=t,g=n,w.tag){case 1:if(x=w.payload,typeof x=="function"){p=x.call(g,p,h);break e}p=x;break e;case 3:x.flags=x.flags&-65537|128;case 0:if(x=w.payload,h=typeof x=="function"?x.call(g,p,h):x,h==null)break e;p=K({},p,h);break e;case 2:ht=!0}}o.callback!==null&&o.lane!==0&&(e.flags|=64,h=l.effects,h===null?l.effects=[o]:h.push(o))}else g={eventTime:g,lane:h,tag:o.tag,payload:o.payload,callback:o.callback,next:null},f===null?(c=f=g,u=p):f=f.next=g,i|=h;if(o=o.next,o===null){if(o=l.shared.pending,o===null)break;h=o,o=h.next,h.next=null,l.lastBaseUpdate=h,l.shared.pending=null}}while(!0);if(f===null&&(u=p),l.baseState=u,l.firstBaseUpdate=c,l.lastBaseUpdate=f,t=l.shared.interleaved,t!==null){l=t;do i|=l.lane,l=l.next;while(l!==t)}else s===null&&(l.shared.lanes=0);Qt|=i,e.lanes=i,e.memoizedState=p}}function qo(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=ss.transition;ss.transition={};try{e(!1),t()}finally{B=n,ss.transition=r}}function ba(){return Fe().memoizedState}function zf(e,t,n){var r=Et(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},ec(e))tc(t,n);else if(n=Oa(e,t,n,r),n!==null){var l=pe();He(n,e,r,l),nc(n,t,r)}}function If(e,t,n){var r=Et(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(ec(e))tc(t,l);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var i=t.lastRenderedState,o=s(i,n);if(l.hasEagerState=!0,l.eagerState=o,We(o,i)){var u=t.interleaved;u===null?(l.next=l,Fi(t)):(l.next=u.next,u.next=l),t.interleaved=l;return}}catch{}finally{}n=Oa(e,t,l,r),n!==null&&(l=pe(),He(n,e,r,l),nc(n,t,r))}}function ec(e){var t=e.alternate;return e===G||t!==null&&t===G}function tc(e,t){qn=hl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function nc(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ni(e,n)}}var vl={readContext:$e,useCallback:oe,useContext:oe,useEffect:oe,useImperativeHandle:oe,useInsertionEffect:oe,useLayoutEffect:oe,useMemo:oe,useReducer:oe,useRef:oe,useState:oe,useDebugValue:oe,useDeferredValue:oe,useTransition:oe,useMutableSource:oe,useSyncExternalStore:oe,useId:oe,unstable_isNewReconciler:!1},Of={readContext:$e,useCallback:function(e,t){return Ke().memoizedState=[e,t===void 0?null:t],e},useContext:$e,useEffect:Ko,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Qr(4194308,4,Ka.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Qr(4194308,4,e,t)},useInsertionEffect:function(e,t){return Qr(4,2,e,t)},useMemo:function(e,t){var n=Ke();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ke();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=zf.bind(null,G,e),[r.memoizedState,e]},useRef:function(e){var t=Ke();return e={current:e},t.memoizedState=e},useState:Go,useDebugValue:qi,useDeferredValue:function(e){return Ke().memoizedState=e},useTransition:function(){var e=Go(!1),t=e[0];return e=Rf.bind(null,e[1]),Ke().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=G,l=Ke();if(Q){if(n===void 0)throw Error(C(407));n=n()}else{if(n=t(),te===null)throw Error(C(349));Wt&30||Ua(r,t,n)}l.memoizedState=n;var s={value:n,getSnapshot:t};return l.queue=s,Ko(Va.bind(null,r,s,e),[e]),r.flags|=2048,fr(9,Ba.bind(null,r,s,n,t),void 0,null),n},useId:function(){var e=Ke(),t=te.identifierPrefix;if(Q){var n=st,r=lt;n=(r&~(1<<32-Ve(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=cr++,0")&&(u=u.replace("",e.displayName)),u}while(1<=i&&0<=o);break}}}finally{Vl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?$n(e):""}function cd(e){switch(e.tag){case 5:return $n(e.type);case 16:return $n("Lazy");case 13:return $n("Suspense");case 19:return $n("SuspenseList");case 0:case 2:case 15:return e=Hl(e.type,!1),e;case 11:return e=Hl(e.type.render,!1),e;case 1:return e=Hl(e.type,!0),e;default:return""}}function xs(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Jt:return"Fragment";case Zt:return"Portal";case gs:return"Profiler";case yi:return"StrictMode";case ys:return"Suspense";case ws:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case $u:return(e.displayName||"Context")+".Consumer";case Ou:return(e._context.displayName||"Context")+".Provider";case wi:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case xi:return t=e.displayName||null,t!==null?t:xs(e.type)||"Memo";case vt:t=e._payload,e=e._init;try{return xs(e(t))}catch{}}return null}function dd(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return xs(t);case 8:return t===yi?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Mt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Du(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function fd(e){var t=Du(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,s=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(i){r=""+i,s.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Sr(e){e._valueTracker||(e._valueTracker=fd(e))}function Au(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Du(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Jr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function ks(e,t){var n=t.checked;return K({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function po(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=Mt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Uu(e,t){t=t.checked,t!=null&&gi(e,"checked",t,!1)}function Ss(e,t){Uu(e,t);var n=Mt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ns(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ns(e,t.type,Mt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function mo(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ns(e,t,n){(t!=="number"||Jr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Fn=Array.isArray;function cn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Nr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Jn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Bn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},pd=["Webkit","ms","Moz","O"];Object.keys(Bn).forEach(function(e){pd.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Bn[t]=Bn[e]})});function Wu(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Bn.hasOwnProperty(e)&&Bn[e]?(""+t).trim():t+"px"}function Qu(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=Wu(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var md=K({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Es(e,t){if(t){if(md[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(C(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(C(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(C(61))}if(t.style!=null&&typeof t.style!="object")throw Error(C(62))}}function _s(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ps=null;function ki(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Ts=null,dn=null,fn=null;function go(e){if(e=yr(e)){if(typeof Ts!="function")throw Error(C(280));var t=e.stateNode;t&&(t=Pl(t),Ts(e.stateNode,e.type,t))}}function qu(e){dn?fn?fn.push(e):fn=[e]:dn=e}function Gu(){if(dn){var e=dn,t=fn;if(fn=dn=null,go(e),t)for(e=0;e>>=0,e===0?32:31-(Cd(e)/Ed|0)|0}var jr=64,Cr=4194304;function Dn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function nl(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,s=e.pingedLanes,i=n&268435455;if(i!==0){var o=i&~l;o!==0?r=Dn(o):(s&=i,s!==0&&(r=Dn(s)))}else i=n&~l,i!==0?r=Dn(i):s!==0&&(r=Dn(s));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,s=t&-t,l>=s||l===16&&(s&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function vr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-He(t),e[t]=n}function Md(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Hn),Eo=" ",_o=!1;function pa(e,t){switch(e){case"keyup":return lf.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ma(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var bt=!1;function of(e,t){switch(e){case"compositionend":return ma(t);case"keypress":return t.which!==32?null:(_o=!0,Eo);case"textInput":return e=t.data,e===Eo&&_o?null:e;default:return null}}function uf(e,t){if(bt)return e==="compositionend"||!Ti&&pa(e,t)?(e=da(),Br=Ei=xt=null,bt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Lo(n)}}function ya(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ya(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function wa(){for(var e=window,t=Jr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Jr(e.document)}return t}function Mi(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function gf(e){var t=wa(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&ya(n.ownerDocument.documentElement,n)){if(r!==null&&Mi(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,s=Math.min(r.start,l);r=r.end===void 0?s:Math.min(r.end,l),!e.extend&&s>r&&(l=r,r=s,s=l),l=Ro(n,s);var i=Ro(n,r);l&&i&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),s>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,en=null,Os=null,Qn=null,$s=!1;function zo(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;$s||en==null||en!==Jr(r)||(r=en,"selectionStart"in r&&Mi(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Qn&&lr(Qn,r)||(Qn=r,r=sl(Os,"onSelect"),0rn||(e.current=Vs[rn],Vs[rn]=null,rn--)}function V(e,t){rn++,Vs[rn]=e.current,e.current=t}var Lt={},de=zt(Lt),ye=zt(!1),Vt=Lt;function gn(e,t){var n=e.type.contextTypes;if(!n)return Lt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},s;for(s in n)l[s]=t[s];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function we(e){return e=e.childContextTypes,e!=null}function ol(){W(ye),W(de)}function Uo(e,t,n){if(de.current!==Lt)throw Error(C(168));V(de,t),V(ye,n)}function Pa(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(C(108,dd(e)||"Unknown",l));return K({},n,r)}function ul(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Lt,Vt=de.current,V(de,e),V(ye,ye.current),!0}function Bo(e,t,n){var r=e.stateNode;if(!r)throw Error(C(169));n?(e=Pa(e,t,Vt),r.__reactInternalMemoizedMergedChildContext=e,W(ye),W(de),V(de,e)):W(ye),V(ye,n)}var st=null,Tl=!1,rs=!1;function Ta(e){st===null?st=[e]:st.push(e)}function Tf(e){Tl=!0,Ta(e)}function It(){if(!rs&&st!==null){rs=!0;var e=0,t=B;try{var n=st;for(B=1;e>=i,l-=i,it=1<<32-He(t)+l|n<M?(A=_,_=null):A=_.sibling;var z=h(v,_,m[M],y);if(z===null){_===null&&(_=A);break}e&&_&&z.alternate===null&&t(v,_),d=s(z,d,M),E===null?N=z:E.sibling=z,E=z,_=A}if(M===m.length)return n(v,_),Q&&Ot(v,M),N;if(_===null){for(;MM?(A=_,_=null):A=_.sibling;var ie=h(v,_,z.value,y);if(ie===null){_===null&&(_=A);break}e&&_&&ie.alternate===null&&t(v,_),d=s(ie,d,M),E===null?N=ie:E.sibling=ie,E=ie,_=A}if(z.done)return n(v,_),Q&&Ot(v,M),N;if(_===null){for(;!z.done;M++,z=m.next())z=p(v,z.value,y),z!==null&&(d=s(z,d,M),E===null?N=z:E.sibling=z,E=z);return Q&&Ot(v,M),N}for(_=r(v,_);!z.done;M++,z=m.next())z=g(_,v,M,z.value,y),z!==null&&(e&&z.alternate!==null&&_.delete(z.key===null?M:z.key),d=s(z,d,M),E===null?N=z:E.sibling=z,E=z);return e&&_.forEach(function(Me){return t(v,Me)}),Q&&Ot(v,M),N}function S(v,d,m,y){if(typeof m=="object"&&m!==null&&m.type===Jt&&m.key===null&&(m=m.props.children),typeof m=="object"&&m!==null){switch(m.$$typeof){case kr:e:{for(var N=m.key,E=d;E!==null;){if(E.key===N){if(N=m.type,N===Jt){if(E.tag===7){n(v,E.sibling),d=l(E,m.props.children),d.return=v,v=d;break e}}else if(E.elementType===N||typeof N=="object"&&N!==null&&N.$$typeof===vt&&Wo(N)===E.type){n(v,E.sibling),d=l(E,m.props),d.ref=Rn(v,E,m),d.return=v,v=d;break e}n(v,E);break}else t(v,E);E=E.sibling}m.type===Jt?(d=Bt(m.props.children,v.mode,y,m.key),d.return=v,v=d):(y=Yr(m.type,m.key,m.props,null,v.mode,y),y.ref=Rn(v,d,m),y.return=v,v=y)}return i(v);case Zt:e:{for(E=m.key;d!==null;){if(d.key===E)if(d.tag===4&&d.stateNode.containerInfo===m.containerInfo&&d.stateNode.implementation===m.implementation){n(v,d.sibling),d=l(d,m.children||[]),d.return=v,v=d;break e}else{n(v,d);break}else t(v,d);d=d.sibling}d=ds(m,v.mode,y),d.return=v,v=d}return i(v);case vt:return E=m._init,S(v,d,E(m._payload),y)}if(Fn(m))return x(v,d,m,y);if(_n(m))return w(v,d,m,y);Rr(v,m)}return typeof m=="string"&&m!==""||typeof m=="number"?(m=""+m,d!==null&&d.tag===6?(n(v,d.sibling),d=l(d,m),d.return=v,v=d):(n(v,d),d=cs(m,v.mode,y),d.return=v,v=d),i(v)):n(v,d)}return S}var wn=za(!0),Ia=za(!1),dl=zt(null),fl=null,on=null,Ii=null;function Oi(){Ii=on=fl=null}function $i(e){var t=dl.current;W(dl),e._currentValue=t}function Qs(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function mn(e,t){fl=e,Ii=on=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(ge=!0),e.firstContext=null)}function Fe(e){var t=e._currentValue;if(Ii!==e)if(e={context:e,memoizedValue:t,next:null},on===null){if(fl===null)throw Error(C(308));on=e,fl.dependencies={lanes:0,firstContext:e}}else on=on.next=e;return t}var Dt=null;function Fi(e){Dt===null?Dt=[e]:Dt.push(e)}function Oa(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,Fi(t)):(n.next=l.next,l.next=n),t.interleaved=n,dt(e,r)}function dt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var gt=!1;function Di(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function $a(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function ut(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Et(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,D&2){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,dt(e,n)}return l=r.interleaved,l===null?(t.next=t,Fi(r)):(t.next=l.next,l.next=t),r.interleaved=t,dt(e,n)}function Hr(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ni(e,n)}}function Qo(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,s=null;if(n=n.firstBaseUpdate,n!==null){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};s===null?l=s=i:s=s.next=i,n=n.next}while(n!==null);s===null?l=s=t:s=s.next=t}else l=s=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:s,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function pl(e,t,n,r){var l=e.updateQueue;gt=!1;var s=l.firstBaseUpdate,i=l.lastBaseUpdate,o=l.shared.pending;if(o!==null){l.shared.pending=null;var u=o,c=u.next;u.next=null,i===null?s=c:i.next=c,i=u;var f=e.alternate;f!==null&&(f=f.updateQueue,o=f.lastBaseUpdate,o!==i&&(o===null?f.firstBaseUpdate=c:o.next=c,f.lastBaseUpdate=u))}if(s!==null){var p=l.baseState;i=0,f=c=u=null,o=s;do{var h=o.lane,g=o.eventTime;if((r&h)===h){f!==null&&(f=f.next={eventTime:g,lane:0,tag:o.tag,payload:o.payload,callback:o.callback,next:null});e:{var x=e,w=o;switch(h=t,g=n,w.tag){case 1:if(x=w.payload,typeof x=="function"){p=x.call(g,p,h);break e}p=x;break e;case 3:x.flags=x.flags&-65537|128;case 0:if(x=w.payload,h=typeof x=="function"?x.call(g,p,h):x,h==null)break e;p=K({},p,h);break e;case 2:gt=!0}}o.callback!==null&&o.lane!==0&&(e.flags|=64,h=l.effects,h===null?l.effects=[o]:h.push(o))}else g={eventTime:g,lane:h,tag:o.tag,payload:o.payload,callback:o.callback,next:null},f===null?(c=f=g,u=p):f=f.next=g,i|=h;if(o=o.next,o===null){if(o=l.shared.pending,o===null)break;h=o,o=h.next,h.next=null,l.lastBaseUpdate=h,l.shared.pending=null}}while(!0);if(f===null&&(u=p),l.baseState=u,l.firstBaseUpdate=c,l.lastBaseUpdate=f,t=l.shared.interleaved,t!==null){l=t;do i|=l.lane,l=l.next;while(l!==t)}else s===null&&(l.shared.lanes=0);Qt|=i,e.lanes=i,e.memoizedState=p}}function qo(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=ss.transition;ss.transition={};try{e(!1),t()}finally{B=n,ss.transition=r}}function ba(){return De().memoizedState}function zf(e,t,n){var r=Pt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},ec(e))tc(t,n);else if(n=Oa(e,t,n,r),n!==null){var l=pe();We(n,e,r,l),nc(n,t,r)}}function If(e,t,n){var r=Pt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(ec(e))tc(t,l);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var i=t.lastRenderedState,o=s(i,n);if(l.hasEagerState=!0,l.eagerState=o,Qe(o,i)){var u=t.interleaved;u===null?(l.next=l,Fi(t)):(l.next=u.next,u.next=l),t.interleaved=l;return}}catch{}finally{}n=Oa(e,t,l,r),n!==null&&(l=pe(),We(n,e,r,l),nc(n,t,r))}}function ec(e){var t=e.alternate;return e===G||t!==null&&t===G}function tc(e,t){qn=hl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function nc(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ni(e,n)}}var vl={readContext:Fe,useCallback:oe,useContext:oe,useEffect:oe,useImperativeHandle:oe,useInsertionEffect:oe,useLayoutEffect:oe,useMemo:oe,useReducer:oe,useRef:oe,useState:oe,useDebugValue:oe,useDeferredValue:oe,useTransition:oe,useMutableSource:oe,useSyncExternalStore:oe,useId:oe,unstable_isNewReconciler:!1},Of={readContext:Fe,useCallback:function(e,t){return Ye().memoizedState=[e,t===void 0?null:t],e},useContext:Fe,useEffect:Ko,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Qr(4194308,4,Ka.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Qr(4194308,4,e,t)},useInsertionEffect:function(e,t){return Qr(4,2,e,t)},useMemo:function(e,t){var n=Ye();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ye();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=zf.bind(null,G,e),[r.memoizedState,e]},useRef:function(e){var t=Ye();return e={current:e},t.memoizedState=e},useState:Go,useDebugValue:qi,useDeferredValue:function(e){return Ye().memoizedState=e},useTransition:function(){var e=Go(!1),t=e[0];return e=Rf.bind(null,e[1]),Ye().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=G,l=Ye();if(Q){if(n===void 0)throw Error(C(407));n=n()}else{if(n=t(),te===null)throw Error(C(349));Wt&30||Ua(r,t,n)}l.memoizedState=n;var s={value:n,getSnapshot:t};return l.queue=s,Ko(Va.bind(null,r,s,e),[e]),r.flags|=2048,fr(9,Ba.bind(null,r,s,n,t),void 0,null),n},useId:function(){var e=Ye(),t=te.identifierPrefix;if(Q){var n=ot,r=it;n=(r&~(1<<32-He(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=cr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[Ye]=t,e[or]=r,fc(e,t,!1,!1),t.stateNode=e;e:{switch(i=_s(n,r),n){case"dialog":H("cancel",e),H("close",e),l=r;break;case"iframe":case"object":case"embed":H("load",e),l=r;break;case"video":case"audio":for(l=0;lSn&&(t.flags|=128,r=!0,zn(s,!1),t.lanes=4194304)}else{if(!r)if(e=ml(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),zn(s,!0),s.tail===null&&s.tailMode==="hidden"&&!i.alternate&&!Q)return ue(t),null}else 2*X()-s.renderingStartTime>Sn&&n!==1073741824&&(t.flags|=128,r=!0,zn(s,!1),t.lanes=4194304);s.isBackwards?(i.sibling=t.child,t.child=i):(n=s.last,n!==null?n.sibling=i:t.child=i,s.last=i)}return s.tail!==null?(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=X(),t.sibling=null,n=q.current,V(q,r?n&1|2:n&1),t):(ue(t),null);case 22:case 23:return Ji(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Ne&1073741824&&(ue(t),t.subtreeFlags&6&&(t.flags|=8192)):ue(t),null;case 24:return null;case 25:return null}throw Error(C(156,t.tag))}function Hf(e,t){switch(Ri(t),t.tag){case 1:return we(t.type)&&ol(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return xn(),W(ye),W(de),Bi(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Ui(t),null;case 13:if(W(q),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(C(340));yn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return W(q),null;case 4:return xn(),null;case 10:return $i(t.type._context),null;case 22:case 23:return Ji(),null;case 24:return null;default:return null}}var Ir=!1,ce=!1,Wf=typeof WeakSet=="function"?WeakSet:Set,T=null;function un(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){Y(e,t,r)}else n.current=null}function ei(e,t,n){try{n()}catch(r){Y(e,t,r)}}var su=!1;function Qf(e,t){if(Fs=rl,e=wa(),Mi(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,s=r.focusNode;r=r.focusOffset;try{n.nodeType,s.nodeType}catch{n=null;break e}var i=0,o=-1,u=-1,c=0,f=0,p=e,h=null;t:for(;;){for(var g;p!==n||l!==0&&p.nodeType!==3||(o=i+l),p!==s||r!==0&&p.nodeType!==3||(u=i+r),p.nodeType===3&&(i+=p.nodeValue.length),(g=p.firstChild)!==null;)h=p,p=g;for(;;){if(p===e)break t;if(h===n&&++c===l&&(o=i),h===s&&++f===r&&(u=i),(g=p.nextSibling)!==null)break;p=h,h=p.parentNode}p=g}n=o===-1||u===-1?null:{start:o,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(Ds={focusedElem:e,selectionRange:n},rl=!1,T=t;T!==null;)if(t=T,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,T=e;else for(;T!==null;){t=T;try{var x=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(x!==null){var w=x.memoizedProps,S=x.memoizedState,v=t.stateNode,d=v.getSnapshotBeforeUpdate(t.elementType===t.type?w:Ae(t.type,w),S);v.__reactInternalSnapshotBeforeUpdate=d}break;case 3:var m=t.stateNode.containerInfo;m.nodeType===1?m.textContent="":m.nodeType===9&&m.documentElement&&m.removeChild(m.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(C(163))}}catch(y){Y(t,t.return,y)}if(e=t.sibling,e!==null){e.return=t.return,T=e;break}T=t.return}return x=su,su=!1,x}function Gn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var s=l.destroy;l.destroy=void 0,s!==void 0&&ei(t,n,s)}l=l.next}while(l!==r)}}function Rl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ti(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function hc(e){var t=e.alternate;t!==null&&(e.alternate=null,hc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ye],delete t[or],delete t[Bs],delete t[_f],delete t[Pf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function vc(e){return e.tag===5||e.tag===3||e.tag===4}function iu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||vc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ni(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=il));else if(r!==4&&(e=e.child,e!==null))for(ni(e,t,n),e=e.sibling;e!==null;)ni(e,t,n),e=e.sibling}function ri(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(ri(e,t,n),e=e.sibling;e!==null;)ri(e,t,n),e=e.sibling}var re=null,Ue=!1;function pt(e,t,n){for(n=n.child;n!==null;)gc(e,t,n),n=n.sibling}function gc(e,t,n){if(Xe&&typeof Xe.onCommitFiberUnmount=="function")try{Xe.onCommitFiberUnmount(jl,n)}catch{}switch(n.tag){case 5:ce||un(n,t);case 6:var r=re,l=Ue;re=null,pt(e,t,n),re=r,Ue=l,re!==null&&(Ue?(e=re,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):re.removeChild(n.stateNode));break;case 18:re!==null&&(Ue?(e=re,n=n.stateNode,e.nodeType===8?ns(e.parentNode,n):e.nodeType===1&&ns(e,n),nr(e)):ns(re,n.stateNode));break;case 4:r=re,l=Ue,re=n.stateNode.containerInfo,Ue=!0,pt(e,t,n),re=r,Ue=l;break;case 0:case 11:case 14:case 15:if(!ce&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var s=l,i=s.destroy;s=s.tag,i!==void 0&&(s&2||s&4)&&ei(n,t,i),l=l.next}while(l!==r)}pt(e,t,n);break;case 1:if(!ce&&(un(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(o){Y(n,t,o)}pt(e,t,n);break;case 21:pt(e,t,n);break;case 22:n.mode&1?(ce=(r=ce)||n.memoizedState!==null,pt(e,t,n),ce=r):pt(e,t,n);break;default:pt(e,t,n)}}function ou(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Wf),t.forEach(function(r){var l=ep.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function De(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=i),r&=~s}if(r=l,r=X()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Gf(r/1960))-r,10e?16:e,wt===null)var r=!1;else{if(e=wt,wt=null,wl=0,D&6)throw Error(C(331));var l=D;for(D|=4,T=e.current;T!==null;){var s=T,i=s.child;if(T.flags&16){var o=s.deletions;if(o!==null){for(var u=0;uX()-Xi?Ut(e,0):Yi|=n),xe(e,t)}function Cc(e,t){t===0&&(e.mode&1?(t=Cr,Cr<<=1,!(Cr&130023424)&&(Cr=4194304)):t=1);var n=pe();e=at(e,t),e!==null&&(vr(e,t,n),xe(e,n))}function bf(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Cc(e,n)}function ep(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(C(314))}r!==null&&r.delete(t),Cc(e,n)}var Ec;Ec=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||ye.current)ge=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ge=!1,Bf(e,t,n);ge=!!(e.flags&131072)}else ge=!1,Q&&t.flags&1048576&&Ma(t,cl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;qr(e,t),e=t.pendingProps;var l=gn(t,de.current);mn(t,n),l=Hi(null,t,r,e,l,n);var s=Wi();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,we(r)?(s=!0,ul(t)):s=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Di(t),l.updater=Ll,t.stateNode=l,l._reactInternals=t,Gs(t,r,e,n),t=Xs(null,t,r,!0,s,n)):(t.tag=0,Q&&s&&Li(t),fe(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(qr(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=np(r),e=Ae(r,e),l){case 0:t=Ys(null,t,r,e,n);break e;case 1:t=nu(null,t,r,e,n);break e;case 11:t=eu(null,t,r,e,n);break e;case 14:t=tu(null,t,r,Ae(r.type,e),n);break e}throw Error(C(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ae(r,l),Ys(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ae(r,l),nu(e,t,r,l,n);case 3:e:{if(ac(t),e===null)throw Error(C(387));r=t.pendingProps,s=t.memoizedState,l=s.element,$a(e,t),pl(t,r,null,n);var i=t.memoizedState;if(r=i.element,s.isDehydrated)if(s={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){l=kn(Error(C(423)),t),t=ru(e,t,r,n,l);break e}else if(r!==l){l=kn(Error(C(424)),t),t=ru(e,t,r,n,l);break e}else for(Ce=Nt(t.stateNode.containerInfo.firstChild),Ee=t,Q=!0,Be=null,n=Ia(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(yn(),r===l){t=ct(e,t,n);break e}fe(e,t,r,n)}t=t.child}return t;case 5:return Fa(t),e===null&&Ws(t),r=t.type,l=t.pendingProps,s=e!==null?e.memoizedProps:null,i=l.children,As(r,l)?i=null:s!==null&&As(r,s)&&(t.flags|=32),uc(e,t),fe(e,t,i,n),t.child;case 6:return e===null&&Ws(t),null;case 13:return cc(e,t,n);case 4:return Ai(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=wn(t,null,r,n):fe(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ae(r,l),eu(e,t,r,l,n);case 7:return fe(e,t,t.pendingProps,n),t.child;case 8:return fe(e,t,t.pendingProps.children,n),t.child;case 12:return fe(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,s=t.memoizedProps,i=l.value,V(dl,r._currentValue),r._currentValue=i,s!==null)if(We(s.value,i)){if(s.children===l.children&&!ye.current){t=ct(e,t,n);break e}}else for(s=t.child,s!==null&&(s.return=t);s!==null;){var o=s.dependencies;if(o!==null){i=s.child;for(var u=o.firstContext;u!==null;){if(u.context===r){if(s.tag===1){u=it(-1,n&-n),u.tag=2;var c=s.updateQueue;if(c!==null){c=c.shared;var f=c.pending;f===null?u.next=u:(u.next=f.next,f.next=u),c.pending=u}}s.lanes|=n,u=s.alternate,u!==null&&(u.lanes|=n),Qs(s.return,n,t),o.lanes|=n;break}u=u.next}}else if(s.tag===10)i=s.type===t.type?null:s.child;else if(s.tag===18){if(i=s.return,i===null)throw Error(C(341));i.lanes|=n,o=i.alternate,o!==null&&(o.lanes|=n),Qs(i,n,t),i=s.sibling}else i=s.child;if(i!==null)i.return=s;else for(i=s;i!==null;){if(i===t){i=null;break}if(s=i.sibling,s!==null){s.return=i.return,i=s;break}i=i.return}s=i}fe(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,mn(t,n),l=$e(l),r=r(l),t.flags|=1,fe(e,t,r,n),t.child;case 14:return r=t.type,l=Ae(r,t.pendingProps),l=Ae(r.type,l),tu(e,t,r,l,n);case 15:return ic(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ae(r,l),qr(e,t),t.tag=1,we(r)?(e=!0,ul(t)):e=!1,mn(t,n),rc(t,r,l),Gs(t,r,l,n),Xs(null,t,r,!0,e,n);case 19:return dc(e,t,n);case 22:return oc(e,t,n)}throw Error(C(156,t.tag))};function _c(e,t){return ea(e,t)}function tp(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ie(e,t,n,r){return new tp(e,t,n,r)}function eo(e){return e=e.prototype,!(!e||!e.isReactComponent)}function np(e){if(typeof e=="function")return eo(e)?1:0;if(e!=null){if(e=e.$$typeof,e===wi)return 11;if(e===xi)return 14}return 2}function _t(e,t){var n=e.alternate;return n===null?(n=Ie(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Yr(e,t,n,r,l,s){var i=2;if(r=e,typeof e=="function")eo(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case Jt:return Bt(n.children,l,s,t);case yi:i=8,l|=8;break;case gs:return e=Ie(12,n,t,l|2),e.elementType=gs,e.lanes=s,e;case ys:return e=Ie(13,n,t,l),e.elementType=ys,e.lanes=s,e;case ws:return e=Ie(19,n,t,l),e.elementType=ws,e.lanes=s,e;case Fu:return Il(n,l,s,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ou:i=10;break e;case $u:i=9;break e;case wi:i=11;break e;case xi:i=14;break e;case mt:i=16,r=null;break e}throw Error(C(130,e==null?e:typeof e,""))}return t=Ie(i,n,t,l),t.elementType=e,t.type=r,t.lanes=s,t}function Bt(e,t,n,r){return e=Ie(7,e,r,t),e.lanes=n,e}function Il(e,t,n,r){return e=Ie(22,e,r,t),e.elementType=Fu,e.lanes=n,e.stateNode={isHidden:!1},e}function cs(e,t,n){return e=Ie(6,e,null,t),e.lanes=n,e}function ds(e,t,n){return t=Ie(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function rp(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Ql(0),this.expirationTimes=Ql(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ql(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function to(e,t,n,r,l,s,i,o,u){return e=new rp(e,t,n,o,u),t===1?(t=1,s===!0&&(t|=8)):t=0,s=Ie(3,null,null,t),e.current=s,s.stateNode=e,s.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Di(s),e}function lp(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Lc)}catch(e){console.error(e)}}Lc(),Lu.exports=Pe;var ap=Lu.exports,Rc,hu=ap;Rc=hu.createRoot,hu.hydrateRoot;const so="/api/hifiberry";async function ae(e){const t=await fetch(`${so}${e}`);if(!t.ok)throw new Error(`HiFiBerry ${e}: ${t.status}`);return t.json()}async function cp(e){const t=await fetch(`${so}${e}`);if(!t.ok)throw new Error(`HiFiBerry ${e}: ${t.status}`);return t.text()}async function On(e,t=null){const n=await fetch(`${so}${e}`,{method:"POST",headers:t!==null?{"Content-Type":"application/json"}:{},body:t!==null?JSON.stringify(t):void 0});if(!n.ok)throw new Error(`HiFiBerry POST ${e}: ${n.status}`);const r=await n.text();return r?JSON.parse(r):null}function fs(e){return Array.isArray(e==null?void 0:e.values)?e.values[0]:null}function dp(e){const t=parseInt(e.join(""),16);return(t&2147483648?t-4294967296:t)/16777216}function fp(e){return{b0:e[2],b1:e[1],b2:e[0],a1:-e[4],a2:-e[3]}}function pp(e){return!(e.length!==5||e.some(t=>!Number.isFinite(t))||e.every(t=>Math.abs(t)<1e-6)||Math.abs(e[2])<1e-5&&Math.abs(e[1])<1e-5&&Math.abs(e[0])<1e-5||e.some(t=>Math.abs(t)>2.2)||e[3]>.05||e[4]<-.05)}function mp(e){var f;const t=new DOMParser().parseFromString(e,"application/xml");if(t.querySelector("parsererror"))return[];if(!Number(((f=[...t.querySelectorAll("metadata")].find(p=>p.getAttribute("type")==="crossoverBands"))==null?void 0:f.textContent)??0))return[];const l=[...t.querySelectorAll("action")].filter(p=>p.getAttribute("ParamName")==="DM0 Data"),s=l[l.length-1];if(!(s!=null&&s.textContent))return[];const i=s.textContent.trim().split(/\s+/),o=[];for(let p=0;p+3x.toFixed(5)).join(",");c.has(g)||(c.add(g),u.push({address:Number(s.getAttribute("addr")??0)+p,type:"Crossover",bypassed:!1,coeffs:fp(h)}))}return u}async function vu(){const e=await ae("/metadata");return(e==null?void 0:e.volumeControlRegister)??null}const ne={getVolume:async()=>{const e=await vu();if(!e)return null;const t=await ae(`/memory/${encodeURIComponent(e)}?format=float`),n=fs(t);return n==null?null:{volume:Math.round(n*100)}},setVolume:async e=>{const t=await vu();return t?On("/memory",{address:t,value:Math.max(0,Math.min(100,e))/100,store:!0}):null},getParameters:async()=>[],getParameter:e=>ae(`/parameter/${encodeURIComponent(e)}`),setParameter:(e,t)=>On(`/parameter/${encodeURIComponent(e)}`,{value:t}),getAllParameterValues:()=>ae("/parametervalues"),getProfiles:async()=>[],getActiveProfile:async()=>{var t;const e=await ae("/metadata");return((t=e==null?void 0:e._system)==null?void 0:t.profileName)??(e==null?void 0:e.profileName)??null},loadProfile:async()=>null,getMetadata:async()=>{const[e,t,n]=await Promise.all([ae("/version").catch(()=>null),ae("/hardware/dsp").catch(()=>null),ae("/metadata").catch(()=>null)]);return{...n??{},version:e,hardware:t}},getFilters:async()=>{const e=await ae("/filters"),t=(e==null?void 0:e.profiles)??{};return Object.values(t).flatMap(n=>Object.values(n).map(r=>{var l,s,i,o;return{address:r.address,bypassed:r.bypassed,type:((l=r.filter)==null?void 0:l.type)??"—",freq:((s=r.filter)==null?void 0:s.f)??null,gain:((i=r.filter)==null?void 0:i.db)??null,q:((o=r.filter)==null?void 0:o.q)??null}}))},getCrossoverFilters:async()=>mp(await cp("/dspprofile")),getMute:async()=>{const e=await ae("/metadata"),t=(e==null?void 0:e.muteRegister)??null;if(!t)return null;const n=await ae(`/memory/${encodeURIComponent(t)}?format=float`),r=fs(n);return r==null?null:{mute:r>=.5}},setMute:async e=>{const t=await ae("/metadata"),n=(t==null?void 0:t.muteRegister)??null;return n?On("/memory",{address:n,value:e?1:0,store:!0}):null},getSpdif:async()=>{const e=await ae("/metadata"),t=(e==null?void 0:e.enableSPDIFRegister)??null;if(!t)return null;const n=await ae(`/memory/${encodeURIComponent(t)}?format=float`),r=fs(n);return r==null?null:{spdif:r>=.5}},setSpdif:async e=>{const t=await ae("/metadata"),n=(t==null?void 0:t.enableSPDIFRegister)??null;return n?On("/memory",{address:n,value:e?1:0,store:!0}):null},getLoudness:()=>ae("/loudness"),setLoudness:e=>On("/loudness",{loudness:e})};function hp(){const[e,t]=j.useState(null),[n,r]=j.useState(null),[l,s]=j.useState(null),[i,o]=j.useState(null),[u,c]=j.useState([]),[f,p]=j.useState([]),[h,g]=j.useState([]),[x,w]=j.useState([]),[S,v]=j.useState(null),[d,m]=j.useState(null),[y,N]=j.useState(null),E=j.useRef(null),_=j.useRef(null),M=j.useRef(null),A=j.useCallback(async()=>{try{const[F,ke,P,k,L,R,U,Le,Se,ft]=await Promise.all([ne.getVolume().catch(()=>null),ne.getParameters().catch(()=>[]),ne.getProfiles().catch(()=>[]),ne.getMetadata(),ne.getActiveProfile().catch(()=>null),ne.getLoudness().catch(()=>null),ne.getMute().catch(()=>null),ne.getSpdif().catch(()=>null),ne.getFilters().catch(()=>[]),ne.getCrossoverFilters().catch(()=>[])]);if(E.current===null&&t((F==null?void 0:F.volume)??F??null),w(P??[]),m(k),v(L),R!==null&&r((R==null?void 0:R.loudness)??null),U!==null&&s((U==null?void 0:U.mute)??null),Le!==null&&o((Le==null?void 0:Le.spdif)??null),c(Array.isArray(Se)?Se:[]),p(Array.isArray(ft)?ft:[]),N(null),Array.isArray(ke)&&ke.length){const et=await Promise.all(ke.map(Qe=>ne.getParameter(Qe).then($c=>({name:Qe,...$c})).catch(()=>({name:Qe,value:null}))));g(et.filter(Qe=>Qe.value!==null))}}catch(F){N(F.message)}},[]);j.useEffect(()=>{A();const F=setInterval(A,5e3);return()=>clearInterval(F)},[A]);const z=j.useCallback(F=>{E.current=F,t(F),_.current&&clearTimeout(_.current),_.current=setTimeout(async()=>{try{await ne.setVolume(F)}finally{E.current=null}},150)},[]),ie=j.useCallback((F,ke)=>{g(P=>P.map(k=>k.name===F?{...k,value:ke}:k)),M.current&&clearTimeout(M.current),M.current=setTimeout(()=>{ne.setParameter(F,ke)},150)},[]),Me=j.useCallback(async F=>{await ne.loadProfile(F),v(F),await A()},[A]),Je=j.useCallback(async()=>{const F=!n;r(F),await ne.setLoudness(F)},[n]),En=j.useCallback(async()=>{const F=!l;s(F),await ne.setMute(F)},[l]),be=j.useCallback(async()=>{const F=!i;o(F),await ne.setSpdif(F)},[i]);return{volume:e,loudness:n,mute:l,spdif:i,filters:u,crossoverFilters:f,parameters:h,profiles:x,activeProfile:S,metadata:d,error:y,updateVolume:z,updateParameter:ie,switchProfile:Me,toggleLoudness:Je,toggleMute:En,toggleSpdif:be,refresh:A}}const mr=20,zc=2e4,gu=140,Ge=-18,Xt=18;function Xr(e,t,n){return Math.max(t,Math.min(n,e))}function ps(e){return(Math.log10(e)-Math.log10(mr))/(Math.log10(zc)-Math.log10(mr))}function vp(){return Array.from({length:gu},(e,t)=>{const n=t/(gu-1);return mr*Math.pow(zc/mr,n)})}function gp(e=""){const t=String(e).toLowerCase().replace(/[\s_-]/g,"");return t.includes("highpass")||t==="hp"||t.includes("hpf")?"highpass":t.includes("lowpass")||t==="lp"||t.includes("lpf")?"lowpass":t.includes("highshelf")||t.includes("treble")?"highshelf":t.includes("lowshelf")||t.includes("bass")?"lowshelf":t.includes("notch")?"notch":(t.includes("peak")||t.includes("peq")||t.includes("bell"),"peaking")}function yp(e,t=48e3){const n=Xr(Number(e.freq),mr,t/2-1),r=Math.max(.05,Number(e.q)||.707),l=Number(e.gain)||0,s=gp(e.type),i=Math.pow(10,l/40),o=2*Math.PI*n/t,u=Math.sin(o),c=Math.cos(o),f=u/(2*r);let p,h,g,x,w,S;if(s==="lowpass")p=(1-c)/2,h=1-c,g=(1-c)/2,x=1+f,w=-2*c,S=1-f;else if(s==="highpass")p=(1+c)/2,h=-(1+c),g=(1+c)/2,x=1+f,w=-2*c,S=1-f;else if(s==="notch")p=1,h=-2*c,g=1,x=1+f,w=-2*c,S=1-f;else if(s==="lowshelf"){const v=u/2*Math.sqrt((i+1/i)*(1/r-1)+2),d=2*Math.sqrt(i)*v;p=i*(i+1-(i-1)*c+d),h=2*i*(i-1-(i+1)*c),g=i*(i+1-(i-1)*c-d),x=i+1+(i-1)*c+d,w=-2*(i-1+(i+1)*c),S=i+1+(i-1)*c-d}else if(s==="highshelf"){const v=u/2*Math.sqrt((i+1/i)*(1/r-1)+2),d=2*Math.sqrt(i)*v;p=i*(i+1+(i-1)*c+d),h=-2*i*(i-1+(i+1)*c),g=i*(i+1+(i-1)*c-d),x=i+1-(i-1)*c+d,w=2*(i-1-(i+1)*c),S=i+1-(i-1)*c-d}else p=1+f*i,h=-2*c,g=1-f*i,x=1+f/i,w=-2*c,S=1-f/i;return{b0:p/x,b1:h/x,b2:g/x,a1:w/x,a2:S/x}}function wp(e,t,n=48e3){const r=2*Math.PI*t/n,l=Math.cos(r),s=Math.sin(r),i=Math.cos(2*r),o=Math.sin(2*r),u=e.b0+e.b1*l+e.b2*i,c=-e.b1*s-e.b2*o,f=1+e.a1*l+e.a2*i,p=-e.a1*s-e.a2*o,h=Math.sqrt((u*u+c*c)/Math.max(1e-12,f*f+p*p));return 20*Math.log10(Math.max(1e-8,h))}function xp({filters:e,crossoverFilters:t}){const n=e.filter(f=>!f.bypassed&&Number.isFinite(Number(f.freq))),r=t.filter(f=>!f.bypassed&&f.coeffs),l=vp(),s=[...r.map(f=>f.coeffs),...n.map(yp)],i=l.map(f=>{const p=s.reduce((x,w)=>x+wp(w,f),0),h=ps(f)*100,g=100-(Xr(p,Ge,Xt)-Ge)/(Xt-Ge)*100;return`${h.toFixed(2)},${g.toFixed(2)}`}).join(" "),o=100-(0-Ge)/(Xt-Ge)*100,u=[-12,-6,0,6,12],c=[20,50,100,200,500,1e3,2e3,5e3,1e4,2e4];return a.jsxs("section",{className:"panel-section dsp-response-section",children:[a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"FILTER RESPONSE"}),a.jsxs("span",{className:"section-value mono",children:[n.length," custom · ",r.length," crossover"]})]}),a.jsxs("div",{className:"dsp-response",children:[a.jsxs("svg",{viewBox:"0 0 100 100",preserveAspectRatio:"none",role:"img","aria-label":"Current DSP filter response",children:[u.map(f=>{const p=100-(f-Ge)/(Xt-Ge)*100;return a.jsx("line",{className:f===0?"dsp-axis":"dsp-grid",x1:"0",x2:"100",y1:p,y2:p},f)}),c.map(f=>{const p=ps(f)*100;return a.jsx("line",{className:"dsp-grid dsp-grid--freq",x1:p,x2:p,y1:"0",y2:"100"},f)}),a.jsx("polyline",{className:"dsp-response-fill",points:`0,${o} ${i} 100,${o}`}),a.jsx("polyline",{className:"dsp-response-line",points:i}),n.map((f,p)=>{const h=Xr(ps(Number(f.freq))*100,0,100),g=100-(Xr(Number(f.gain)||0,Ge,Xt)-Ge)/(Xt-Ge)*100;return a.jsx("circle",{className:"dsp-filter-dot",cx:h,cy:g,r:"1.8"},`${f.address}-${p}`)})]}),a.jsxs("div",{className:"dsp-response-labels mono",children:[a.jsx("span",{children:"20"}),a.jsx("span",{children:"100"}),a.jsx("span",{children:"1k"}),a.jsx("span",{children:"10k"}),a.jsx("span",{children:"20k"})]})]}),a.jsxs("div",{className:"dsp-response-legend",children:[a.jsxs("span",{children:[a.jsx("i",{className:"legend-line legend-line--xo"})," crossover/profile"]}),a.jsxs("span",{children:[a.jsx("i",{className:"legend-dot"})," custom filter"]})]})]})}function kp({label:e,value:t,min:n=0,max:r=100,step:l=1,unit:s="",onChange:i,onCommit:o}){const u=r===n?0:(t-n)/(r-n)*100;return a.jsxs("div",{className:"param-row",children:[a.jsx("div",{className:"param-label",children:e}),a.jsxs("div",{className:"param-control",children:[a.jsxs("div",{className:"slider-track",children:[a.jsx("div",{className:"slider-fill",style:{width:`${u}%`}}),a.jsx("input",{type:"range",min:n,max:r,step:l,value:t??n,onChange:c=>i(parseFloat(c.target.value)),onMouseUp:c=>o==null?void 0:o(parseFloat(c.target.value)),onTouchEnd:c=>o==null?void 0:o(parseFloat(c.target.value))})]}),a.jsxs("span",{className:"param-value",children:[t!=null?Number(t).toFixed(l<1?1:0):"--",s]})]})]})}function Sp(){const{volume:e,loudness:t,mute:n,spdif:r,filters:l,crossoverFilters:s,parameters:i,profiles:o,activeProfile:u,metadata:c,error:f,updateVolume:p,updateParameter:h,switchProfile:g,toggleLoudness:x,toggleMute:w,toggleSpdif:S}=hp(),[v,d]=j.useState(null),m=v??e??0;return f?a.jsxs("div",{className:"panel-error",children:[a.jsx("span",{className:"dot dot-red"})," BeoCreate unreachable — ",f]}):a.jsxs("div",{className:"panel",children:[(l.length>0||s.length>0)&&a.jsx(xp,{filters:l,crossoverFilters:s}),a.jsxs("section",{className:"panel-section",children:[a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"MASTER VOLUME"}),a.jsx("span",{className:"section-value mono",children:Math.round(m)})]}),a.jsxs("div",{className:"vol-slider",children:[a.jsx("div",{className:"vol-fill",style:{width:`${m}%`}}),a.jsx("input",{type:"range",min:0,max:100,step:1,value:m,onChange:y=>{const N=parseInt(y.target.value);d(N)},onMouseUp:y=>{const N=parseInt(y.target.value);p(N),d(null)},onTouchEnd:y=>{const N=parseInt(y.target.value);p(N),d(null)}})]})]}),n!==null&&a.jsx("section",{className:"panel-section",children:a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"MUTE"}),a.jsx("button",{className:`toggle-btn ${n?"toggle-btn--on":""}`,onClick:w,children:n?"ON":"OFF"})]})}),t!==null&&a.jsx("section",{className:"panel-section",children:a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"LOUDNESS"}),a.jsx("button",{className:`toggle-btn ${t?"toggle-btn--on":""}`,onClick:x,children:t?"ON":"OFF"})]})}),r!==null&&a.jsx("section",{className:"panel-section",children:a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"SPDIF OUT"}),a.jsx("button",{className:`toggle-btn ${r?"toggle-btn--on":""}`,onClick:S,children:r?"ON":"OFF"})]})}),o.length>0&&a.jsxs("section",{className:"panel-section",children:[a.jsx("div",{className:"section-header",children:a.jsx("span",{className:"section-label",children:"DSP PROFILE"})}),a.jsxs("select",{className:"select",value:u??"",onChange:y=>g(y.target.value),children:[!u&&a.jsx("option",{value:"",children:"— select profile —"}),o.map(y=>a.jsx("option",{value:y,children:y},y))]})]}),l.length>0&&a.jsxs("section",{className:"panel-section",children:[a.jsx("div",{className:"section-header",children:a.jsx("span",{className:"section-label",children:"FILTERS"})}),a.jsx("div",{className:"param-list",children:l.map((y,N)=>{const E=[y.freq!=null&&`${y.freq} Hz`,y.gain!=null&&`${y.gain} dB`,y.q!=null&&`Q ${y.q}`].filter(Boolean).join(" ");return a.jsxs("div",{className:"meta-row",children:[a.jsxs("span",{className:"meta-key",style:{opacity:y.bypassed?.4:1},children:[y.type,E?` — ${E}`:""]}),a.jsx("span",{className:"meta-val mono",children:y.bypassed?"bypassed":`reg ${y.address}`})]},N)})})]}),c&&a.jsx("section",{className:"panel-section panel-section--meta",children:Object.entries(c).map(([y,N])=>a.jsxs("div",{className:"meta-row",children:[a.jsx("span",{className:"meta-key",children:y}),a.jsx("span",{className:"meta-val mono",children:String(N)})]},y))}),i.length>0&&a.jsxs("section",{className:"panel-section",children:[a.jsx("div",{className:"section-header",children:a.jsx("span",{className:"section-label",children:"DSP PARAMETERS"})}),a.jsx("div",{className:"param-list",children:i.map(y=>{const N=y.min??0,E=y.max??1,_=E-N<=2?.01:1;return a.jsx(kp,{label:y.name.replace(/_/g," "),value:parseFloat(y.value),min:N,max:E,step:_,onChange:M=>h(y.name,M)},y.name)})})]}),i.length===0&&o.length===0&&!f&&a.jsx("div",{className:"panel-empty",children:"No DSP parameters available for this profile"})]})}const Np="/api/mopidy/rpc";let jp=1;async function O(e,t={}){const n=jp++,r=await fetch(Np,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:n,method:e,params:t})});if(!r.ok)throw new Error(`Mopidy RPC ${e}: ${r.status}`);const l=await r.json();if(l.error)throw new Error(`Mopidy: ${l.error.message}`);return l.result}const I={getState:()=>O("core.playback.get_state"),play:e=>O("core.playback.play",e?{tlid:e}:{}),pause:()=>O("core.playback.pause"),resume:()=>O("core.playback.resume"),stop:()=>O("core.playback.stop"),next:()=>O("core.playback.next"),previous:()=>O("core.playback.previous"),getCurrentTrack:()=>O("core.playback.get_current_tl_track"),getTimePosition:()=>O("core.playback.get_time_position"),seek:e=>O("core.playback.seek",{time_position:e}),getVolume:()=>O("core.mixer.get_volume"),setVolume:e=>O("core.mixer.set_volume",{volume:e}),getMute:()=>O("core.mixer.get_mute"),setMute:e=>O("core.mixer.set_mute",{mute:e}),getTracklist:()=>O("core.tracklist.get_tl_tracks"),getLength:()=>O("core.tracklist.get_length"),getIndex:()=>O("core.tracklist.index"),getRepeat:()=>O("core.tracklist.get_repeat"),getRandom:()=>O("core.tracklist.get_random"),getSingle:()=>O("core.tracklist.get_single"),setRepeat:e=>O("core.tracklist.set_repeat",{value:e}),setRandom:e=>O("core.tracklist.set_random",{value:e}),setSingle:e=>O("core.tracklist.set_single",{value:e}),clearTracklist:()=>O("core.tracklist.clear"),removeTracks:e=>O("core.tracklist.remove",{criteria:e}),getPlaylists:()=>O("core.playlists.as_list"),getPlaylist:e=>O("core.playlists.lookup",{uri:e}),loadPlaylist:async e=>{var n;const t=await O("core.playlists.lookup",{uri:e});(n=t==null?void 0:t.tracks)!=null&&n.length&&(await O("core.tracklist.clear"),await O("core.tracklist.add",{tracks:t.tracks}),await O("core.playback.play"))},search:(e,t)=>O("core.library.search",{query:{any:[e]},uris:t}),browse:e=>O("core.library.browse",{uri:e??null}),lookup:e=>O("core.library.lookup",{uri:e}),getImages:e=>O("core.library.get_images",{uris:e}),addTracks:e=>O("core.tracklist.add",{uris:e}),localScan:()=>O("core.library.refresh",{})};function Sl(e){if(e==null)return"--:--";const t=Math.floor(e/1e3);return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}const Cp=`ws://${location.host}/ws/mopidy`;function Ep(){const[e,t]=j.useState({playbackState:null,currentTrack:null,position:0,duration:0,volume:null,mute:!1,repeat:!1,random:!1,single:!1,tracklist:[],playlists:[],connected:!1,error:null}),n=j.useRef(null),r=j.useRef(null),l=j.useRef(0),s=j.useCallback(()=>{l.current+=1e3,t(f=>({...f,position:l.current}))},[]),i=j.useCallback(()=>{clearInterval(r.current),r.current=setInterval(s,1e3)},[s]),o=j.useCallback(()=>{clearInterval(r.current)},[]),u=j.useCallback(async()=>{var f;try{const[p,h,g,x,w,S,v,d,m,y]=await Promise.all([I.getState(),I.getCurrentTrack(),I.getTimePosition(),I.getVolume(),I.getMute(),I.getRepeat(),I.getRandom(),I.getSingle(),I.getTracklist(),I.getPlaylists().catch(()=>[])]),N=((f=h==null?void 0:h.track)==null?void 0:f.length)??0;l.current=g??0,t(E=>({...E,playbackState:p,currentTrack:h,position:g??0,duration:N,volume:x,mute:w??!1,repeat:S??!1,random:v??!1,single:d??!1,tracklist:m??[],playlists:y??[],connected:!0,error:null})),p==="playing"?i():o()}catch(p){t(h=>({...h,error:p.message,connected:!1}))}},[i,o]);j.useEffect(()=>{let f;const p=()=>{const h=new WebSocket(Cp);n.current=h,h.onopen=()=>{t(g=>({...g,connected:!0})),u()},h.onclose=()=>{t(g=>({...g,connected:!1})),f=setTimeout(p,4e3)},h.onerror=()=>h.close(),h.onmessage=g=>{try{if(!JSON.parse(g.data).event)return;u()}catch{}}};return p(),()=>{var h;clearTimeout(f),clearInterval(r.current),(h=n.current)==null||h.close()}},[u]);const c={play:async f=>{await I.play(f),u()},pause:async()=>{await I.pause(),u()},resume:async()=>{await I.resume(),u()},stop:async()=>{await I.stop(),u()},next:async()=>{await I.next(),u()},previous:async()=>{await I.previous(),u()},seek:async f=>{await I.seek(f),l.current=f,t(p=>({...p,position:f}))},setVolume:async f=>{t(p=>({...p,volume:f})),await I.setVolume(f)},setMute:async f=>{t(p=>({...p,mute:f})),await I.setMute(f)},setRepeat:async f=>{t(p=>({...p,repeat:f})),await I.setRepeat(f)},setRandom:async f=>{t(p=>({...p,random:f})),await I.setRandom(f)},setSingle:async f=>{t(p=>({...p,single:f})),await I.setSingle(f)},loadPlaylist:async f=>{await I.loadPlaylist(f),u()},clearTracklist:async()=>{await I.clearTracklist(),u()},removeTrack:async f=>{await I.removeTracks({tlid:[f]}),u()},addTracks:async f=>{await I.addTracks(f),u()},search:I.search};return{...e,...c,refresh:u}}const _p="/api/now-playing";async function ms(e){const t=await fetch(`${_p}${e}`),n=await t.json().catch(()=>({}));if(!t.ok)throw new Error(n.error||`Now playing API ${t.status}`);if(n.error)throw new Error(n.error);return n}const Xn={get:()=>ms("/now-playing"),recognize:()=>ms("/recognize"),visualizer:()=>ms("/visualizer")};function Al(e){return e?e.startsWith("http")||e.startsWith("data:")?e:`/api/mopidy-image/${e.replace(/^\/+/,"").replace(/^mopidy\//,"")}`:null}const Pp=[28,56,38,72,46,84,31,63,51,76,42,68,34,58,87,45,70,36,62,49,79,40,66,53];function Tp({bars:e}){const t=e!=null&&e.length?e:Pp;return a.jsx("div",{className:`cava-overlay cava-overlay--cover ${e!=null&&e.length?"cava-overlay--live":""}`,"aria-hidden":"true",children:t.map((n,r)=>a.jsx("span",{style:{"--bar-height":`${n}%`,"--bar-delay":`${r*-.055}s`}},`mop-${n}-${r}`))})}function je({className:e="",title:t,children:n,onClick:r,disabled:l}){return a.jsx("button",{className:`icon-btn ${e}`,onClick:r,disabled:l,title:t,"aria-label":t,children:n})}function Mp({track:e,bars:t}){var o,u,c,f,p;const[n,r]=j.useState(null);if(j.useEffect(()=>{var x;const h=e==null?void 0:e.track;if(!(h!=null&&h.uri)){r(null);return}let g=!1;return I.getImages([h.uri,(x=h.album)==null?void 0:x.uri].filter(Boolean)).then(w=>{var v,d,m;if(g)return;const S=((v=w==null?void 0:w[h.uri])==null?void 0:v[0])??((m=w==null?void 0:w[(d=h.album)==null?void 0:d.uri])==null?void 0:m[0]);r(Al(S==null?void 0:S.uri))}).catch(()=>{g||r(null)}),()=>{g=!0}},[(o=e==null?void 0:e.track)==null?void 0:o.uri,(c=(u=e==null?void 0:e.track)==null?void 0:u.album)==null?void 0:c.uri]),!e)return a.jsxs("div",{className:"now-playing now-playing--empty",children:[a.jsx("div",{className:"now-cover now-cover--empty",children:"ALB"}),a.jsx("div",{className:"track-title",children:"Nothing playing"})]});const l=e.track,s=((f=l.artists)==null?void 0:f.map(h=>h.name).join(", "))??"",i=((p=l.album)==null?void 0:p.name)??"";return a.jsxs("div",{className:"now-playing",children:[a.jsxs("div",{className:"now-cover",children:[n?a.jsx("img",{src:n,alt:""}):"ALB",a.jsx(Tp,{bars:t})]}),a.jsxs("div",{className:"now-text",children:[a.jsx("div",{className:"track-title",children:l.name}),a.jsx("div",{className:"track-sub",children:[s,i].filter(Boolean).join(" · ")})]})]})}function Fr({label:e,title:t,active:n,onClick:r}){return a.jsx("button",{className:`toggle-btn ${n?"toggle-btn--on":""}`,onClick:r,title:t,"aria-label":t,children:e})}function Lp({playlists:e,onLoad:t}){const[n,r]=j.useState(!1);return e.length?a.jsxs("div",{className:"playlist-browser",children:[a.jsxs("button",{className:"section-toggle",onClick:()=>r(l=>!l),children:["PLAYLISTS ",n?"▲":"▼"]}),n&&a.jsx("div",{className:"playlist-list",children:e.map(l=>a.jsx("button",{className:"playlist-item",onClick:()=>t(l.uri),children:l.name},l.uri))})]}):null}function Rp({track:e,className:t=""}){var l;const[n,r]=j.useState(null);return j.useEffect(()=>{var i;if(!(e!=null&&e.uri)){r(null);return}let s=!1;return I.getImages([e.uri,(i=e.album)==null?void 0:i.uri].filter(Boolean)).then(o=>{var c,f,p;if(s)return;const u=((c=o==null?void 0:o[e.uri])==null?void 0:c[0])??((p=o==null?void 0:o[(f=e.album)==null?void 0:f.uri])==null?void 0:p[0]);r(Al(u==null?void 0:u.uri))}).catch(()=>{s||r(null)}),()=>{s=!0}},[e==null?void 0:e.uri,(l=e==null?void 0:e.album)==null?void 0:l.uri]),a.jsx("span",{className:`track-thumb ${t}`,children:n?a.jsx("img",{src:n,alt:"",loading:"lazy"}):"ALB"})}function zp({tracklist:e,currentTrack:t,onPlay:n,onRemove:r}){return e.length?a.jsx("div",{className:"queue-list",children:e.map(l=>{var u;const s=l.tlid===(t==null?void 0:t.tlid),i=l.track,o=((u=i.artists)==null?void 0:u.map(c=>c.name).join(", "))??"";return a.jsxs("div",{className:`queue-item ${s?"queue-item--active":""}`,children:[a.jsx(Rp,{track:i,className:"queue-thumb"}),a.jsxs("div",{className:"queue-info",children:[a.jsx("span",{className:"queue-title",children:i.name}),o&&a.jsx("span",{className:"queue-artist",children:o})]}),a.jsx("span",{className:"queue-dur mono",children:Sl(i.length)}),a.jsx(je,{className:"queue-play",title:"Play track",onClick:()=>n(l.tlid),children:"▶"}),a.jsx(je,{className:"queue-remove",title:"Remove from queue",onClick:()=>r(l.tlid),children:"×"})]},l.tlid)})}):null}const Ip={directory:"DIR",album:"ALB",artist:"ART",playlist:"PLS",track:"TRK"},Ic=[{id:"artist",label:"Artists",uri:"local:directory?type=artist",crumb:"Artists"},{id:"album",label:"Albums",uri:"local:directory?type=album",crumb:"Albums"},{id:"track",label:"Tracks",uri:"local:directory?type=track",crumb:"Tracks"}],hs=Ic[1];function ui(e){return Number((e==null?void 0:e.disc_no)??(e==null?void 0:e.disc)??0)||0}function yu(e){if(!e)return 0;let t=String(e);try{t=decodeURIComponent(t)}catch{}const r=(t.split("/").pop()??t).match(/^\D*(?:disc\s*\d+\D*)?(\d{1,3})(?:\D|$)/i);return r&&Number(r[1])||0}function ai(e){return Number((e==null?void 0:e.track_no)??(e==null?void 0:e.track_number)??0)||yu(e==null?void 0:e.uri)||yu(e==null?void 0:e.name)||0}function ci(e){return e.map((t,n)=>({track:t,index:n})).sort((t,n)=>{const r=t.track,l=n.track,s=ui(r),i=ui(l);if(s!==i)return s-i;const o=ai(r),u=ai(l);return o!==u?o-u:t.index-n.index}).map(({track:t})=>t)}function Op(e){return e.reduce((t,n)=>{const r=ui(n)||1,l=t.find(s=>s.disc===r);return l?l.tracks.push(n):t.push({disc:r,tracks:[n]}),t},[])}async function $p(e){return await Promise.all(e.map(async n=>{try{const r=await I.lookup(n.uri);return(r==null?void 0:r[0])??n}catch{return n}}))}function Un(e,t){var r;const n=(r=e[t])==null?void 0:r[0];return Al(n==null?void 0:n.uri)}function Fp({albums:e,covers:t,onOpen:n}){return a.jsx("div",{className:"cover-grid",children:e.map(r=>{const l=Un(t,r.uri);return a.jsxs("button",{className:"cover-card",onClick:()=>n(r),children:[a.jsx("span",{className:"cover-art",children:l?a.jsx("img",{src:l,alt:"",loading:"lazy"}):"ALB"}),a.jsx("span",{className:"cover-title",children:r.name})]},r.uri)})})}function Dp({album:e,onBack:t,onAdd:n}){const[r,l]=j.useState([]),[s,i]=j.useState(!0),[o,u]=j.useState(!1),[c,f]=j.useState(null),[p,h]=j.useState(null);j.useEffect(()=>{let S=!1;return i(!0),I.browse(e.uri).then(async v=>{if(S)return;const d=(v??[]).filter(N=>N.type==="track"),m=await $p(d);if(S)return;const y=ci(m);l(y)}).catch(()=>{S||l([])}).finally(()=>{S||i(!1)}),I.getImages([e.uri]).then(v=>{var m;if(S)return;const d=(m=v==null?void 0:v[e.uri])==null?void 0:m[0];f(Al(d==null?void 0:d.uri))}),()=>{S=!0}},[e.uri]);const g=async S=>{if(!(!r.length||p)){h(S);try{const v=ci(r).map(d=>d.uri);S==="replace"?(await I.clearTracklist(),await n(v,"Album replaced queue")):await n(v,"Album added to queue"),u(!1),await I.play()}finally{h(null)}}},x=Op(r),w=x.length>1;return a.jsxs("div",{className:"album-detail",children:[a.jsxs("div",{className:"album-header",children:[a.jsx("button",{className:"album-back-btn",onClick:t,children:"← Back"}),a.jsx("span",{className:"album-type mono",children:"ALBUM"}),a.jsxs("div",{className:"album-play-menu",children:[a.jsx("button",{className:"album-play-btn",onClick:()=>u(S=>!S),disabled:s||!r.length||!!p,children:p?"Adding…":"▶ Play Album"}),o&&a.jsxs("div",{className:"album-play-dropdown",children:[a.jsx("button",{onClick:()=>g("add"),disabled:!!p,children:"Add to Queue"}),a.jsx("button",{onClick:()=>g("replace"),disabled:!!p,children:"Replace Queue"})]})]})]}),a.jsxs("div",{className:"album-info",children:[a.jsx("div",{className:"album-cover",children:c?a.jsx("img",{src:c,alt:""}):"ALB"}),a.jsxs("div",{className:"album-meta",children:[a.jsx("div",{className:"album-name",children:e.name}),a.jsxs("div",{className:"album-count",children:[r.length," tracks"]})]})]}),a.jsxs("div",{className:"track-list",children:[s&&a.jsx("div",{className:"browser-msg",children:"Loading…"}),!s&&r.length===0&&a.jsx("div",{className:"browser-msg",children:"No tracks were found for this album."}),x.map(S=>a.jsxs(j.Fragment,{children:[w&&a.jsxs("div",{className:"disc-heading mono",children:["Disc ",S.disc]}),S.tracks.map((v,d)=>a.jsxs("div",{className:"browser-row track-row",children:[a.jsx("span",{className:"track-num mono",children:ai(v)||d+1}),a.jsx("span",{className:"track-name",children:v.name}),a.jsx("span",{className:"track-duration mono",children:Sl(v.length)}),a.jsx(je,{className:"browser-add-btn",title:"Add track to queue",onClick:m=>{m.stopPropagation(),n([v.uri],"Track added to queue")},children:"+"})]},v.uri))]},S.disc))]})]})}function Ap({onAdd:e}){const[t,n]=j.useState(hs),[r,l]=j.useState([{name:hs.crumb,uri:hs.uri}]),[s,i]=j.useState(null),[o,u]=j.useState({}),[c,f]=j.useState(!1),[p,h]=j.useState(""),[g,x]=j.useState(!1),[w,S]=j.useState(!1),[v,d]=j.useState([]),[m,y]=j.useState({}),[N,E]=j.useState(null),_=r.length?r[r.length-1].uri:null;j.useEffect(()=>{if(w)return;let k=!1;return f(!0),i(null),u({}),I.browse(_).then(L=>{k||i(L??[])}).catch(()=>{k||i([])}).finally(()=>{k||f(!1)}),()=>{k=!0}},[_,w]),j.useEffect(()=>{if(w||!(s!=null&&s.length))return;const k=s.filter(R=>R.type==="album"||t.id==="album"&&R.type==="directory");if(!k.length)return;let L=!1;return I.getImages(k.map(R=>R.uri)).then(R=>{L||u(R??{})}).catch(()=>{L||u({})}),()=>{L=!0}},[t.id,s,w]),j.useEffect(()=>{if(!w||!v.length){y({});return}let k=!1;const L=v.flatMap(R=>{var U;return[R.uri,(U=R.album)==null?void 0:U.uri].filter(Boolean)});return I.getImages([...new Set(L)]).then(R=>{k||y(R??{})}).catch(()=>{k||y({})}),()=>{k=!0}},[v,w]);const M=k=>{k.type==="album"||t.id==="album"&&k.type==="directory"?E({name:k.name,uri:k.uri}):(E(null),l(L=>[...L,{name:k.name,uri:k.uri}]))},A=()=>{N?E(null):l(k=>k.slice(0,-1))},z=k=>{n(k),l([{name:k.crumb,uri:k.uri}]),E(null),Me()},ie=async()=>{if(!p.trim()){S(!1),x(!1);return}S(!0),f(!0);try{const k=await I.search(p);d((k??[]).flatMap(L=>L.tracks??[]).slice(0,100))}catch{S(!1),d([])}finally{f(!1)}},Me=()=>{S(!1),x(!1),h(""),d([]),y({}),E(null)},Je=()=>{g||w?Me():x(!0)},be=ci((s==null?void 0:s.filter(k=>k.type==="track"))??[]).map(k=>k.uri),F=(s==null?void 0:s.filter(k=>k.type==="album"||t.id==="album"&&k.type==="directory"))??[],ke=!g&&!w&&!c&&t.id==="album"&&F.length>0,P=r.length?r:[{name:"Root",uri:null}];return a.jsxs("div",{className:"browser",children:[a.jsxs("div",{className:"browser-mode-row",children:[Ic.map(k=>a.jsx("button",{className:`browser-mode-btn ${t.id===k.id&&!w?"browser-mode-btn--active":""}`,onClick:()=>z(k),children:k.label},k.id)),a.jsx("button",{className:`browser-mode-btn browser-mode-btn--search ${g||w?"browser-mode-btn--active":""}`,onClick:Je,children:"Search"})]}),(g||w)&&a.jsxs("div",{className:"browser-search-row",children:[a.jsx("input",{className:"browser-input",type:"search",placeholder:"Search library…",value:p,onChange:k=>h(k.target.value),onKeyDown:k=>{k.key==="Enter"&&ie(),k.key==="Escape"&&Me()}}),w?a.jsx("button",{className:"browser-icon-btn",onClick:Me,children:"✕"}):a.jsx("button",{className:"browser-icon-btn",onClick:ie,children:"⌕"})]}),!g&&!w&&a.jsxs("div",{className:"browser-nav",children:[a.jsx(je,{className:"browser-back-btn",title:"Back",onClick:A,disabled:!N&&r.length<=1,children:"←"}),a.jsxs("div",{className:"browser-crumbs mono",title:P.map(k=>k.name).join(" / "),children:[P.map((k,L)=>a.jsxs("span",{className:"browser-crumb",children:[L>0&&a.jsx("span",{className:"browser-crumb-sep",children:"/"}),k.name]},`${k.uri??"root"}-${L}`)),N&&a.jsxs("span",{className:"browser-crumb",children:[a.jsx("span",{className:"browser-crumb-sep",children:"/"}),N.name]})]}),be.length>0&&a.jsxs(je,{className:"browser-add-all-btn",title:`Add ${be.length} tracks to queue`,onClick:()=>e(be,`${be.length} tracks added to queue`),children:["+ ",be.length]})]}),a.jsxs("div",{className:"browser-list",children:[N&&a.jsx(Dp,{album:N,onBack:A,onAdd:e}),!N&&c&&a.jsxs("div",{className:"browser-msg",children:["Loading ",t.label.toLowerCase(),"…"]}),!N&&ke&&a.jsx(Fp,{albums:F,covers:o,onOpen:M}),!N&&!ke&&!g&&!w&&!c&&(s==null?void 0:s.map(k=>{const L=k.type==="track";return a.jsxs("div",{className:`browser-row ${L?"":"browser-row--dir"}`,onClick:()=>!L&&M(k),children:[a.jsx("span",{className:"browser-type mono",children:Ip[k.type]??"···"}),a.jsx("span",{className:"browser-name",children:k.name}),L?a.jsx(je,{className:"browser-add-btn",title:"Add track to queue",onClick:R=>{R.stopPropagation(),e([k.uri],"Track added to queue")},children:"+"}):a.jsx("span",{className:"browser-arrow",children:"›"})]},k.uri)})),!N&&!g&&!w&&!c&&(s==null?void 0:s.length)===0&&a.jsxs("div",{className:"browser-msg",children:["No ",t.label.toLowerCase()," found here."]}),!N&&w&&!c&&v.map((k,L)=>{var R,U,Le,Se;return a.jsxs("div",{className:"browser-row browser-row--search",children:[a.jsx("span",{className:"search-thumb",children:Un(m,k.uri)||Un(m,(R=k.album)==null?void 0:R.uri)?a.jsx("img",{src:Un(m,k.uri)||Un(m,(U=k.album)==null?void 0:U.uri),alt:"",loading:"lazy"}):"TRK"}),a.jsxs("div",{className:"browser-name-col",children:[a.jsx("span",{className:"browser-name",children:k.name}),((Le=k.artists)==null?void 0:Le.length)>0&&a.jsx("span",{className:"browser-sub",children:k.artists.map(ft=>ft.name).join(", ")}),((Se=k.album)==null?void 0:Se.name)&&a.jsx("span",{className:"browser-sub",children:k.album.name})]}),a.jsx(je,{className:"browser-add-btn",title:"Add track to queue",onClick:()=>e([k.uri],"Track added to queue"),children:"+"})]},`${k.uri}-${L}`)}),g&&!w&&!c&&!p.trim()&&a.jsx("div",{className:"browser-msg",children:"Enter a search term to find tracks."}),w&&!c&&v.length===0&&a.jsxs("div",{className:"browser-msg",children:["No tracks matched “",p,"”."]})]})]})}function Up({onAdd:e}){const[t,n]=j.useState(!0);return a.jsxs("div",{children:[a.jsxs("button",{className:"section-toggle",onClick:()=>n(r=>!r),children:["BROWSE LIBRARY ",t?"▲":"▼"]}),t&&a.jsx(Ap,{onAdd:e})]})}function Bp(){const e=Ep(),[t,n]=j.useState(!1),[r,l]=j.useState(null),[s,i]=j.useState(null),o=j.useRef(null);j.useEffect(()=>{let g=!1;const x=()=>{Xn.visualizer().then(S=>{!g&&Array.isArray(S.bars)&&l(S.bars)}).catch(()=>{g||l(null)})};x();const w=setInterval(x,300);return()=>{g=!0,clearInterval(w)}},[]),j.useEffect(()=>()=>window.clearTimeout(o.current),[]);const u=e.playbackState==="playing",c=e.duration>0?e.position/e.duration*100:0,f=g=>{const x=g.currentTarget.getBoundingClientRect(),w=(g.clientX-x.left)/x.width;e.seek(Math.round(w*e.duration))},p=g=>{i(g),window.clearTimeout(o.current),o.current=window.setTimeout(()=>i(null),1800)},h=async(g,x="Added to queue")=>{if(g!=null&&g.length){p("Adding…");try{await e.addTracks(g),p(x)}catch(w){throw p(w.message||"Could not add tracks"),w}}};return a.jsxs("div",{className:"panel",children:[s&&a.jsx("div",{className:"action-toast",role:"status",children:s}),!e.connected&&a.jsxs("div",{className:"panel-error",children:[a.jsx("span",{className:"dot dot-red"})," Mopidy unreachable"]}),a.jsxs("section",{className:"panel-section",children:[a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"NOW PLAYING"}),e.connected&&a.jsx("span",{className:`dot ${u?"dot-green":"dot-dim"}`})]}),a.jsx(Mp,{track:e.currentTrack,bars:r}),a.jsx("div",{className:"progress-bar",onClick:f,children:a.jsx("div",{className:"progress-fill",style:{width:`${c}%`}})}),a.jsxs("div",{className:"progress-times",children:[a.jsx("span",{className:"mono",children:Sl(e.position)}),a.jsx("span",{className:"mono",children:Sl(e.duration)})]})]}),a.jsx("section",{className:"panel-section",children:a.jsxs("div",{className:"transport-panel",children:[a.jsxs("div",{className:"transport-main",children:[a.jsxs("div",{className:"transport",children:[a.jsx(je,{className:"transport-btn",onClick:e.previous,title:"Previous track",children:"⏮"}),a.jsx(je,{className:`transport-btn transport-btn--play ${u?"transport-btn--active":""}`,onClick:u?e.pause:e.resume,title:u?"Pause":"Play",children:u?"⏸":"▶"}),a.jsx(je,{className:"transport-btn",onClick:e.next,title:"Next track",children:"⏭"}),a.jsx(je,{className:"transport-btn transport-btn--stop",onClick:e.stop,title:"Stop",children:"⏹"}),a.jsxs(je,{className:`transport-btn transport-btn--queue ${t?"transport-btn--active":""}`,onClick:()=>n(g=>!g),title:"Queue",children:["☰ ",a.jsx("span",{className:"queue-count",children:e.tracklist.length})]})]}),a.jsxs("div",{className:"transport-volume",children:[a.jsx("span",{className:"transport-volume-label mono",children:e.volume??"--"}),a.jsxs("div",{className:"vol-slider vol-slider--sm",children:[a.jsx("div",{className:"vol-fill",style:{width:`${e.volume??0}%`}}),a.jsx("input",{type:"range",min:0,max:100,step:1,value:e.volume??0,onChange:g=>e.setVolume(parseInt(g.target.value))})]})]})]}),a.jsxs("div",{className:"transport-toggles",children:[a.jsx(Fr,{label:"∞",title:"Repeat",active:e.repeat,onClick:()=>e.setRepeat(!e.repeat)}),a.jsx(Fr,{label:"⤨",title:"Random",active:e.random,onClick:()=>e.setRandom(!e.random)}),a.jsx(Fr,{label:"1",title:"Single track",active:e.single,onClick:()=>e.setSingle(!e.single)}),a.jsx(Fr,{label:e.mute?"🔇":"🔊",title:e.mute?"Unmute":"Mute",active:e.mute,onClick:()=>e.setMute(!e.mute)})]})]})}),t&&a.jsxs("div",{className:"queue-shell",role:"dialog","aria-label":"Queue",children:[a.jsx("button",{className:"queue-backdrop",onClick:()=>n(!1),"aria-label":"Close queue"}),a.jsxs("aside",{className:"queue-drawer",children:[a.jsxs("div",{className:"queue-heading",children:[a.jsxs("div",{children:[a.jsx("span",{className:"section-label",children:"QUEUE"}),a.jsxs("div",{className:"queue-subtitle mono",children:[e.tracklist.length," tracks"]})]}),a.jsxs("div",{className:"queue-heading-actions",children:[e.tracklist.length>0&&a.jsx("button",{className:"danger-btn danger-btn--inline",onClick:e.clearTracklist,children:"Clear"}),a.jsx(je,{className:"queue-close",title:"Close queue",onClick:()=>n(!1),children:"×"})]})]}),a.jsx(zp,{tracklist:e.tracklist,currentTrack:e.currentTrack,onPlay:e.play,onRemove:e.removeTrack}),e.tracklist.length===0&&a.jsx("div",{className:"browser-msg",children:"The queue is empty."})]})]}),a.jsx("section",{className:"panel-section",children:a.jsx(Lp,{playlists:e.playlists,onLoad:e.loadPlaylist})}),a.jsx("section",{className:"panel-section",children:a.jsx(Up,{onAdd:h})})]})}const Vp="/api/snapcast/rpc";function Hp(){var d;const[e,t]=j.useState(null),[n,r]=j.useState(!1),[l,s]=j.useState(null),i=j.useRef(1),o=j.useCallback(async(m,y={})=>{const N=i.current++,E=await fetch(Vp,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:N,method:m,params:y})});if(!E.ok)throw new Error(`Snapcast RPC ${m}: ${E.status}`);const _=await E.json();if(_.error)throw new Error(`Snapcast: ${_.error.message}`);return _.result},[]),u=j.useCallback(()=>o("Server.GetStatus").then(m=>{t((m==null?void 0:m.server)??m),r(!0),s(null)}).catch(m=>{r(!1),s(m.message)}),[o]);j.useEffect(()=>{u();const m=setInterval(u,5e3);return()=>{clearInterval(m)}},[u]);const c=((d=e==null?void 0:e.groups)==null?void 0:d.filter(Boolean).flatMap(m=>m.clients.map(y=>({...y,groupId:m.id,groupName:m.name,stream:m.stream_id}))))??[],f=(e==null?void 0:e.groups)??[],p=(e==null?void 0:e.streams)??[],h=j.useCallback((m,y)=>o("Client.SetVolume",{id:m,volume:{percent:y,muted:!1}}).then(u),[o,u]),g=j.useCallback((m,y)=>{var N,E,_;return o("Client.SetVolume",{id:m,volume:{percent:((_=(E=(N=c.find(M=>M.id===m))==null?void 0:N.config)==null?void 0:E.volume)==null?void 0:_.percent)??100,muted:y}}).then(u)},[o,u,c]),x=j.useCallback((m,y)=>o("Group.SetStream",{id:m,stream_id:y}).then(u),[o,u]),w=j.useCallback((m,y)=>o("Group.SetMute",{id:m,mute:y}).then(u),[o,u]),S=j.useCallback(async(m,y)=>{var E;const N=((E=f.find(_=>_.id===m))==null?void 0:E.clients)??[];await Promise.all(N.map(_=>o("Client.SetVolume",{id:_.id,volume:{percent:y,muted:!1}}))),u()},[o,u,f]),v=j.useCallback(m=>o("Server.DeleteClient",{id:m}).then(u),[o,u]);return{server:e,clients:c,groups:f,streams:p,connected:n,error:l,setClientVolume:h,setClientMute:g,setGroupStream:x,setGroupMute:w,setGroupVolume:S,deleteClient:v,refresh:u}}const Wp=[28,56,38,72,46,84,31,63,51,76,42,68,34,58,87,45,70,36,62,49,79,40,66,53];function Qp({bars:e}){const t=e!=null&&e.length?e:Wp;return a.jsx("div",{className:`cava-overlay cava-overlay--snapcast ${e!=null&&e.length?"cava-overlay--live":""}`,"aria-hidden":"true",children:t.map((n,r)=>a.jsx("span",{style:{"--bar-height":`${n}%`,"--bar-delay":`${r*-.055}s`}},`${n}-${r}`))})}function qp({activeStream:e}){const[t,n]=j.useState(null),[r,l]=j.useState(!1),[s,i]=j.useState(!1),[o,u]=j.useState(null),[c,f]=j.useState(null),p=j.useCallback((S=!1)=>{if(!e)return;S?i(!0):l(!0),u(null),(S?Xn.recognize():Xn.get()).then(n).catch(d=>u(d.message)).finally(()=>{l(!1),i(!1)})},[e]);j.useEffect(()=>{p(!1);const S=setInterval(()=>p(!1),15e3);return()=>clearInterval(S)},[p]),j.useEffect(()=>{let S=!1;const v=()=>{Xn.visualizer().then(m=>{!S&&Array.isArray(m.bars)&&f(m.bars)}).catch(()=>{S||f(null)})};v();const d=setInterval(v,180);return()=>{S=!0,clearInterval(d)}},[]);const h=t==null?void 0:t.metadata,g=(h==null?void 0:h.title)||"Unknown title",x=(h==null?void 0:h.artist)||"Unknown artist",w=h==null?void 0:h.album;return a.jsxs("section",{className:"panel-section",children:[a.jsxs("div",{className:"section-header",children:[a.jsxs("div",{children:[a.jsx("span",{className:"section-label",children:"NOW PLAYING"}),e&&a.jsxs("div",{className:"snap-source mono",children:["Source: ",e]})]}),a.jsx("button",{className:"recognize-btn",onClick:()=>p(!0),disabled:s||!e,children:s?"Listening…":"Identify"})]}),a.jsx("div",{className:"snap-now",children:a.jsxs("div",{className:"snap-art",children:[h!=null&&h.artwork?a.jsx("img",{src:h.artwork,alt:""}):a.jsx("span",{children:"♪"}),a.jsxs("div",{className:"snap-meta",children:[a.jsx("div",{className:"snap-title",children:r?"Loading…":g}),a.jsx("div",{className:"snap-artist",children:x}),w&&a.jsx("div",{className:"snap-album",children:w}),(h==null?void 0:h.message)&&a.jsx("div",{className:"snap-extra",children:h.message}),o&&a.jsx("div",{className:"snap-error",children:o})]}),a.jsx(Qp,{bars:c})]})})]})}function Gp({client:e,streams:t,onVolume:n,onMute:r,onDelete:l}){var u,c,f,p,h,g,x,w;const s=((c=(u=e.config)==null?void 0:u.volume)==null?void 0:c.percent)??100,i=((p=(f=e.config)==null?void 0:f.volume)==null?void 0:p.muted)??!1,o=e.connected;return a.jsxs("div",{className:`client-row ${o?"":"client-row--offline"}`,children:[a.jsxs("div",{className:"client-header",children:[a.jsxs("div",{className:"client-name-block",children:[a.jsx("span",{className:`dot ${o?"dot-green":"dot-dim"}`}),a.jsx("span",{className:"client-name",children:((h=e.config)==null?void 0:h.name)||((g=e.host)==null?void 0:g.name)||e.id}),((x=e.host)==null?void 0:x.name)&&((w=e.config)==null?void 0:w.name)&&e.host.name!==e.config.name&&a.jsxs("span",{className:"client-host mono",children:["(",e.host.name,")"]})]}),a.jsxs("div",{className:"client-actions",children:[a.jsx("span",{className:"client-stream mono",children:e.stream}),a.jsx("button",{className:`mute-btn ${i?"mute-btn--muted":""}`,onClick:()=>r(e.id,!i),title:i?"Unmute":"Mute",children:i?"🔇":"🔊"}),a.jsx("button",{className:"delete-btn",onClick:()=>l(e.id),title:"Remove client",children:"✕"})]})]}),a.jsxs("div",{className:"client-vol-row",children:[a.jsxs("div",{className:"vol-slider",children:[a.jsx("div",{className:"vol-fill",style:{width:`${i?0:s}%`,opacity:i?.3:1}}),a.jsx("input",{type:"range",min:0,max:100,step:1,value:s,disabled:!o,onChange:S=>n(e.id,parseInt(S.target.value))})]}),a.jsx("span",{className:"param-value mono",children:s})]})]})}function Kp({group:e,allStreams:t,clients:n,onVolume:r,onMute:l,onDelete:s,onGroupStream:i,onGroupMute:o,onGroupVolume:u}){const c=n.filter(S=>S.groupId===e.id),f=e.muted??!1,[p,h]=j.useState(null),g=c.filter(S=>S.connected),x=g.length>0?Math.round(g.reduce((S,v)=>{var d,m;return S+(((m=(d=v.config)==null?void 0:d.volume)==null?void 0:m.percent)??100)},0)/g.length):100,w=p??x;return a.jsxs("div",{className:"group-section",children:[a.jsxs("div",{className:"group-header",children:[a.jsx("span",{className:"group-name",children:e.name||`Group ${e.id.slice(0,8)}`}),a.jsxs("div",{className:"group-controls",children:[t.length>1&&a.jsx("select",{className:"select select--sm",value:e.stream_id,onChange:S=>i(e.id,S.target.value),children:t.map(S=>a.jsx("option",{value:S.id,children:S.id},S.id))}),a.jsx("button",{className:`mute-btn ${f?"mute-btn--muted":""}`,onClick:()=>o(e.id,!f),children:f?"🔇 GROUP":"🔊 GROUP"})]})]}),g.length>0&&a.jsxs("div",{className:"group-vol",children:[a.jsx("span",{className:"group-vol-label mono",children:"ALL"}),a.jsxs("div",{className:"vol-slider",style:{flex:1},children:[a.jsx("div",{className:"vol-fill",style:{width:`${w}%`}}),a.jsx("input",{type:"range",min:0,max:100,step:1,value:w,onChange:S=>h(parseInt(S.target.value)),onMouseUp:S=>{u(e.id,parseInt(S.target.value)),h(null)},onTouchEnd:S=>{u(e.id,parseInt(S.target.value)),h(null)}})]}),a.jsx("span",{className:"param-value mono",children:w})]}),c.map(S=>a.jsx(Gp,{client:S,streams:t,onVolume:r,onMute:l,onDelete:s},S.id))]})}function Yp(){var g;const{groups:e,streams:t,clients:n,connected:r,error:l,setClientVolume:s,setClientMute:i,setGroupStream:o,setGroupMute:u,setGroupVolume:c,deleteClient:f}=Hp(),p=n.filter(x=>x.connected).length,h=(g=e.find(x=>{var w;return(w=x.clients)==null?void 0:w.some(S=>S.connected)}))==null?void 0:g.stream_id;return a.jsxs("div",{className:"panel",children:[a.jsx("section",{className:"panel-section",children:a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"SNAPCAST"}),a.jsxs("span",{className:"section-value",children:[a.jsx("span",{className:`dot ${r?"dot-green":"dot-red"}`}),a.jsx("span",{className:"mono",style:{marginLeft:6},children:r?`${p}/${n.length} online`:"disconnected"})]})]})}),l&&a.jsx("div",{className:"panel-error",children:l}),r&&a.jsx(qp,{activeStream:h}),t.length>0&&a.jsxs("section",{className:"panel-section",children:[a.jsx("div",{className:"section-header",children:a.jsx("span",{className:"section-label",children:"STREAMS"})}),a.jsx("div",{className:"stream-list",children:t.map(x=>{var w,S;return a.jsxs("div",{className:"stream-row",children:[a.jsx("span",{className:`dot ${x.status==="playing"?"dot-green":"dot-dim"}`}),a.jsx("span",{className:"stream-id mono",children:x.id}),a.jsx("span",{className:"stream-status",children:x.status}),((S=(w=x.uri)==null?void 0:w.query)==null?void 0:S.name)&&a.jsx("span",{className:"stream-name",children:x.uri.query.name})]},x.id)})})]}),e.length>0&&a.jsxs("section",{className:"panel-section",children:[a.jsx("div",{className:"section-header",children:a.jsx("span",{className:"section-label",children:"CLIENTS"})}),e.map(x=>a.jsx(Kp,{group:x,allStreams:t,clients:n,onVolume:s,onMute:i,onDelete:f,onGroupStream:o,onGroupMute:u,onGroupVolume:c},x.id))]}),r&&n.length===0&&a.jsx("div",{className:"panel-empty",children:"No Snapcast clients connected"})]})}const Zr=[{key:"mopidy",label:"Mopidy",desc:"Music server",check:()=>fetch("/api/mopidy/rpc",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"core.get_version"})}).then(e=>e.ok)},{key:"snapcast",label:"Snapserver",desc:"Multiroom audio",check:()=>fetch("/api/snapcast/rpc",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"Server.GetStatus"})}).then(e=>e.ok)},{key:"hifiberry",label:"HiFiBerry DSP",desc:"Audio processor (BeoCreate)",check:()=>fetch("/api/hifiberry/version").then(e=>e.ok)},{key:"nowplaying",label:"Now Playing",desc:"Song recognition + visualizer",check:()=>fetch("/api/now-playing/health").then(e=>e.ok)}];function Xp(){const e=Object.fromEntries(Zr.map(l=>[l.key,"checking"])),[t,n]=j.useState(e),r=j.useCallback(async()=>{n(Object.fromEntries(Zr.map(s=>[s.key,"checking"])));const l=await Promise.all(Zr.map(s=>s.check().then(i=>[s.key,i?"ok":"error"]).catch(()=>[s.key,"error"])));n(Object.fromEntries(l))},[]);return j.useEffect(()=>{r()},[r]),{statuses:t,check:r}}function Zp({status:e}){const t=`settings-service-badge settings-service-badge--${e}`,n=e==="checking"?"checking":e==="ok"?"online":"offline";return a.jsx("span",{className:t,children:n})}const Jp=[{key:"snapcast_url",label:"Snapcast RPC URL",hint:"Used by the Now Playing service"},{key:"mopidy_url",label:"Mopidy RPC URL",hint:"Used by the Now Playing service"},{key:"beocreate_host",label:"HiFiBerry host",hint:"BeoCreate Pi hostname or IP"},{key:"beocreate_port",label:"HiFiBerry port",hint:"",small:!0}];function bp(){const[e,t]=j.useState(null),[n,r]=j.useState("idle"),[l,s]=j.useState([]);j.useEffect(()=>{fetch("/api/now-playing/config").then(u=>u.json()).then(u=>t(u)).catch(()=>{})},[]);const i=(u,c)=>t(f=>({...f,[u]:c})),o=async()=>{r("saving"),s([]);try{const u=await fetch("/api/now-playing/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),c=await u.json();if(!u.ok)throw new Error(c.error||u.status);r("ok"),s(c.restart_required||[])}catch{r("error")}setTimeout(()=>r("idle"),6e3)};return e?a.jsxs(a.Fragment,{children:[Jp.map(({key:u,label:c,hint:f,small:p})=>a.jsxs("div",{className:"settings-row",children:[a.jsxs("div",{className:"settings-row-left",children:[a.jsx("div",{className:"settings-row-label",children:c}),f&&a.jsx("div",{className:"settings-row-hint",children:f})]}),a.jsx("input",{className:`settings-input${p?" settings-input--sm":""}`,value:e[u]??"",onChange:h=>i(u,h.target.value),spellCheck:!1})]},u)),a.jsx("div",{style:{display:"flex",justifyContent:"flex-end",marginTop:12},children:a.jsx("button",{className:"settings-action-btn",onClick:o,disabled:n==="saving",children:n==="saving"?"Saving…":"Save"})}),n==="ok"&&a.jsx("p",{className:"settings-feedback settings-feedback--ok",children:"✓ Settings saved"}),n==="error"&&a.jsx("p",{className:"settings-feedback settings-feedback--error",children:"✗ Failed to save settings"}),l.length>0&&a.jsxs("p",{className:"settings-feedback settings-feedback--warn",children:["↺ Restart required to apply ",l.join(", ")," changes:",a.jsx("br",{}),a.jsxs("code",{children:["docker compose restart ",l.join(" ")]})]})]}):a.jsx("div",{className:"settings-row-hint",children:"Connecting to now-playing service…"})}function em(){const{statuses:e,check:t}=Xp(),[n,r]=j.useState("idle"),l=async()=>{r("scanning");try{await I.localScan(),r("done")}catch{r("error")}setTimeout(()=>r("idle"),4e3)};return a.jsxs("div",{className:"panel",children:[a.jsxs("div",{className:"panel-section",children:[a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"SERVICES"}),a.jsx("button",{className:"icon-btn",style:{fontSize:"15px",padding:"1px 7px"},title:"Recheck all services",onClick:t,children:"↺"})]}),a.jsx("div",{className:"settings-service-list",children:Zr.map(s=>a.jsxs("div",{className:"settings-service-row",children:[a.jsxs("div",{style:{flex:1},children:[a.jsx("div",{className:"settings-service-label",children:s.label}),a.jsx("div",{className:"settings-service-desc",children:s.desc})]}),a.jsx(Zp,{status:e[s.key]})]},s.key))})]}),a.jsxs("div",{className:"panel-section",children:[a.jsx("div",{className:"section-label",style:{marginBottom:14},children:"CONNECTIONS"}),a.jsx(bp,{})]}),a.jsxs("div",{className:"panel-section",children:[a.jsx("div",{className:"section-label",style:{marginBottom:14},children:"MOPIDY"}),a.jsxs("div",{className:"settings-row",children:[a.jsxs("div",{className:"settings-row-left",children:[a.jsx("div",{className:"settings-row-label",children:"Local library scan"}),a.jsx("div",{className:"settings-row-hint",children:"Re-index files in the music directory"})]}),a.jsx("button",{className:"settings-action-btn",onClick:l,disabled:n==="scanning",children:n==="scanning"?"Scanning…":"Scan"})]}),(n==="done"||n==="error")&&a.jsx("p",{className:`settings-feedback settings-feedback--${n==="done"?"ok":"error"}`,children:n==="done"?"✓ Scan started":"✗ Failed to start scan"})]})]})}const tm={"--bg":"#1e1e2e","--surface":"#313244","--surface-hi":"#45475a","--border":"#45475a","--border-hi":"#585b70","--accent":"#cba6f7","--accent-lo":"rgba(203,166,247,0.16)","--accent-hi":"#f5c2e7","--blue":"#89b4fa","--mauve":"#cba6f7"};function zt(e,t,n){return Math.max(t,Math.min(n,e))}function Oc(e,t,n){const r=e/255,l=t/255,s=n/255,i=Math.max(r,l,s),o=Math.min(r,l,s);let u=0,c=0;const f=(i+o)/2;if(i!==o){const p=i-o;c=f>.5?p/(2-i-o):p/(i+o),i===r?u=(l-s)/p+(lr.toString(16).padStart(2,"0")).join("")}`}function nm([e,t,n],r){return`rgba(${e},${t},${n},${r})`}function rm([e,t,n]){const r=Oc(e,t,n),l=r.s<.08?267:r.h,s=zt(Math.max(r.s,.36),.36,.76),i=It(l,s,.74),o=It((l+28)%360,zt(s*.86,.32,.72),.82),u=It(l,zt(s*.22,.12,.28),.13),c=It(l,zt(s*.24,.14,.32),.19),f=It(l,zt(s*.22,.12,.3),.27),p=It(l,zt(s*.2,.1,.28),.29),h=It(l,zt(s*.22,.12,.32),.36);return{"--bg":tt(u),"--surface":tt(c),"--surface-hi":tt(f),"--border":tt(p),"--border-hi":tt(h),"--accent":tt(i),"--accent-lo":nm(i,.16),"--accent-hi":tt(o),"--blue":tt(i),"--mauve":tt(o)}}function lm(e,t,n){const{s:r,l}=Oc(e,t,n);return l<.08||l>.92?0:r*1.8+(1-Math.abs(l-.52))*.7}async function sm(e){const t=new Image;t.decoding="async",t.src=e,await new Promise((c,f)=>{t.onload=c,t.onerror=f});const n=document.createElement("canvas"),r=64;n.width=r,n.height=r;const l=n.getContext("2d",{willReadFrequently:!0});l.drawImage(t,0,0,r,r);const s=l.getImageData(0,0,r,r).data,i=new Map;for(let c=0;c>4},${h>>4},${g>>4}`,w=i.get(x)??{r:0,g:0,b:0,count:0};w.r+=p,w.g+=h,w.b+=g,w.count+=1,i.set(x,w)}let o=null,u=-1;for(const c of i.values()){const f=[Math.round(c.r/c.count),Math.round(c.g/c.count),Math.round(c.b/c.count)],p=lm(...f)*Math.log2(c.count+1);p>u&&(u=p,o=f)}return o}function wu(e){const t=document.documentElement;Object.entries(e).forEach(([n,r])=>t.style.setProperty(n,r))}function im(){const e=j.useRef(null);j.useEffect(()=>{let t=!1;const n=async()=>{var l;try{const s=await Xn.get(),i=(l=s==null?void 0:s.metadata)==null?void 0:l.artwork,o=`${(s==null?void 0:s.active_stream)??""}:${i??""}`;if(!i||o===e.current)return;e.current=o;const u=i.startsWith("/api/mopidy-image/")?i:`/api/now-playing/artwork?t=${encodeURIComponent(o)}`,c=await sm(u);!t&&c&&wu(rm(c))}catch{!t&&e.current===null&&wu(tm)}};n();const r=setInterval(n,15e3);return()=>{t=!0,clearInterval(r)}},[])}const om=[{id:"dsp",label:"DSP"},{id:"player",label:"PLAYER"},{id:"network",label:"NETWORK"},{id:"settings",label:"SETTINGS"}];function um(){const[e,t]=j.useState("player");return im(),a.jsxs("div",{className:"app",children:[a.jsxs("header",{className:"app-header",children:[a.jsxs("div",{className:"app-title",children:[a.jsx("span",{className:"app-title-main",children:"AUDIO"}),a.jsx("span",{className:"app-title-sub",children:"CONTROL"})]}),a.jsx("nav",{className:"tab-nav",children:om.map(n=>a.jsx("button",{className:`tab-btn ${e===n.id?"tab-btn--active":""}`,onClick:()=>t(n.id),children:n.label},n.id))})]}),a.jsxs("main",{className:"app-main",children:[e==="dsp"&&a.jsx(Sp,{}),e==="player"&&a.jsx(Bp,{}),e==="network"&&a.jsx(Yp,{}),e==="settings"&&a.jsx(em,{})]})]})}Rc(document.getElementById("root")).render(a.jsx(j.StrictMode,{children:a.jsx(um,{})})); +`+s.stack}return{value:e,source:t,stack:l,digest:null}}function us(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function Ks(e,t){try{console.error(t.value)}catch(n){setTimeout(function(){throw n})}}var Df=typeof WeakMap=="function"?WeakMap:Map;function lc(e,t,n){n=ut(-1,n),n.tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){yl||(yl=!0,li=r),Ks(e,t)},n}function sc(e,t,n){n=ut(-1,n),n.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r=="function"){var l=t.value;n.payload=function(){return r(l)},n.callback=function(){Ks(e,t)}}var s=e.stateNode;return s!==null&&typeof s.componentDidCatch=="function"&&(n.callback=function(){Ks(e,t),typeof r!="function"&&(_t===null?_t=new Set([this]):_t.add(this));var i=t.stack;this.componentDidCatch(t.value,{componentStack:i!==null?i:""})}),n}function Zo(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Df;var l=new Set;r.set(t,l)}else l=r.get(t),l===void 0&&(l=new Set,r.set(t,l));l.has(n)||(l.add(n),e=Jf.bind(null,e,t,n),t.then(e,e))}function Jo(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function bo(e,t,n,r,l){return e.mode&1?(e.flags|=65536,e.lanes=l,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,n.tag===1&&(n.alternate===null?n.tag=17:(t=ut(-1,1),t.tag=2,Et(n,t,1))),n.lanes|=1),e)}var Af=pt.ReactCurrentOwner,ge=!1;function fe(e,t,n,r){t.child=e===null?Ia(t,null,n,r):wn(t,e.child,n,r)}function eu(e,t,n,r,l){n=n.render;var s=t.ref;return mn(t,l),r=Hi(e,t,n,r,s,l),n=Wi(),e!==null&&!ge?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,ft(e,t,l)):(Q&&n&&Li(t),t.flags|=1,fe(e,t,r,l),t.child)}function tu(e,t,n,r,l){if(e===null){var s=n.type;return typeof s=="function"&&!eo(s)&&s.defaultProps===void 0&&n.compare===null&&n.defaultProps===void 0?(t.tag=15,t.type=s,ic(e,t,s,r,l)):(e=Yr(n.type,null,r,t,t.mode,l),e.ref=t.ref,e.return=t,t.child=e)}if(s=e.child,!(e.lanes&l)){var i=s.memoizedProps;if(n=n.compare,n=n!==null?n:lr,n(i,r)&&e.ref===t.ref)return ft(e,t,l)}return t.flags|=1,e=Tt(s,r),e.ref=t.ref,e.return=t,t.child=e}function ic(e,t,n,r,l){if(e!==null){var s=e.memoizedProps;if(lr(s,r)&&e.ref===t.ref)if(ge=!1,t.pendingProps=r=s,(e.lanes&l)!==0)e.flags&131072&&(ge=!0);else return t.lanes=e.lanes,ft(e,t,l)}return Ys(e,t,n,r,l)}function oc(e,t,n){var r=t.pendingProps,l=r.children,s=e!==null?e.memoizedState:null;if(r.mode==="hidden")if(!(t.mode&1))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},V(an,Ne),Ne|=n;else{if(!(n&1073741824))return e=s!==null?s.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,V(an,Ne),Ne|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=s!==null?s.baseLanes:n,V(an,Ne),Ne|=r}else s!==null?(r=s.baseLanes|n,t.memoizedState=null):r=n,V(an,Ne),Ne|=r;return fe(e,t,l,n),t.child}function uc(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Ys(e,t,n,r,l){var s=we(n)?Vt:de.current;return s=gn(t,s),mn(t,l),n=Hi(e,t,n,r,s,l),r=Wi(),e!==null&&!ge?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,ft(e,t,l)):(Q&&r&&Li(t),t.flags|=1,fe(e,t,n,l),t.child)}function nu(e,t,n,r,l){if(we(n)){var s=!0;ul(t)}else s=!1;if(mn(t,l),t.stateNode===null)qr(e,t),rc(t,n,r),Gs(t,n,r,l),r=!0;else if(e===null){var i=t.stateNode,o=t.memoizedProps;i.props=o;var u=i.context,c=n.contextType;typeof c=="object"&&c!==null?c=Fe(c):(c=we(n)?Vt:de.current,c=gn(t,c));var f=n.getDerivedStateFromProps,p=typeof f=="function"||typeof i.getSnapshotBeforeUpdate=="function";p||typeof i.UNSAFE_componentWillReceiveProps!="function"&&typeof i.componentWillReceiveProps!="function"||(o!==r||u!==c)&&Xo(t,i,r,c),gt=!1;var h=t.memoizedState;i.state=h,pl(t,r,i,l),u=t.memoizedState,o!==r||h!==u||ye.current||gt?(typeof f=="function"&&(qs(t,n,f,r),u=t.memoizedState),(o=gt||Yo(t,n,o,r,h,u,c))?(p||typeof i.UNSAFE_componentWillMount!="function"&&typeof i.componentWillMount!="function"||(typeof i.componentWillMount=="function"&&i.componentWillMount(),typeof i.UNSAFE_componentWillMount=="function"&&i.UNSAFE_componentWillMount()),typeof i.componentDidMount=="function"&&(t.flags|=4194308)):(typeof i.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=u),i.props=r,i.state=u,i.context=c,r=o):(typeof i.componentDidMount=="function"&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,$a(e,t),o=t.memoizedProps,c=t.type===t.elementType?o:Ue(t.type,o),i.props=c,p=t.pendingProps,h=i.context,u=n.contextType,typeof u=="object"&&u!==null?u=Fe(u):(u=we(n)?Vt:de.current,u=gn(t,u));var g=n.getDerivedStateFromProps;(f=typeof g=="function"||typeof i.getSnapshotBeforeUpdate=="function")||typeof i.UNSAFE_componentWillReceiveProps!="function"&&typeof i.componentWillReceiveProps!="function"||(o!==p||h!==u)&&Xo(t,i,r,u),gt=!1,h=t.memoizedState,i.state=h,pl(t,r,i,l);var x=t.memoizedState;o!==p||h!==x||ye.current||gt?(typeof g=="function"&&(qs(t,n,g,r),x=t.memoizedState),(c=gt||Yo(t,n,c,r,h,x,u)||!1)?(f||typeof i.UNSAFE_componentWillUpdate!="function"&&typeof i.componentWillUpdate!="function"||(typeof i.componentWillUpdate=="function"&&i.componentWillUpdate(r,x,u),typeof i.UNSAFE_componentWillUpdate=="function"&&i.UNSAFE_componentWillUpdate(r,x,u)),typeof i.componentDidUpdate=="function"&&(t.flags|=4),typeof i.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof i.componentDidUpdate!="function"||o===e.memoizedProps&&h===e.memoizedState||(t.flags|=4),typeof i.getSnapshotBeforeUpdate!="function"||o===e.memoizedProps&&h===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=x),i.props=r,i.state=x,i.context=u,r=c):(typeof i.componentDidUpdate!="function"||o===e.memoizedProps&&h===e.memoizedState||(t.flags|=4),typeof i.getSnapshotBeforeUpdate!="function"||o===e.memoizedProps&&h===e.memoizedState||(t.flags|=1024),r=!1)}return Xs(e,t,n,r,s,l)}function Xs(e,t,n,r,l,s){uc(e,t);var i=(t.flags&128)!==0;if(!r&&!i)return l&&Bo(t,n,!1),ft(e,t,s);r=t.stateNode,Af.current=t;var o=i&&typeof n.getDerivedStateFromError!="function"?null:r.render();return t.flags|=1,e!==null&&i?(t.child=wn(t,e.child,null,s),t.child=wn(t,null,o,s)):fe(e,t,o,s),t.memoizedState=r.state,l&&Bo(t,n,!0),t.child}function ac(e){var t=e.stateNode;t.pendingContext?Uo(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Uo(e,t.context,!1),Ai(e,t.containerInfo)}function ru(e,t,n,r,l){return yn(),zi(l),t.flags|=256,fe(e,t,n,r),t.child}var Zs={dehydrated:null,treeContext:null,retryLane:0};function Js(e){return{baseLanes:e,cachePool:null,transitions:null}}function cc(e,t,n){var r=t.pendingProps,l=q.current,s=!1,i=(t.flags&128)!==0,o;if((o=i)||(o=e!==null&&e.memoizedState===null?!1:(l&2)!==0),o?(s=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(l|=1),V(q,l&1),e===null)return Ws(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(t.mode&1?e.data==="$!"?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(i=r.children,e=r.fallback,s?(r=t.mode,s=t.child,i={mode:"hidden",children:i},!(r&1)&&s!==null?(s.childLanes=0,s.pendingProps=i):s=Il(i,r,0,null),e=Bt(e,r,n,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Js(n),t.memoizedState=Zs,e):Gi(t,i));if(l=e.memoizedState,l!==null&&(o=l.dehydrated,o!==null))return Uf(e,t,i,r,o,l,n);if(s){s=r.fallback,i=t.mode,l=e.child,o=l.sibling;var u={mode:"hidden",children:r.children};return!(i&1)&&t.child!==l?(r=t.child,r.childLanes=0,r.pendingProps=u,t.deletions=null):(r=Tt(l,u),r.subtreeFlags=l.subtreeFlags&14680064),o!==null?s=Tt(o,s):(s=Bt(s,i,n,null),s.flags|=2),s.return=t,r.return=t,r.sibling=s,t.child=r,r=s,s=t.child,i=e.child.memoizedState,i=i===null?Js(n):{baseLanes:i.baseLanes|n,cachePool:null,transitions:i.transitions},s.memoizedState=i,s.childLanes=e.childLanes&~n,t.memoizedState=Zs,r}return s=e.child,e=s.sibling,r=Tt(s,{mode:"visible",children:r.children}),!(t.mode&1)&&(r.lanes=n),r.return=t,r.sibling=null,e!==null&&(n=t.deletions,n===null?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=r,t.memoizedState=null,r}function Gi(e,t){return t=Il({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function zr(e,t,n,r){return r!==null&&zi(r),wn(t,e.child,null,n),e=Gi(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function Uf(e,t,n,r,l,s,i){if(n)return t.flags&256?(t.flags&=-257,r=us(Error(C(422))),zr(e,t,i,r)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(s=r.fallback,l=t.mode,r=Il({mode:"visible",children:r.children},l,0,null),s=Bt(s,l,i,null),s.flags|=2,r.return=t,s.return=t,r.sibling=s,t.child=r,t.mode&1&&wn(t,e.child,null,i),t.child.memoizedState=Js(i),t.memoizedState=Zs,s);if(!(t.mode&1))return zr(e,t,i,null);if(l.data==="$!"){if(r=l.nextSibling&&l.nextSibling.dataset,r)var o=r.dgst;return r=o,s=Error(C(419)),r=us(s,r,void 0),zr(e,t,i,r)}if(o=(i&e.childLanes)!==0,ge||o){if(r=te,r!==null){switch(i&-i){case 4:l=2;break;case 16:l=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:l=32;break;case 536870912:l=268435456;break;default:l=0}l=l&(r.suspendedLanes|i)?0:l,l!==0&&l!==s.retryLane&&(s.retryLane=l,dt(e,l),We(r,e,l,-1))}return bi(),r=us(Error(C(421))),zr(e,t,i,r)}return l.data==="$?"?(t.flags|=128,t.child=e.child,t=bf.bind(null,e),l._reactRetry=t,null):(e=s.treeContext,Ce=Ct(l.nextSibling),Ee=t,Q=!0,Ve=null,e!==null&&(ze[Ie++]=it,ze[Ie++]=ot,ze[Ie++]=Ht,it=e.id,ot=e.overflow,Ht=t),t=Gi(t,r.children),t.flags|=4096,t)}function lu(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),Qs(e.return,t,n)}function as(e,t,n,r,l){var s=e.memoizedState;s===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:l}:(s.isBackwards=t,s.rendering=null,s.renderingStartTime=0,s.last=r,s.tail=n,s.tailMode=l)}function dc(e,t,n){var r=t.pendingProps,l=r.revealOrder,s=r.tail;if(fe(e,t,r.children,n),r=q.current,r&2)r=r&1|2,t.flags|=128;else{if(e!==null&&e.flags&128)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&lu(e,n,t);else if(e.tag===19)lu(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(V(q,r),!(t.mode&1))t.memoizedState=null;else switch(l){case"forwards":for(n=t.child,l=null;n!==null;)e=n.alternate,e!==null&&ml(e)===null&&(l=n),n=n.sibling;n=l,n===null?(l=t.child,t.child=null):(l=n.sibling,n.sibling=null),as(t,!1,l,n,s);break;case"backwards":for(n=null,l=t.child,t.child=null;l!==null;){if(e=l.alternate,e!==null&&ml(e)===null){t.child=l;break}e=l.sibling,l.sibling=n,n=l,l=e}as(t,!0,n,null,s);break;case"together":as(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function qr(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function ft(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),Qt|=t.lanes,!(n&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(C(153));if(t.child!==null){for(e=t.child,n=Tt(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=Tt(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function Bf(e,t,n){switch(t.tag){case 3:ac(t),yn();break;case 5:Fa(t);break;case 1:we(t.type)&&ul(t);break;case 4:Ai(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,l=t.memoizedProps.value;V(dl,r._currentValue),r._currentValue=l;break;case 13:if(r=t.memoizedState,r!==null)return r.dehydrated!==null?(V(q,q.current&1),t.flags|=128,null):n&t.child.childLanes?cc(e,t,n):(V(q,q.current&1),e=ft(e,t,n),e!==null?e.sibling:null);V(q,q.current&1);break;case 19:if(r=(n&t.childLanes)!==0,e.flags&128){if(r)return dc(e,t,n);t.flags|=128}if(l=t.memoizedState,l!==null&&(l.rendering=null,l.tail=null,l.lastEffect=null),V(q,q.current),r)break;return null;case 22:case 23:return t.lanes=0,oc(e,t,n)}return ft(e,t,n)}var fc,bs,pc,mc;fc=function(e,t){for(var n=t.child;n!==null;){if(n.tag===5||n.tag===6)e.appendChild(n.stateNode);else if(n.tag!==4&&n.child!==null){n.child.return=n,n=n.child;continue}if(n===t)break;for(;n.sibling===null;){if(n.return===null||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}};bs=function(){};pc=function(e,t,n,r){var l=e.memoizedProps;if(l!==r){e=t.stateNode,At(Je.current);var s=null;switch(n){case"input":l=ks(e,l),r=ks(e,r),s=[];break;case"select":l=K({},l,{value:void 0}),r=K({},r,{value:void 0}),s=[];break;case"textarea":l=js(e,l),r=js(e,r),s=[];break;default:typeof l.onClick!="function"&&typeof r.onClick=="function"&&(e.onclick=il)}Es(n,r);var i;n=null;for(c in l)if(!r.hasOwnProperty(c)&&l.hasOwnProperty(c)&&l[c]!=null)if(c==="style"){var o=l[c];for(i in o)o.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else c!=="dangerouslySetInnerHTML"&&c!=="children"&&c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&c!=="autoFocus"&&(Zn.hasOwnProperty(c)?s||(s=[]):(s=s||[]).push(c,null));for(c in r){var u=r[c];if(o=l!=null?l[c]:void 0,r.hasOwnProperty(c)&&u!==o&&(u!=null||o!=null))if(c==="style")if(o){for(i in o)!o.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in u)u.hasOwnProperty(i)&&o[i]!==u[i]&&(n||(n={}),n[i]=u[i])}else n||(s||(s=[]),s.push(c,n)),n=u;else c==="dangerouslySetInnerHTML"?(u=u?u.__html:void 0,o=o?o.__html:void 0,u!=null&&o!==u&&(s=s||[]).push(c,u)):c==="children"?typeof u!="string"&&typeof u!="number"||(s=s||[]).push(c,""+u):c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&(Zn.hasOwnProperty(c)?(u!=null&&c==="onScroll"&&H("scroll",e),s||o===u||(s=[])):(s=s||[]).push(c,u))}n&&(s=s||[]).push("style",n);var c=s;(t.updateQueue=c)&&(t.flags|=4)}};mc=function(e,t,n,r){n!==r&&(t.flags|=4)};function zn(e,t){if(!Q)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;n!==null;)n.alternate!==null&&(r=n),n=n.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function ue(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,r=0;if(t)for(var l=e.child;l!==null;)n|=l.lanes|l.childLanes,r|=l.subtreeFlags&14680064,r|=l.flags&14680064,l.return=e,l=l.sibling;else for(l=e.child;l!==null;)n|=l.lanes|l.childLanes,r|=l.subtreeFlags,r|=l.flags,l.return=e,l=l.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Vf(e,t,n){var r=t.pendingProps;switch(Ri(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return ue(t),null;case 1:return we(t.type)&&ol(),ue(t),null;case 3:return r=t.stateNode,xn(),W(ye),W(de),Bi(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(e===null||e.child===null)&&(Lr(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,Ve!==null&&(oi(Ve),Ve=null))),bs(e,t),ue(t),null;case 5:Ui(t);var l=At(ar.current);if(n=t.type,e!==null&&t.stateNode!=null)pc(e,t,n,r,l),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(t.stateNode===null)throw Error(C(166));return ue(t),null}if(e=At(Je.current),Lr(t)){r=t.stateNode,n=t.type;var s=t.memoizedProps;switch(r[Xe]=t,r[or]=s,e=(t.mode&1)!==0,n){case"dialog":H("cancel",r),H("close",r);break;case"iframe":case"object":case"embed":H("load",r);break;case"video":case"audio":for(l=0;l<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[Xe]=t,e[or]=r,fc(e,t,!1,!1),t.stateNode=e;e:{switch(i=_s(n,r),n){case"dialog":H("cancel",e),H("close",e),l=r;break;case"iframe":case"object":case"embed":H("load",e),l=r;break;case"video":case"audio":for(l=0;lSn&&(t.flags|=128,r=!0,zn(s,!1),t.lanes=4194304)}else{if(!r)if(e=ml(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),zn(s,!0),s.tail===null&&s.tailMode==="hidden"&&!i.alternate&&!Q)return ue(t),null}else 2*X()-s.renderingStartTime>Sn&&n!==1073741824&&(t.flags|=128,r=!0,zn(s,!1),t.lanes=4194304);s.isBackwards?(i.sibling=t.child,t.child=i):(n=s.last,n!==null?n.sibling=i:t.child=i,s.last=i)}return s.tail!==null?(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=X(),t.sibling=null,n=q.current,V(q,r?n&1|2:n&1),t):(ue(t),null);case 22:case 23:return Ji(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Ne&1073741824&&(ue(t),t.subtreeFlags&6&&(t.flags|=8192)):ue(t),null;case 24:return null;case 25:return null}throw Error(C(156,t.tag))}function Hf(e,t){switch(Ri(t),t.tag){case 1:return we(t.type)&&ol(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return xn(),W(ye),W(de),Bi(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Ui(t),null;case 13:if(W(q),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(C(340));yn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return W(q),null;case 4:return xn(),null;case 10:return $i(t.type._context),null;case 22:case 23:return Ji(),null;case 24:return null;default:return null}}var Ir=!1,ce=!1,Wf=typeof WeakSet=="function"?WeakSet:Set,T=null;function un(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){Y(e,t,r)}else n.current=null}function ei(e,t,n){try{n()}catch(r){Y(e,t,r)}}var su=!1;function Qf(e,t){if(Fs=rl,e=wa(),Mi(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,s=r.focusNode;r=r.focusOffset;try{n.nodeType,s.nodeType}catch{n=null;break e}var i=0,o=-1,u=-1,c=0,f=0,p=e,h=null;t:for(;;){for(var g;p!==n||l!==0&&p.nodeType!==3||(o=i+l),p!==s||r!==0&&p.nodeType!==3||(u=i+r),p.nodeType===3&&(i+=p.nodeValue.length),(g=p.firstChild)!==null;)h=p,p=g;for(;;){if(p===e)break t;if(h===n&&++c===l&&(o=i),h===s&&++f===r&&(u=i),(g=p.nextSibling)!==null)break;p=h,h=p.parentNode}p=g}n=o===-1||u===-1?null:{start:o,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(Ds={focusedElem:e,selectionRange:n},rl=!1,T=t;T!==null;)if(t=T,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,T=e;else for(;T!==null;){t=T;try{var x=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(x!==null){var w=x.memoizedProps,S=x.memoizedState,v=t.stateNode,d=v.getSnapshotBeforeUpdate(t.elementType===t.type?w:Ue(t.type,w),S);v.__reactInternalSnapshotBeforeUpdate=d}break;case 3:var m=t.stateNode.containerInfo;m.nodeType===1?m.textContent="":m.nodeType===9&&m.documentElement&&m.removeChild(m.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(C(163))}}catch(y){Y(t,t.return,y)}if(e=t.sibling,e!==null){e.return=t.return,T=e;break}T=t.return}return x=su,su=!1,x}function Gn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var s=l.destroy;l.destroy=void 0,s!==void 0&&ei(t,n,s)}l=l.next}while(l!==r)}}function Rl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ti(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function hc(e){var t=e.alternate;t!==null&&(e.alternate=null,hc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Xe],delete t[or],delete t[Bs],delete t[_f],delete t[Pf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function vc(e){return e.tag===5||e.tag===3||e.tag===4}function iu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||vc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ni(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=il));else if(r!==4&&(e=e.child,e!==null))for(ni(e,t,n),e=e.sibling;e!==null;)ni(e,t,n),e=e.sibling}function ri(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(ri(e,t,n),e=e.sibling;e!==null;)ri(e,t,n),e=e.sibling}var re=null,Be=!1;function ht(e,t,n){for(n=n.child;n!==null;)gc(e,t,n),n=n.sibling}function gc(e,t,n){if(Ze&&typeof Ze.onCommitFiberUnmount=="function")try{Ze.onCommitFiberUnmount(jl,n)}catch{}switch(n.tag){case 5:ce||un(n,t);case 6:var r=re,l=Be;re=null,ht(e,t,n),re=r,Be=l,re!==null&&(Be?(e=re,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):re.removeChild(n.stateNode));break;case 18:re!==null&&(Be?(e=re,n=n.stateNode,e.nodeType===8?ns(e.parentNode,n):e.nodeType===1&&ns(e,n),nr(e)):ns(re,n.stateNode));break;case 4:r=re,l=Be,re=n.stateNode.containerInfo,Be=!0,ht(e,t,n),re=r,Be=l;break;case 0:case 11:case 14:case 15:if(!ce&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var s=l,i=s.destroy;s=s.tag,i!==void 0&&(s&2||s&4)&&ei(n,t,i),l=l.next}while(l!==r)}ht(e,t,n);break;case 1:if(!ce&&(un(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(o){Y(n,t,o)}ht(e,t,n);break;case 21:ht(e,t,n);break;case 22:n.mode&1?(ce=(r=ce)||n.memoizedState!==null,ht(e,t,n),ce=r):ht(e,t,n);break;default:ht(e,t,n)}}function ou(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Wf),t.forEach(function(r){var l=ep.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Ae(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=i),r&=~s}if(r=l,r=X()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Gf(r/1960))-r,10e?16:e,kt===null)var r=!1;else{if(e=kt,kt=null,wl=0,D&6)throw Error(C(331));var l=D;for(D|=4,T=e.current;T!==null;){var s=T,i=s.child;if(T.flags&16){var o=s.deletions;if(o!==null){for(var u=0;uX()-Xi?Ut(e,0):Yi|=n),xe(e,t)}function Cc(e,t){t===0&&(e.mode&1?(t=Cr,Cr<<=1,!(Cr&130023424)&&(Cr=4194304)):t=1);var n=pe();e=dt(e,t),e!==null&&(vr(e,t,n),xe(e,n))}function bf(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Cc(e,n)}function ep(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(C(314))}r!==null&&r.delete(t),Cc(e,n)}var Ec;Ec=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||ye.current)ge=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ge=!1,Bf(e,t,n);ge=!!(e.flags&131072)}else ge=!1,Q&&t.flags&1048576&&Ma(t,cl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;qr(e,t),e=t.pendingProps;var l=gn(t,de.current);mn(t,n),l=Hi(null,t,r,e,l,n);var s=Wi();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,we(r)?(s=!0,ul(t)):s=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Di(t),l.updater=Ll,t.stateNode=l,l._reactInternals=t,Gs(t,r,e,n),t=Xs(null,t,r,!0,s,n)):(t.tag=0,Q&&s&&Li(t),fe(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(qr(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=np(r),e=Ue(r,e),l){case 0:t=Ys(null,t,r,e,n);break e;case 1:t=nu(null,t,r,e,n);break e;case 11:t=eu(null,t,r,e,n);break e;case 14:t=tu(null,t,r,Ue(r.type,e),n);break e}throw Error(C(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ue(r,l),Ys(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ue(r,l),nu(e,t,r,l,n);case 3:e:{if(ac(t),e===null)throw Error(C(387));r=t.pendingProps,s=t.memoizedState,l=s.element,$a(e,t),pl(t,r,null,n);var i=t.memoizedState;if(r=i.element,s.isDehydrated)if(s={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){l=kn(Error(C(423)),t),t=ru(e,t,r,n,l);break e}else if(r!==l){l=kn(Error(C(424)),t),t=ru(e,t,r,n,l);break e}else for(Ce=Ct(t.stateNode.containerInfo.firstChild),Ee=t,Q=!0,Ve=null,n=Ia(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(yn(),r===l){t=ft(e,t,n);break e}fe(e,t,r,n)}t=t.child}return t;case 5:return Fa(t),e===null&&Ws(t),r=t.type,l=t.pendingProps,s=e!==null?e.memoizedProps:null,i=l.children,As(r,l)?i=null:s!==null&&As(r,s)&&(t.flags|=32),uc(e,t),fe(e,t,i,n),t.child;case 6:return e===null&&Ws(t),null;case 13:return cc(e,t,n);case 4:return Ai(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=wn(t,null,r,n):fe(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ue(r,l),eu(e,t,r,l,n);case 7:return fe(e,t,t.pendingProps,n),t.child;case 8:return fe(e,t,t.pendingProps.children,n),t.child;case 12:return fe(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,s=t.memoizedProps,i=l.value,V(dl,r._currentValue),r._currentValue=i,s!==null)if(Qe(s.value,i)){if(s.children===l.children&&!ye.current){t=ft(e,t,n);break e}}else for(s=t.child,s!==null&&(s.return=t);s!==null;){var o=s.dependencies;if(o!==null){i=s.child;for(var u=o.firstContext;u!==null;){if(u.context===r){if(s.tag===1){u=ut(-1,n&-n),u.tag=2;var c=s.updateQueue;if(c!==null){c=c.shared;var f=c.pending;f===null?u.next=u:(u.next=f.next,f.next=u),c.pending=u}}s.lanes|=n,u=s.alternate,u!==null&&(u.lanes|=n),Qs(s.return,n,t),o.lanes|=n;break}u=u.next}}else if(s.tag===10)i=s.type===t.type?null:s.child;else if(s.tag===18){if(i=s.return,i===null)throw Error(C(341));i.lanes|=n,o=i.alternate,o!==null&&(o.lanes|=n),Qs(i,n,t),i=s.sibling}else i=s.child;if(i!==null)i.return=s;else for(i=s;i!==null;){if(i===t){i=null;break}if(s=i.sibling,s!==null){s.return=i.return,i=s;break}i=i.return}s=i}fe(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,mn(t,n),l=Fe(l),r=r(l),t.flags|=1,fe(e,t,r,n),t.child;case 14:return r=t.type,l=Ue(r,t.pendingProps),l=Ue(r.type,l),tu(e,t,r,l,n);case 15:return ic(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Ue(r,l),qr(e,t),t.tag=1,we(r)?(e=!0,ul(t)):e=!1,mn(t,n),rc(t,r,l),Gs(t,r,l,n),Xs(null,t,r,!0,e,n);case 19:return dc(e,t,n);case 22:return oc(e,t,n)}throw Error(C(156,t.tag))};function _c(e,t){return ea(e,t)}function tp(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Oe(e,t,n,r){return new tp(e,t,n,r)}function eo(e){return e=e.prototype,!(!e||!e.isReactComponent)}function np(e){if(typeof e=="function")return eo(e)?1:0;if(e!=null){if(e=e.$$typeof,e===wi)return 11;if(e===xi)return 14}return 2}function Tt(e,t){var n=e.alternate;return n===null?(n=Oe(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Yr(e,t,n,r,l,s){var i=2;if(r=e,typeof e=="function")eo(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case Jt:return Bt(n.children,l,s,t);case yi:i=8,l|=8;break;case gs:return e=Oe(12,n,t,l|2),e.elementType=gs,e.lanes=s,e;case ys:return e=Oe(13,n,t,l),e.elementType=ys,e.lanes=s,e;case ws:return e=Oe(19,n,t,l),e.elementType=ws,e.lanes=s,e;case Fu:return Il(n,l,s,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ou:i=10;break e;case $u:i=9;break e;case wi:i=11;break e;case xi:i=14;break e;case vt:i=16,r=null;break e}throw Error(C(130,e==null?e:typeof e,""))}return t=Oe(i,n,t,l),t.elementType=e,t.type=r,t.lanes=s,t}function Bt(e,t,n,r){return e=Oe(7,e,r,t),e.lanes=n,e}function Il(e,t,n,r){return e=Oe(22,e,r,t),e.elementType=Fu,e.lanes=n,e.stateNode={isHidden:!1},e}function cs(e,t,n){return e=Oe(6,e,null,t),e.lanes=n,e}function ds(e,t,n){return t=Oe(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function rp(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Ql(0),this.expirationTimes=Ql(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ql(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function to(e,t,n,r,l,s,i,o,u){return e=new rp(e,t,n,o,u),t===1?(t=1,s===!0&&(t|=8)):t=0,s=Oe(3,null,null,t),e.current=s,s.stateNode=e,s.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Di(s),e}function lp(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Lc)}catch(e){console.error(e)}}Lc(),Lu.exports=Pe;var ap=Lu.exports,Rc,hu=ap;Rc=hu.createRoot,hu.hydrateRoot;const so="/api/hifiberry";async function ae(e){const t=await fetch(`${so}${e}`);if(!t.ok)throw new Error(`HiFiBerry ${e}: ${t.status}`);return t.json()}async function cp(e){const t=await fetch(`${so}${e}`);if(!t.ok)throw new Error(`HiFiBerry ${e}: ${t.status}`);return t.text()}async function On(e,t=null){const n=await fetch(`${so}${e}`,{method:"POST",headers:t!==null?{"Content-Type":"application/json"}:{},body:t!==null?JSON.stringify(t):void 0});if(!n.ok)throw new Error(`HiFiBerry POST ${e}: ${n.status}`);const r=await n.text();return r?JSON.parse(r):null}function fs(e){return Array.isArray(e==null?void 0:e.values)?e.values[0]:null}function dp(e){const t=parseInt(e.join(""),16);return(t&2147483648?t-4294967296:t)/16777216}function fp(e){return{b0:e[2],b1:e[1],b2:e[0],a1:-e[4],a2:-e[3]}}function pp(e){return!(e.length!==5||e.some(t=>!Number.isFinite(t))||e.every(t=>Math.abs(t)<1e-6)||Math.abs(e[2])<1e-5&&Math.abs(e[1])<1e-5&&Math.abs(e[0])<1e-5||e.some(t=>Math.abs(t)>2.2)||e[3]>.05||e[4]<-.05)}function mp(e){var f;const t=new DOMParser().parseFromString(e,"application/xml");if(t.querySelector("parsererror"))return[];if(!Number(((f=[...t.querySelectorAll("metadata")].find(p=>p.getAttribute("type")==="crossoverBands"))==null?void 0:f.textContent)??0))return[];const l=[...t.querySelectorAll("action")].filter(p=>p.getAttribute("ParamName")==="DM0 Data"),s=l[l.length-1];if(!(s!=null&&s.textContent))return[];const i=s.textContent.trim().split(/\s+/),o=[];for(let p=0;p+3x.toFixed(5)).join(",");c.has(g)||(c.add(g),u.push({address:Number(s.getAttribute("addr")??0)+p,type:"Crossover",bypassed:!1,coeffs:fp(h)}))}return u}async function vu(){const e=await ae("/metadata");return(e==null?void 0:e.volumeControlRegister)??null}const ne={getVolume:async()=>{const e=await vu();if(!e)return null;const t=await ae(`/memory/${encodeURIComponent(e)}?format=float`),n=fs(t);return n==null?null:{volume:Math.round(n*100)}},setVolume:async e=>{const t=await vu();return t?On("/memory",{address:t,value:Math.max(0,Math.min(100,e))/100,store:!0}):null},getParameters:async()=>[],getParameter:e=>ae(`/parameter/${encodeURIComponent(e)}`),setParameter:(e,t)=>On(`/parameter/${encodeURIComponent(e)}`,{value:t}),getAllParameterValues:()=>ae("/parametervalues"),getProfiles:async()=>[],getActiveProfile:async()=>{var t;const e=await ae("/metadata");return((t=e==null?void 0:e._system)==null?void 0:t.profileName)??(e==null?void 0:e.profileName)??null},loadProfile:async()=>null,getMetadata:async()=>{const[e,t,n]=await Promise.all([ae("/version").catch(()=>null),ae("/hardware/dsp").catch(()=>null),ae("/metadata").catch(()=>null)]);return{...n??{},version:e,hardware:t}},getFilters:async()=>{const e=await ae("/filters"),t=(e==null?void 0:e.profiles)??{};return Object.values(t).flatMap(n=>Object.values(n).map(r=>{var l,s,i,o;return{address:r.address,bypassed:r.bypassed,type:((l=r.filter)==null?void 0:l.type)??"—",freq:((s=r.filter)==null?void 0:s.f)??null,gain:((i=r.filter)==null?void 0:i.db)??null,q:((o=r.filter)==null?void 0:o.q)??null}}))},getCrossoverFilters:async()=>mp(await cp("/dspprofile")),getMute:async()=>{const e=await ae("/metadata"),t=(e==null?void 0:e.muteRegister)??null;if(!t)return null;const n=await ae(`/memory/${encodeURIComponent(t)}?format=float`),r=fs(n);return r==null?null:{mute:r>=.5}},setMute:async e=>{const t=await ae("/metadata"),n=(t==null?void 0:t.muteRegister)??null;return n?On("/memory",{address:n,value:e?1:0,store:!0}):null},getSpdif:async()=>{const e=await ae("/metadata"),t=(e==null?void 0:e.enableSPDIFRegister)??null;if(!t)return null;const n=await ae(`/memory/${encodeURIComponent(t)}?format=float`),r=fs(n);return r==null?null:{spdif:r>=.5}},setSpdif:async e=>{const t=await ae("/metadata"),n=(t==null?void 0:t.enableSPDIFRegister)??null;return n?On("/memory",{address:n,value:e?1:0,store:!0}):null},getLoudness:()=>ae("/loudness"),setLoudness:e=>On("/loudness",{loudness:e})};function hp(){const[e,t]=j.useState(null),[n,r]=j.useState(null),[l,s]=j.useState(null),[i,o]=j.useState(null),[u,c]=j.useState([]),[f,p]=j.useState([]),[h,g]=j.useState([]),[x,w]=j.useState([]),[S,v]=j.useState(null),[d,m]=j.useState(null),[y,N]=j.useState(null),E=j.useRef(null),_=j.useRef(null),M=j.useRef(null),A=j.useCallback(async()=>{try{const[F,ke,P,k,L,R,U,Le,Se,mt]=await Promise.all([ne.getVolume().catch(()=>null),ne.getParameters().catch(()=>[]),ne.getProfiles().catch(()=>[]),ne.getMetadata(),ne.getActiveProfile().catch(()=>null),ne.getLoudness().catch(()=>null),ne.getMute().catch(()=>null),ne.getSpdif().catch(()=>null),ne.getFilters().catch(()=>[]),ne.getCrossoverFilters().catch(()=>[])]);if(E.current===null&&t((F==null?void 0:F.volume)??F??null),w(P??[]),m(k),v(L),R!==null&&r((R==null?void 0:R.loudness)??null),U!==null&&s((U==null?void 0:U.mute)??null),Le!==null&&o((Le==null?void 0:Le.spdif)??null),c(Array.isArray(Se)?Se:[]),p(Array.isArray(mt)?mt:[]),N(null),Array.isArray(ke)&&ke.length){const tt=await Promise.all(ke.map(qe=>ne.getParameter(qe).then($c=>({name:qe,...$c})).catch(()=>({name:qe,value:null}))));g(tt.filter(qe=>qe.value!==null))}}catch(F){N(F.message)}},[]);j.useEffect(()=>{A();const F=setInterval(A,5e3);return()=>clearInterval(F)},[A]);const z=j.useCallback(F=>{E.current=F,t(F),_.current&&clearTimeout(_.current),_.current=setTimeout(async()=>{try{await ne.setVolume(F)}finally{E.current=null}},150)},[]),ie=j.useCallback((F,ke)=>{g(P=>P.map(k=>k.name===F?{...k,value:ke}:k)),M.current&&clearTimeout(M.current),M.current=setTimeout(()=>{ne.setParameter(F,ke)},150)},[]),Me=j.useCallback(async F=>{await ne.loadProfile(F),v(F),await A()},[A]),be=j.useCallback(async()=>{const F=!n;r(F),await ne.setLoudness(F)},[n]),En=j.useCallback(async()=>{const F=!l;s(F),await ne.setMute(F)},[l]),et=j.useCallback(async()=>{const F=!i;o(F),await ne.setSpdif(F)},[i]);return{volume:e,loudness:n,mute:l,spdif:i,filters:u,crossoverFilters:f,parameters:h,profiles:x,activeProfile:S,metadata:d,error:y,updateVolume:z,updateParameter:ie,switchProfile:Me,toggleLoudness:be,toggleMute:En,toggleSpdif:et,refresh:A}}const mr=20,zc=2e4,gu=140,Ke=-18,Xt=18;function Xr(e,t,n){return Math.max(t,Math.min(n,e))}function ps(e){return(Math.log10(e)-Math.log10(mr))/(Math.log10(zc)-Math.log10(mr))}function vp(){return Array.from({length:gu},(e,t)=>{const n=t/(gu-1);return mr*Math.pow(zc/mr,n)})}function gp(e=""){const t=String(e).toLowerCase().replace(/[\s_-]/g,"");return t.includes("highpass")||t==="hp"||t.includes("hpf")?"highpass":t.includes("lowpass")||t==="lp"||t.includes("lpf")?"lowpass":t.includes("highshelf")||t.includes("treble")?"highshelf":t.includes("lowshelf")||t.includes("bass")?"lowshelf":t.includes("notch")?"notch":(t.includes("peak")||t.includes("peq")||t.includes("bell"),"peaking")}function yp(e,t=48e3){const n=Xr(Number(e.freq),mr,t/2-1),r=Math.max(.05,Number(e.q)||.707),l=Number(e.gain)||0,s=gp(e.type),i=Math.pow(10,l/40),o=2*Math.PI*n/t,u=Math.sin(o),c=Math.cos(o),f=u/(2*r);let p,h,g,x,w,S;if(s==="lowpass")p=(1-c)/2,h=1-c,g=(1-c)/2,x=1+f,w=-2*c,S=1-f;else if(s==="highpass")p=(1+c)/2,h=-(1+c),g=(1+c)/2,x=1+f,w=-2*c,S=1-f;else if(s==="notch")p=1,h=-2*c,g=1,x=1+f,w=-2*c,S=1-f;else if(s==="lowshelf"){const v=u/2*Math.sqrt((i+1/i)*(1/r-1)+2),d=2*Math.sqrt(i)*v;p=i*(i+1-(i-1)*c+d),h=2*i*(i-1-(i+1)*c),g=i*(i+1-(i-1)*c-d),x=i+1+(i-1)*c+d,w=-2*(i-1+(i+1)*c),S=i+1+(i-1)*c-d}else if(s==="highshelf"){const v=u/2*Math.sqrt((i+1/i)*(1/r-1)+2),d=2*Math.sqrt(i)*v;p=i*(i+1+(i-1)*c+d),h=-2*i*(i-1+(i+1)*c),g=i*(i+1+(i-1)*c-d),x=i+1-(i-1)*c+d,w=2*(i-1-(i+1)*c),S=i+1-(i-1)*c-d}else p=1+f*i,h=-2*c,g=1-f*i,x=1+f/i,w=-2*c,S=1-f/i;return{b0:p/x,b1:h/x,b2:g/x,a1:w/x,a2:S/x}}function wp(e,t,n=48e3){const r=2*Math.PI*t/n,l=Math.cos(r),s=Math.sin(r),i=Math.cos(2*r),o=Math.sin(2*r),u=e.b0+e.b1*l+e.b2*i,c=-e.b1*s-e.b2*o,f=1+e.a1*l+e.a2*i,p=-e.a1*s-e.a2*o,h=Math.sqrt((u*u+c*c)/Math.max(1e-12,f*f+p*p));return 20*Math.log10(Math.max(1e-8,h))}function xp({filters:e,crossoverFilters:t}){const n=e.filter(f=>!f.bypassed&&Number.isFinite(Number(f.freq))),r=t.filter(f=>!f.bypassed&&f.coeffs),l=vp(),s=[...r.map(f=>f.coeffs),...n.map(yp)],i=l.map(f=>{const p=s.reduce((x,w)=>x+wp(w,f),0),h=ps(f)*100,g=100-(Xr(p,Ke,Xt)-Ke)/(Xt-Ke)*100;return`${h.toFixed(2)},${g.toFixed(2)}`}).join(" "),o=100-(0-Ke)/(Xt-Ke)*100,u=[-12,-6,0,6,12],c=[20,50,100,200,500,1e3,2e3,5e3,1e4,2e4];return a.jsxs("section",{className:"panel-section dsp-response-section",children:[a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"FILTER RESPONSE"}),a.jsxs("span",{className:"section-value mono",children:[n.length," custom · ",r.length," crossover"]})]}),a.jsxs("div",{className:"dsp-response",children:[a.jsxs("svg",{viewBox:"0 0 100 100",preserveAspectRatio:"none",role:"img","aria-label":"Current DSP filter response",children:[u.map(f=>{const p=100-(f-Ke)/(Xt-Ke)*100;return a.jsx("line",{className:f===0?"dsp-axis":"dsp-grid",x1:"0",x2:"100",y1:p,y2:p},f)}),c.map(f=>{const p=ps(f)*100;return a.jsx("line",{className:"dsp-grid dsp-grid--freq",x1:p,x2:p,y1:"0",y2:"100"},f)}),a.jsx("polyline",{className:"dsp-response-fill",points:`0,${o} ${i} 100,${o}`}),a.jsx("polyline",{className:"dsp-response-line",points:i}),n.map((f,p)=>{const h=Xr(ps(Number(f.freq))*100,0,100),g=100-(Xr(Number(f.gain)||0,Ke,Xt)-Ke)/(Xt-Ke)*100;return a.jsx("circle",{className:"dsp-filter-dot",cx:h,cy:g,r:"1.8"},`${f.address}-${p}`)})]}),a.jsxs("div",{className:"dsp-response-labels mono",children:[a.jsx("span",{children:"20"}),a.jsx("span",{children:"100"}),a.jsx("span",{children:"1k"}),a.jsx("span",{children:"10k"}),a.jsx("span",{children:"20k"})]})]}),a.jsxs("div",{className:"dsp-response-legend",children:[a.jsxs("span",{children:[a.jsx("i",{className:"legend-line legend-line--xo"})," crossover/profile"]}),a.jsxs("span",{children:[a.jsx("i",{className:"legend-dot"})," custom filter"]})]})]})}function kp({label:e,value:t,min:n=0,max:r=100,step:l=1,unit:s="",onChange:i,onCommit:o}){const u=r===n?0:(t-n)/(r-n)*100;return a.jsxs("div",{className:"param-row",children:[a.jsx("div",{className:"param-label",children:e}),a.jsxs("div",{className:"param-control",children:[a.jsxs("div",{className:"slider-track",children:[a.jsx("div",{className:"slider-fill",style:{width:`${u}%`}}),a.jsx("input",{type:"range",min:n,max:r,step:l,value:t??n,onChange:c=>i(parseFloat(c.target.value)),onMouseUp:c=>o==null?void 0:o(parseFloat(c.target.value)),onTouchEnd:c=>o==null?void 0:o(parseFloat(c.target.value))})]}),a.jsxs("span",{className:"param-value",children:[t!=null?Number(t).toFixed(l<1?1:0):"--",s]})]})]})}function Sp(){const{volume:e,loudness:t,mute:n,spdif:r,filters:l,crossoverFilters:s,parameters:i,profiles:o,activeProfile:u,metadata:c,error:f,updateVolume:p,updateParameter:h,switchProfile:g,toggleLoudness:x,toggleMute:w,toggleSpdif:S}=hp(),[v,d]=j.useState(null),m=v??e??0;return f?a.jsxs("div",{className:"panel-error",children:[a.jsx("span",{className:"dot dot-red"})," BeoCreate unreachable — ",f]}):a.jsxs("div",{className:"panel",children:[(l.length>0||s.length>0)&&a.jsx(xp,{filters:l,crossoverFilters:s}),a.jsxs("section",{className:"panel-section",children:[a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"MASTER VOLUME"}),a.jsx("span",{className:"section-value mono",children:Math.round(m)})]}),a.jsxs("div",{className:"vol-slider",children:[a.jsx("div",{className:"vol-fill",style:{width:`${m}%`}}),a.jsx("input",{type:"range",min:0,max:100,step:1,value:m,onChange:y=>{const N=parseInt(y.target.value);d(N)},onMouseUp:y=>{const N=parseInt(y.target.value);p(N),d(null)},onTouchEnd:y=>{const N=parseInt(y.target.value);p(N),d(null)}})]})]}),n!==null&&a.jsx("section",{className:"panel-section",children:a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"MUTE"}),a.jsx("button",{className:`toggle-btn ${n?"toggle-btn--on":""}`,onClick:w,children:n?"ON":"OFF"})]})}),t!==null&&a.jsx("section",{className:"panel-section",children:a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"LOUDNESS"}),a.jsx("button",{className:`toggle-btn ${t?"toggle-btn--on":""}`,onClick:x,children:t?"ON":"OFF"})]})}),r!==null&&a.jsx("section",{className:"panel-section",children:a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"SPDIF OUT"}),a.jsx("button",{className:`toggle-btn ${r?"toggle-btn--on":""}`,onClick:S,children:r?"ON":"OFF"})]})}),o.length>0&&a.jsxs("section",{className:"panel-section",children:[a.jsx("div",{className:"section-header",children:a.jsx("span",{className:"section-label",children:"DSP PROFILE"})}),a.jsxs("select",{className:"select",value:u??"",onChange:y=>g(y.target.value),children:[!u&&a.jsx("option",{value:"",children:"— select profile —"}),o.map(y=>a.jsx("option",{value:y,children:y},y))]})]}),l.length>0&&a.jsxs("section",{className:"panel-section",children:[a.jsx("div",{className:"section-header",children:a.jsx("span",{className:"section-label",children:"FILTERS"})}),a.jsx("div",{className:"param-list",children:l.map((y,N)=>{const E=[y.freq!=null&&`${y.freq} Hz`,y.gain!=null&&`${y.gain} dB`,y.q!=null&&`Q ${y.q}`].filter(Boolean).join(" ");return a.jsxs("div",{className:"meta-row",children:[a.jsxs("span",{className:"meta-key",style:{opacity:y.bypassed?.4:1},children:[y.type,E?` — ${E}`:""]}),a.jsx("span",{className:"meta-val mono",children:y.bypassed?"bypassed":`reg ${y.address}`})]},N)})})]}),c&&a.jsx("section",{className:"panel-section panel-section--meta",children:Object.entries(c).map(([y,N])=>a.jsxs("div",{className:"meta-row",children:[a.jsx("span",{className:"meta-key",children:y}),a.jsx("span",{className:"meta-val mono",children:String(N)})]},y))}),i.length>0&&a.jsxs("section",{className:"panel-section",children:[a.jsx("div",{className:"section-header",children:a.jsx("span",{className:"section-label",children:"DSP PARAMETERS"})}),a.jsx("div",{className:"param-list",children:i.map(y=>{const N=y.min??0,E=y.max??1,_=E-N<=2?.01:1;return a.jsx(kp,{label:y.name.replace(/_/g," "),value:parseFloat(y.value),min:N,max:E,step:_,onChange:M=>h(y.name,M)},y.name)})})]}),i.length===0&&o.length===0&&!f&&a.jsx("div",{className:"panel-empty",children:"No DSP parameters available for this profile"})]})}const Np="/api/mopidy/rpc";let jp=1;async function O(e,t={}){const n=jp++,r=await fetch(Np,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:n,method:e,params:t})});if(!r.ok)throw new Error(`Mopidy RPC ${e}: ${r.status}`);const l=await r.json();if(l.error)throw new Error(`Mopidy: ${l.error.message}`);return l.result}const I={getState:()=>O("core.playback.get_state"),play:e=>O("core.playback.play",e?{tlid:e}:{}),pause:()=>O("core.playback.pause"),resume:()=>O("core.playback.resume"),stop:()=>O("core.playback.stop"),next:()=>O("core.playback.next"),previous:()=>O("core.playback.previous"),getCurrentTrack:()=>O("core.playback.get_current_tl_track"),getTimePosition:()=>O("core.playback.get_time_position"),seek:e=>O("core.playback.seek",{time_position:e}),getVolume:()=>O("core.mixer.get_volume"),setVolume:e=>O("core.mixer.set_volume",{volume:e}),getMute:()=>O("core.mixer.get_mute"),setMute:e=>O("core.mixer.set_mute",{mute:e}),getTracklist:()=>O("core.tracklist.get_tl_tracks"),getLength:()=>O("core.tracklist.get_length"),getIndex:()=>O("core.tracklist.index"),getRepeat:()=>O("core.tracklist.get_repeat"),getRandom:()=>O("core.tracklist.get_random"),getSingle:()=>O("core.tracklist.get_single"),setRepeat:e=>O("core.tracklist.set_repeat",{value:e}),setRandom:e=>O("core.tracklist.set_random",{value:e}),setSingle:e=>O("core.tracklist.set_single",{value:e}),clearTracklist:()=>O("core.tracklist.clear"),removeTracks:e=>O("core.tracklist.remove",{criteria:e}),getPlaylists:()=>O("core.playlists.as_list"),getPlaylist:e=>O("core.playlists.lookup",{uri:e}),loadPlaylist:async e=>{var n;const t=await O("core.playlists.lookup",{uri:e});(n=t==null?void 0:t.tracks)!=null&&n.length&&(await O("core.tracklist.clear"),await O("core.tracklist.add",{tracks:t.tracks}),await O("core.playback.play"))},search:(e,t)=>O("core.library.search",{query:{any:[e]},uris:t}),browse:e=>O("core.library.browse",{uri:e??null}),lookup:e=>O("core.library.lookup",{uri:e}),getImages:e=>O("core.library.get_images",{uris:e}),addTracks:e=>O("core.tracklist.add",{uris:e}),localScan:()=>O("core.library.refresh",{})};function Sl(e){if(e==null)return"--:--";const t=Math.floor(e/1e3);return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}const Cp=`ws://${location.host}/ws/mopidy`;function Ep(){const[e,t]=j.useState({playbackState:null,currentTrack:null,position:0,duration:0,volume:null,mute:!1,repeat:!1,random:!1,single:!1,tracklist:[],playlists:[],connected:!1,error:null}),n=j.useRef(null),r=j.useRef(null),l=j.useRef(0),s=j.useCallback(()=>{l.current+=1e3,t(f=>({...f,position:l.current}))},[]),i=j.useCallback(()=>{clearInterval(r.current),r.current=setInterval(s,1e3)},[s]),o=j.useCallback(()=>{clearInterval(r.current)},[]),u=j.useCallback(async()=>{var f;try{const[p,h,g,x,w,S,v,d,m,y]=await Promise.all([I.getState(),I.getCurrentTrack(),I.getTimePosition(),I.getVolume(),I.getMute(),I.getRepeat(),I.getRandom(),I.getSingle(),I.getTracklist(),I.getPlaylists().catch(()=>[])]),N=((f=h==null?void 0:h.track)==null?void 0:f.length)??0;l.current=g??0,t(E=>({...E,playbackState:p,currentTrack:h,position:g??0,duration:N,volume:x,mute:w??!1,repeat:S??!1,random:v??!1,single:d??!1,tracklist:m??[],playlists:y??[],connected:!0,error:null})),p==="playing"?i():o()}catch(p){t(h=>({...h,error:p.message,connected:!1}))}},[i,o]);j.useEffect(()=>{let f;const p=()=>{const h=new WebSocket(Cp);n.current=h,h.onopen=()=>{t(g=>({...g,connected:!0})),u()},h.onclose=()=>{t(g=>({...g,connected:!1})),f=setTimeout(p,4e3)},h.onerror=()=>h.close(),h.onmessage=g=>{try{if(!JSON.parse(g.data).event)return;u()}catch{}}};return p(),()=>{var h;clearTimeout(f),clearInterval(r.current),(h=n.current)==null||h.close()}},[u]);const c={play:async f=>{await I.play(f),u()},pause:async()=>{await I.pause(),u()},resume:async()=>{await I.resume(),u()},stop:async()=>{await I.stop(),u()},next:async()=>{await I.next(),u()},previous:async()=>{await I.previous(),u()},seek:async f=>{await I.seek(f),l.current=f,t(p=>({...p,position:f}))},setVolume:async f=>{t(p=>({...p,volume:f})),await I.setVolume(f)},setMute:async f=>{t(p=>({...p,mute:f})),await I.setMute(f)},setRepeat:async f=>{t(p=>({...p,repeat:f})),await I.setRepeat(f)},setRandom:async f=>{t(p=>({...p,random:f})),await I.setRandom(f)},setSingle:async f=>{t(p=>({...p,single:f})),await I.setSingle(f)},loadPlaylist:async f=>{await I.loadPlaylist(f),u()},clearTracklist:async()=>{await I.clearTracklist(),u()},removeTrack:async f=>{await I.removeTracks({tlid:[f]}),u()},addTracks:async f=>{await I.addTracks(f),u()},search:I.search};return{...e,...c,refresh:u}}const _p="/api/now-playing";async function ms(e){const t=await fetch(`${_p}${e}`),n=await t.json().catch(()=>({}));if(!t.ok)throw new Error(n.error||`Now playing API ${t.status}`);if(n.error)throw new Error(n.error);return n}const Xn={get:()=>ms("/now-playing"),recognize:()=>ms("/recognize"),visualizer:()=>ms("/visualizer")};function Al(e){return e?e.startsWith("http")||e.startsWith("data:")?e:`/api/mopidy-image/${e.replace(/^\/+/,"").replace(/^mopidy\//,"")}`:null}const Pp=[28,56,38,72,46,84,31,63,51,76,42,68,34,58,87,45,70,36,62,49,79,40,66,53];function Tp({bars:e}){const t=e!=null&&e.length?e:Pp;return a.jsx("div",{className:`cava-overlay cava-overlay--cover ${e!=null&&e.length?"cava-overlay--live":""}`,"aria-hidden":"true",children:t.map((n,r)=>a.jsx("span",{style:{"--bar-height":`${n}%`,"--bar-delay":`${r*-.055}s`}},`mop-${n}-${r}`))})}function je({className:e="",title:t,children:n,onClick:r,disabled:l}){return a.jsx("button",{className:`icon-btn ${e}`,onClick:r,disabled:l,title:t,"aria-label":t,children:n})}function Mp({track:e,bars:t}){var o,u,c,f,p;const[n,r]=j.useState(null);if(j.useEffect(()=>{var x;const h=e==null?void 0:e.track;if(!(h!=null&&h.uri)){r(null);return}let g=!1;return I.getImages([h.uri,(x=h.album)==null?void 0:x.uri].filter(Boolean)).then(w=>{var v,d,m;if(g)return;const S=((v=w==null?void 0:w[h.uri])==null?void 0:v[0])??((m=w==null?void 0:w[(d=h.album)==null?void 0:d.uri])==null?void 0:m[0]);r(Al(S==null?void 0:S.uri))}).catch(()=>{g||r(null)}),()=>{g=!0}},[(o=e==null?void 0:e.track)==null?void 0:o.uri,(c=(u=e==null?void 0:e.track)==null?void 0:u.album)==null?void 0:c.uri]),!e)return a.jsxs("div",{className:"now-playing now-playing--empty",children:[a.jsx("div",{className:"now-cover now-cover--empty",children:"ALB"}),a.jsx("div",{className:"track-title",children:"Nothing playing"})]});const l=e.track,s=((f=l.artists)==null?void 0:f.map(h=>h.name).join(", "))??"",i=((p=l.album)==null?void 0:p.name)??"";return a.jsxs("div",{className:"now-playing",children:[a.jsxs("div",{className:"now-cover",children:[n?a.jsx("img",{src:n,alt:""}):"ALB",a.jsx(Tp,{bars:t})]}),a.jsxs("div",{className:"now-text",children:[a.jsx("div",{className:"track-title",children:l.name}),a.jsx("div",{className:"track-sub",children:[s,i].filter(Boolean).join(" · ")})]})]})}function Fr({label:e,title:t,active:n,onClick:r}){return a.jsx("button",{className:`toggle-btn ${n?"toggle-btn--on":""}`,onClick:r,title:t,"aria-label":t,children:e})}function Lp({playlists:e,onLoad:t}){const[n,r]=j.useState(!1);return e.length?a.jsxs("div",{className:"playlist-browser",children:[a.jsxs("button",{className:"section-toggle",onClick:()=>r(l=>!l),children:["PLAYLISTS ",n?"▲":"▼"]}),n&&a.jsx("div",{className:"playlist-list",children:e.map(l=>a.jsx("button",{className:"playlist-item",onClick:()=>t(l.uri),children:l.name},l.uri))})]}):null}function Rp({track:e,className:t=""}){var l;const[n,r]=j.useState(null);return j.useEffect(()=>{var i;if(!(e!=null&&e.uri)){r(null);return}let s=!1;return I.getImages([e.uri,(i=e.album)==null?void 0:i.uri].filter(Boolean)).then(o=>{var c,f,p;if(s)return;const u=((c=o==null?void 0:o[e.uri])==null?void 0:c[0])??((p=o==null?void 0:o[(f=e.album)==null?void 0:f.uri])==null?void 0:p[0]);r(Al(u==null?void 0:u.uri))}).catch(()=>{s||r(null)}),()=>{s=!0}},[e==null?void 0:e.uri,(l=e==null?void 0:e.album)==null?void 0:l.uri]),a.jsx("span",{className:`track-thumb ${t}`,children:n?a.jsx("img",{src:n,alt:"",loading:"lazy"}):"ALB"})}function zp({tracklist:e,currentTrack:t,onPlay:n,onRemove:r}){return e.length?a.jsx("div",{className:"queue-list",children:e.map(l=>{var u;const s=l.tlid===(t==null?void 0:t.tlid),i=l.track,o=((u=i.artists)==null?void 0:u.map(c=>c.name).join(", "))??"";return a.jsxs("div",{className:`queue-item ${s?"queue-item--active":""}`,children:[a.jsx(Rp,{track:i,className:"queue-thumb"}),a.jsxs("div",{className:"queue-info",children:[a.jsx("span",{className:"queue-title",children:i.name}),o&&a.jsx("span",{className:"queue-artist",children:o})]}),a.jsx("span",{className:"queue-dur mono",children:Sl(i.length)}),a.jsx(je,{className:"queue-play",title:"Play track",onClick:()=>n(l.tlid),children:"▶"}),a.jsx(je,{className:"queue-remove",title:"Remove from queue",onClick:()=>r(l.tlid),children:"×"})]},l.tlid)})}):null}const Ip={directory:"DIR",album:"ALB",artist:"ART",playlist:"PLS",track:"TRK"},Ic=[{id:"artist",label:"Artists",uri:"local:directory?type=artist",crumb:"Artists"},{id:"album",label:"Albums",uri:"local:directory?type=album",crumb:"Albums"},{id:"track",label:"Tracks",uri:"local:directory?type=track",crumb:"Tracks"}],hs=Ic[1];function ui(e){return Number((e==null?void 0:e.disc_no)??(e==null?void 0:e.disc)??0)||0}function yu(e){if(!e)return 0;let t=String(e);try{t=decodeURIComponent(t)}catch{}const r=(t.split("/").pop()??t).match(/^\D*(?:disc\s*\d+\D*)?(\d{1,3})(?:\D|$)/i);return r&&Number(r[1])||0}function ai(e){return Number((e==null?void 0:e.track_no)??(e==null?void 0:e.track_number)??0)||yu(e==null?void 0:e.uri)||yu(e==null?void 0:e.name)||0}function ci(e){return e.map((t,n)=>({track:t,index:n})).sort((t,n)=>{const r=t.track,l=n.track,s=ui(r),i=ui(l);if(s!==i)return s-i;const o=ai(r),u=ai(l);return o!==u?o-u:t.index-n.index}).map(({track:t})=>t)}function Op(e){return e.reduce((t,n)=>{const r=ui(n)||1,l=t.find(s=>s.disc===r);return l?l.tracks.push(n):t.push({disc:r,tracks:[n]}),t},[])}async function $p(e){return await Promise.all(e.map(async n=>{try{const r=await I.lookup(n.uri);return(r==null?void 0:r[0])??n}catch{return n}}))}function Un(e,t){var r;const n=(r=e[t])==null?void 0:r[0];return Al(n==null?void 0:n.uri)}function Fp({albums:e,covers:t,onOpen:n}){return a.jsx("div",{className:"cover-grid",children:e.map(r=>{const l=Un(t,r.uri);return a.jsxs("button",{className:"cover-card",onClick:()=>n(r),children:[a.jsx("span",{className:"cover-art",children:l?a.jsx("img",{src:l,alt:"",loading:"lazy"}):"ALB"}),a.jsx("span",{className:"cover-title",children:r.name})]},r.uri)})})}function Dp({album:e,onBack:t,onAdd:n}){const[r,l]=j.useState([]),[s,i]=j.useState(!0),[o,u]=j.useState(!1),[c,f]=j.useState(null),[p,h]=j.useState(null);j.useEffect(()=>{let S=!1;return i(!0),I.browse(e.uri).then(async v=>{if(S)return;const d=(v??[]).filter(N=>N.type==="track"),m=await $p(d);if(S)return;const y=ci(m);l(y)}).catch(()=>{S||l([])}).finally(()=>{S||i(!1)}),I.getImages([e.uri]).then(v=>{var m;if(S)return;const d=(m=v==null?void 0:v[e.uri])==null?void 0:m[0];f(Al(d==null?void 0:d.uri))}),()=>{S=!0}},[e.uri]);const g=async S=>{if(!(!r.length||p)){h(S);try{const v=ci(r).map(d=>d.uri);S==="replace"?(await I.clearTracklist(),await n(v,"Album replaced queue")):await n(v,"Album added to queue"),u(!1),await I.play()}finally{h(null)}}},x=Op(r),w=x.length>1;return a.jsxs("div",{className:"album-detail",children:[a.jsxs("div",{className:"album-header",children:[a.jsx("button",{className:"album-back-btn",onClick:t,children:"← Back"}),a.jsx("span",{className:"album-type mono",children:"ALBUM"}),a.jsxs("div",{className:"album-play-menu",children:[a.jsx("button",{className:"album-play-btn",onClick:()=>u(S=>!S),disabled:s||!r.length||!!p,children:p?"Adding…":"▶ Play Album"}),o&&a.jsxs("div",{className:"album-play-dropdown",children:[a.jsx("button",{onClick:()=>g("add"),disabled:!!p,children:"Add to Queue"}),a.jsx("button",{onClick:()=>g("replace"),disabled:!!p,children:"Replace Queue"})]})]})]}),a.jsxs("div",{className:"album-info",children:[a.jsx("div",{className:"album-cover",children:c?a.jsx("img",{src:c,alt:""}):"ALB"}),a.jsxs("div",{className:"album-meta",children:[a.jsx("div",{className:"album-name",children:e.name}),a.jsxs("div",{className:"album-count",children:[r.length," tracks"]})]})]}),a.jsxs("div",{className:"track-list",children:[s&&a.jsx("div",{className:"browser-msg",children:"Loading…"}),!s&&r.length===0&&a.jsx("div",{className:"browser-msg",children:"No tracks were found for this album."}),x.map(S=>a.jsxs(j.Fragment,{children:[w&&a.jsxs("div",{className:"disc-heading mono",children:["Disc ",S.disc]}),S.tracks.map((v,d)=>a.jsxs("div",{className:"browser-row track-row",children:[a.jsx("span",{className:"track-num mono",children:ai(v)||d+1}),a.jsx("span",{className:"track-name",children:v.name}),a.jsx("span",{className:"track-duration mono",children:Sl(v.length)}),a.jsx(je,{className:"browser-add-btn",title:"Add track to queue",onClick:m=>{m.stopPropagation(),n([v.uri],"Track added to queue")},children:"+"})]},v.uri))]},S.disc))]})]})}function Ap({onAdd:e}){const[t,n]=j.useState(hs),[r,l]=j.useState([{name:hs.crumb,uri:hs.uri}]),[s,i]=j.useState(null),[o,u]=j.useState({}),[c,f]=j.useState(!1),[p,h]=j.useState(""),[g,x]=j.useState(!1),[w,S]=j.useState(!1),[v,d]=j.useState([]),[m,y]=j.useState({}),[N,E]=j.useState(null),_=r.length?r[r.length-1].uri:null;j.useEffect(()=>{if(w)return;let k=!1;return f(!0),i(null),u({}),I.browse(_).then(L=>{k||i(L??[])}).catch(()=>{k||i([])}).finally(()=>{k||f(!1)}),()=>{k=!0}},[_,w]),j.useEffect(()=>{if(w||!(s!=null&&s.length))return;const k=s.filter(R=>R.type==="album"||t.id==="album"&&R.type==="directory");if(!k.length)return;let L=!1;return I.getImages(k.map(R=>R.uri)).then(R=>{L||u(R??{})}).catch(()=>{L||u({})}),()=>{L=!0}},[t.id,s,w]),j.useEffect(()=>{if(!w||!v.length){y({});return}let k=!1;const L=v.flatMap(R=>{var U;return[R.uri,(U=R.album)==null?void 0:U.uri].filter(Boolean)});return I.getImages([...new Set(L)]).then(R=>{k||y(R??{})}).catch(()=>{k||y({})}),()=>{k=!0}},[v,w]);const M=k=>{k.type==="album"||t.id==="album"&&k.type==="directory"?E({name:k.name,uri:k.uri}):(E(null),l(L=>[...L,{name:k.name,uri:k.uri}]))},A=()=>{N?E(null):l(k=>k.slice(0,-1))},z=k=>{n(k),l([{name:k.crumb,uri:k.uri}]),E(null),Me()},ie=async()=>{if(!p.trim()){S(!1),x(!1);return}S(!0),f(!0);try{const k=await I.search(p);d((k??[]).flatMap(L=>L.tracks??[]).slice(0,100))}catch{S(!1),d([])}finally{f(!1)}},Me=()=>{S(!1),x(!1),h(""),d([]),y({}),E(null)},be=()=>{g||w?Me():x(!0)},et=ci((s==null?void 0:s.filter(k=>k.type==="track"))??[]).map(k=>k.uri),F=(s==null?void 0:s.filter(k=>k.type==="album"||t.id==="album"&&k.type==="directory"))??[],ke=!g&&!w&&!c&&t.id==="album"&&F.length>0,P=r.length?r:[{name:"Root",uri:null}];return a.jsxs("div",{className:"browser",children:[a.jsxs("div",{className:"browser-mode-row",children:[Ic.map(k=>a.jsx("button",{className:`browser-mode-btn ${t.id===k.id&&!w?"browser-mode-btn--active":""}`,onClick:()=>z(k),children:k.label},k.id)),a.jsx("button",{className:`browser-mode-btn browser-mode-btn--search ${g||w?"browser-mode-btn--active":""}`,onClick:be,children:"Search"})]}),(g||w)&&a.jsxs("div",{className:"browser-search-row",children:[a.jsx("input",{className:"browser-input",type:"search",placeholder:"Search library…",value:p,onChange:k=>h(k.target.value),onKeyDown:k=>{k.key==="Enter"&&ie(),k.key==="Escape"&&Me()}}),w?a.jsx("button",{className:"browser-icon-btn",onClick:Me,children:"✕"}):a.jsx("button",{className:"browser-icon-btn",onClick:ie,children:"⌕"})]}),!g&&!w&&a.jsxs("div",{className:"browser-nav",children:[a.jsx(je,{className:"browser-back-btn",title:"Back",onClick:A,disabled:!N&&r.length<=1,children:"←"}),a.jsxs("div",{className:"browser-crumbs mono",title:P.map(k=>k.name).join(" / "),children:[P.map((k,L)=>a.jsxs("span",{className:"browser-crumb",children:[L>0&&a.jsx("span",{className:"browser-crumb-sep",children:"/"}),k.name]},`${k.uri??"root"}-${L}`)),N&&a.jsxs("span",{className:"browser-crumb",children:[a.jsx("span",{className:"browser-crumb-sep",children:"/"}),N.name]})]}),et.length>0&&a.jsxs(je,{className:"browser-add-all-btn",title:`Add ${et.length} tracks to queue`,onClick:()=>e(et,`${et.length} tracks added to queue`),children:["+ ",et.length]})]}),a.jsxs("div",{className:"browser-list",children:[N&&a.jsx(Dp,{album:N,onBack:A,onAdd:e}),!N&&c&&a.jsxs("div",{className:"browser-msg",children:["Loading ",t.label.toLowerCase(),"…"]}),!N&&ke&&a.jsx(Fp,{albums:F,covers:o,onOpen:M}),!N&&!ke&&!g&&!w&&!c&&(s==null?void 0:s.map(k=>{const L=k.type==="track";return a.jsxs("div",{className:`browser-row ${L?"":"browser-row--dir"}`,onClick:()=>!L&&M(k),children:[a.jsx("span",{className:"browser-type mono",children:Ip[k.type]??"···"}),a.jsx("span",{className:"browser-name",children:k.name}),L?a.jsx(je,{className:"browser-add-btn",title:"Add track to queue",onClick:R=>{R.stopPropagation(),e([k.uri],"Track added to queue")},children:"+"}):a.jsx("span",{className:"browser-arrow",children:"›"})]},k.uri)})),!N&&!g&&!w&&!c&&(s==null?void 0:s.length)===0&&a.jsxs("div",{className:"browser-msg",children:["No ",t.label.toLowerCase()," found here."]}),!N&&w&&!c&&v.map((k,L)=>{var R,U,Le,Se;return a.jsxs("div",{className:"browser-row browser-row--search",children:[a.jsx("span",{className:"search-thumb",children:Un(m,k.uri)||Un(m,(R=k.album)==null?void 0:R.uri)?a.jsx("img",{src:Un(m,k.uri)||Un(m,(U=k.album)==null?void 0:U.uri),alt:"",loading:"lazy"}):"TRK"}),a.jsxs("div",{className:"browser-name-col",children:[a.jsx("span",{className:"browser-name",children:k.name}),((Le=k.artists)==null?void 0:Le.length)>0&&a.jsx("span",{className:"browser-sub",children:k.artists.map(mt=>mt.name).join(", ")}),((Se=k.album)==null?void 0:Se.name)&&a.jsx("span",{className:"browser-sub",children:k.album.name})]}),a.jsx(je,{className:"browser-add-btn",title:"Add track to queue",onClick:()=>e([k.uri],"Track added to queue"),children:"+"})]},`${k.uri}-${L}`)}),g&&!w&&!c&&!p.trim()&&a.jsx("div",{className:"browser-msg",children:"Enter a search term to find tracks."}),w&&!c&&v.length===0&&a.jsxs("div",{className:"browser-msg",children:["No tracks matched “",p,"”."]})]})]})}function Up({onAdd:e}){const[t,n]=j.useState(!0);return a.jsxs("div",{children:[a.jsxs("button",{className:"section-toggle",onClick:()=>n(r=>!r),children:["BROWSE LIBRARY ",t?"▲":"▼"]}),t&&a.jsx(Ap,{onAdd:e})]})}function Bp(){const e=Ep(),[t,n]=j.useState(!1),[r,l]=j.useState(null),[s,i]=j.useState(null),o=j.useRef(null);j.useEffect(()=>{let g=!1;const x=()=>{Xn.visualizer().then(S=>{!g&&Array.isArray(S.bars)&&l(S.bars)}).catch(()=>{g||l(null)})};x();const w=setInterval(x,300);return()=>{g=!0,clearInterval(w)}},[]),j.useEffect(()=>()=>window.clearTimeout(o.current),[]);const u=e.playbackState==="playing",c=e.duration>0?e.position/e.duration*100:0,f=g=>{const x=g.currentTarget.getBoundingClientRect(),w=(g.clientX-x.left)/x.width;e.seek(Math.round(w*e.duration))},p=g=>{i(g),window.clearTimeout(o.current),o.current=window.setTimeout(()=>i(null),1800)},h=async(g,x="Added to queue")=>{if(g!=null&&g.length){p("Adding…");try{await e.addTracks(g),p(x)}catch(w){throw p(w.message||"Could not add tracks"),w}}};return a.jsxs("div",{className:"panel",children:[s&&a.jsx("div",{className:"action-toast",role:"status",children:s}),!e.connected&&a.jsxs("div",{className:"panel-error",children:[a.jsx("span",{className:"dot dot-red"})," Mopidy unreachable"]}),a.jsxs("section",{className:"panel-section",children:[a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"NOW PLAYING"}),e.connected&&a.jsx("span",{className:`dot ${u?"dot-green":"dot-dim"}`})]}),a.jsx(Mp,{track:e.currentTrack,bars:r}),a.jsx("div",{className:"progress-bar",onClick:f,children:a.jsx("div",{className:"progress-fill",style:{width:`${c}%`}})}),a.jsxs("div",{className:"progress-times",children:[a.jsx("span",{className:"mono",children:Sl(e.position)}),a.jsx("span",{className:"mono",children:Sl(e.duration)})]})]}),a.jsx("section",{className:"panel-section",children:a.jsxs("div",{className:"transport-panel",children:[a.jsxs("div",{className:"transport-main",children:[a.jsxs("div",{className:"transport",children:[a.jsx(je,{className:"transport-btn",onClick:e.previous,title:"Previous track",children:"⏮"}),a.jsx(je,{className:`transport-btn transport-btn--play ${u?"transport-btn--active":""}`,onClick:u?e.pause:e.resume,title:u?"Pause":"Play",children:u?"⏸":"▶"}),a.jsx(je,{className:"transport-btn",onClick:e.next,title:"Next track",children:"⏭"}),a.jsx(je,{className:"transport-btn transport-btn--stop",onClick:e.stop,title:"Stop",children:"⏹"}),a.jsxs(je,{className:`transport-btn transport-btn--queue ${t?"transport-btn--active":""}`,onClick:()=>n(g=>!g),title:"Queue",children:["☰ ",a.jsx("span",{className:"queue-count",children:e.tracklist.length})]})]}),a.jsxs("div",{className:"transport-volume",children:[a.jsx("span",{className:"transport-volume-label mono",children:e.volume??"--"}),a.jsxs("div",{className:"vol-slider vol-slider--sm",children:[a.jsx("div",{className:"vol-fill",style:{width:`${e.volume??0}%`}}),a.jsx("input",{type:"range",min:0,max:100,step:1,value:e.volume??0,onChange:g=>e.setVolume(parseInt(g.target.value))})]})]})]}),a.jsxs("div",{className:"transport-toggles",children:[a.jsx(Fr,{label:"∞",title:"Repeat",active:e.repeat,onClick:()=>e.setRepeat(!e.repeat)}),a.jsx(Fr,{label:"⤨",title:"Random",active:e.random,onClick:()=>e.setRandom(!e.random)}),a.jsx(Fr,{label:"1",title:"Single track",active:e.single,onClick:()=>e.setSingle(!e.single)}),a.jsx(Fr,{label:e.mute?"🔇":"🔊",title:e.mute?"Unmute":"Mute",active:e.mute,onClick:()=>e.setMute(!e.mute)})]})]})}),t&&a.jsxs("div",{className:"queue-shell",role:"dialog","aria-label":"Queue",children:[a.jsx("button",{className:"queue-backdrop",onClick:()=>n(!1),"aria-label":"Close queue"}),a.jsxs("aside",{className:"queue-drawer",children:[a.jsxs("div",{className:"queue-heading",children:[a.jsxs("div",{children:[a.jsx("span",{className:"section-label",children:"QUEUE"}),a.jsxs("div",{className:"queue-subtitle mono",children:[e.tracklist.length," tracks"]})]}),a.jsxs("div",{className:"queue-heading-actions",children:[e.tracklist.length>0&&a.jsx("button",{className:"danger-btn danger-btn--inline",onClick:e.clearTracklist,children:"Clear"}),a.jsx(je,{className:"queue-close",title:"Close queue",onClick:()=>n(!1),children:"×"})]})]}),a.jsx(zp,{tracklist:e.tracklist,currentTrack:e.currentTrack,onPlay:e.play,onRemove:e.removeTrack}),e.tracklist.length===0&&a.jsx("div",{className:"browser-msg",children:"The queue is empty."})]})]}),a.jsx("section",{className:"panel-section",children:a.jsx(Lp,{playlists:e.playlists,onLoad:e.loadPlaylist})}),a.jsx("section",{className:"panel-section",children:a.jsx(Up,{onAdd:h})})]})}const Vp="/api/snapcast/rpc";function Hp(){var d;const[e,t]=j.useState(null),[n,r]=j.useState(!1),[l,s]=j.useState(null),i=j.useRef(1),o=j.useCallback(async(m,y={})=>{const N=i.current++,E=await fetch(Vp,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:N,method:m,params:y})});if(!E.ok)throw new Error(`Snapcast RPC ${m}: ${E.status}`);const _=await E.json();if(_.error)throw new Error(`Snapcast: ${_.error.message}`);return _.result},[]),u=j.useCallback(()=>o("Server.GetStatus").then(m=>{t((m==null?void 0:m.server)??m),r(!0),s(null)}).catch(m=>{r(!1),s(m.message)}),[o]);j.useEffect(()=>{u();const m=setInterval(u,5e3);return()=>{clearInterval(m)}},[u]);const c=((d=e==null?void 0:e.groups)==null?void 0:d.filter(Boolean).flatMap(m=>m.clients.map(y=>({...y,groupId:m.id,groupName:m.name,stream:m.stream_id}))))??[],f=(e==null?void 0:e.groups)??[],p=(e==null?void 0:e.streams)??[],h=j.useCallback((m,y)=>o("Client.SetVolume",{id:m,volume:{percent:y,muted:!1}}).then(u),[o,u]),g=j.useCallback((m,y)=>{var N,E,_;return o("Client.SetVolume",{id:m,volume:{percent:((_=(E=(N=c.find(M=>M.id===m))==null?void 0:N.config)==null?void 0:E.volume)==null?void 0:_.percent)??100,muted:y}}).then(u)},[o,u,c]),x=j.useCallback((m,y)=>o("Group.SetStream",{id:m,stream_id:y}).then(u),[o,u]),w=j.useCallback((m,y)=>o("Group.SetMute",{id:m,mute:y}).then(u),[o,u]),S=j.useCallback(async(m,y)=>{var E;const N=((E=f.find(_=>_.id===m))==null?void 0:E.clients)??[];await Promise.all(N.map(_=>o("Client.SetVolume",{id:_.id,volume:{percent:y,muted:!1}}))),u()},[o,u,f]),v=j.useCallback(m=>o("Server.DeleteClient",{id:m}).then(u),[o,u]);return{server:e,clients:c,groups:f,streams:p,connected:n,error:l,setClientVolume:h,setClientMute:g,setGroupStream:x,setGroupMute:w,setGroupVolume:S,deleteClient:v,refresh:u}}const Wp=[28,56,38,72,46,84,31,63,51,76,42,68,34,58,87,45,70,36,62,49,79,40,66,53];function Qp({bars:e}){const t=e!=null&&e.length?e:Wp;return a.jsx("div",{className:`cava-overlay cava-overlay--snapcast ${e!=null&&e.length?"cava-overlay--live":""}`,"aria-hidden":"true",children:t.map((n,r)=>a.jsx("span",{style:{"--bar-height":`${n}%`,"--bar-delay":`${r*-.055}s`}},`${n}-${r}`))})}function qp({activeStream:e}){const[t,n]=j.useState(null),[r,l]=j.useState(!1),[s,i]=j.useState(!1),[o,u]=j.useState(null),[c,f]=j.useState(null),p=j.useCallback((S=!1)=>{if(!e)return;S?i(!0):l(!0),u(null),(S?Xn.recognize():Xn.get()).then(n).catch(d=>u(d.message)).finally(()=>{l(!1),i(!1)})},[e]);j.useEffect(()=>{p(!1);const S=setInterval(()=>p(!1),15e3);return()=>clearInterval(S)},[p]),j.useEffect(()=>{let S=!1;const v=()=>{Xn.visualizer().then(m=>{!S&&Array.isArray(m.bars)&&f(m.bars)}).catch(()=>{S||f(null)})};v();const d=setInterval(v,180);return()=>{S=!0,clearInterval(d)}},[]);const h=t==null?void 0:t.metadata,g=(h==null?void 0:h.title)||"Unknown title",x=(h==null?void 0:h.artist)||"Unknown artist",w=h==null?void 0:h.album;return a.jsxs("section",{className:"panel-section",children:[a.jsxs("div",{className:"section-header",children:[a.jsxs("div",{children:[a.jsx("span",{className:"section-label",children:"NOW PLAYING"}),e&&a.jsxs("div",{className:"snap-source mono",children:["Source: ",e]})]}),a.jsx("button",{className:"recognize-btn",onClick:()=>p(!0),disabled:s||!e,children:s?"Listening…":"Identify"})]}),a.jsx("div",{className:"snap-now",children:a.jsxs("div",{className:"snap-art",children:[h!=null&&h.artwork?a.jsx("img",{src:h.artwork,alt:""}):a.jsx("span",{children:"♪"}),a.jsxs("div",{className:"snap-meta",children:[a.jsx("div",{className:"snap-title",children:r?"Loading…":g}),a.jsx("div",{className:"snap-artist",children:x}),w&&a.jsx("div",{className:"snap-album",children:w}),(h==null?void 0:h.message)&&a.jsx("div",{className:"snap-extra",children:h.message}),o&&a.jsx("div",{className:"snap-error",children:o})]}),a.jsx(Qp,{bars:c})]})})]})}function Gp({client:e,streams:t,onVolume:n,onMute:r,onDelete:l}){var u,c,f,p,h,g,x,w;const s=((c=(u=e.config)==null?void 0:u.volume)==null?void 0:c.percent)??100,i=((p=(f=e.config)==null?void 0:f.volume)==null?void 0:p.muted)??!1,o=e.connected;return a.jsxs("div",{className:`client-row ${o?"":"client-row--offline"}`,children:[a.jsxs("div",{className:"client-header",children:[a.jsxs("div",{className:"client-name-block",children:[a.jsx("span",{className:`dot ${o?"dot-green":"dot-dim"}`}),a.jsx("span",{className:"client-name",children:((h=e.config)==null?void 0:h.name)||((g=e.host)==null?void 0:g.name)||e.id}),((x=e.host)==null?void 0:x.name)&&((w=e.config)==null?void 0:w.name)&&e.host.name!==e.config.name&&a.jsxs("span",{className:"client-host mono",children:["(",e.host.name,")"]})]}),a.jsxs("div",{className:"client-actions",children:[a.jsx("span",{className:"client-stream mono",children:e.stream}),a.jsx("button",{className:`mute-btn ${i?"mute-btn--muted":""}`,onClick:()=>r(e.id,!i),title:i?"Unmute":"Mute",children:i?"🔇":"🔊"}),a.jsx("button",{className:"delete-btn",onClick:()=>l(e.id),title:"Remove client",children:"✕"})]})]}),a.jsxs("div",{className:"client-vol-row",children:[a.jsxs("div",{className:"vol-slider",children:[a.jsx("div",{className:"vol-fill",style:{width:`${i?0:s}%`,opacity:i?.3:1}}),a.jsx("input",{type:"range",min:0,max:100,step:1,value:s,disabled:!o,onChange:S=>n(e.id,parseInt(S.target.value))})]}),a.jsx("span",{className:"param-value mono",children:s})]})]})}function Kp({group:e,allStreams:t,clients:n,onVolume:r,onMute:l,onDelete:s,onGroupStream:i,onGroupMute:o,onGroupVolume:u}){const c=n.filter(S=>S.groupId===e.id),f=e.muted??!1,[p,h]=j.useState(null),g=c.filter(S=>S.connected),x=g.length>0?Math.round(g.reduce((S,v)=>{var d,m;return S+(((m=(d=v.config)==null?void 0:d.volume)==null?void 0:m.percent)??100)},0)/g.length):100,w=p??x;return a.jsxs("div",{className:"group-section",children:[a.jsxs("div",{className:"group-header",children:[a.jsx("span",{className:"group-name",children:e.name||`Group ${e.id.slice(0,8)}`}),a.jsxs("div",{className:"group-controls",children:[t.length>1&&a.jsx("select",{className:"select select--sm",value:e.stream_id,onChange:S=>i(e.id,S.target.value),children:t.map(S=>a.jsx("option",{value:S.id,children:S.id},S.id))}),a.jsx("button",{className:`mute-btn ${f?"mute-btn--muted":""}`,onClick:()=>o(e.id,!f),children:f?"🔇 GROUP":"🔊 GROUP"})]})]}),g.length>0&&a.jsxs("div",{className:"group-vol",children:[a.jsx("span",{className:"group-vol-label mono",children:"ALL"}),a.jsxs("div",{className:"vol-slider",style:{flex:1},children:[a.jsx("div",{className:"vol-fill",style:{width:`${w}%`}}),a.jsx("input",{type:"range",min:0,max:100,step:1,value:w,onChange:S=>h(parseInt(S.target.value)),onMouseUp:S=>{u(e.id,parseInt(S.target.value)),h(null)},onTouchEnd:S=>{u(e.id,parseInt(S.target.value)),h(null)}})]}),a.jsx("span",{className:"param-value mono",children:w})]}),c.map(S=>a.jsx(Gp,{client:S,streams:t,onVolume:r,onMute:l,onDelete:s},S.id))]})}function Yp(){var g;const{groups:e,streams:t,clients:n,connected:r,error:l,setClientVolume:s,setClientMute:i,setGroupStream:o,setGroupMute:u,setGroupVolume:c,deleteClient:f}=Hp(),p=n.filter(x=>x.connected).length,h=(g=e.find(x=>{var w;return(w=x.clients)==null?void 0:w.some(S=>S.connected)}))==null?void 0:g.stream_id;return a.jsxs("div",{className:"panel",children:[a.jsx("section",{className:"panel-section",children:a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"SNAPCAST"}),a.jsxs("span",{className:"section-value",children:[a.jsx("span",{className:`dot ${r?"dot-green":"dot-red"}`}),a.jsx("span",{className:"mono",style:{marginLeft:6},children:r?`${p}/${n.length} online`:"disconnected"})]})]})}),l&&a.jsx("div",{className:"panel-error",children:l}),r&&a.jsx(qp,{activeStream:h}),t.length>0&&a.jsxs("section",{className:"panel-section",children:[a.jsx("div",{className:"section-header",children:a.jsx("span",{className:"section-label",children:"STREAMS"})}),a.jsx("div",{className:"stream-list",children:t.map(x=>{var w,S;return a.jsxs("div",{className:"stream-row",children:[a.jsx("span",{className:`dot ${x.status==="playing"?"dot-green":"dot-dim"}`}),a.jsx("span",{className:"stream-id mono",children:x.id}),a.jsx("span",{className:"stream-status",children:x.status}),((S=(w=x.uri)==null?void 0:w.query)==null?void 0:S.name)&&a.jsx("span",{className:"stream-name",children:x.uri.query.name})]},x.id)})})]}),e.length>0&&a.jsxs("section",{className:"panel-section",children:[a.jsx("div",{className:"section-header",children:a.jsx("span",{className:"section-label",children:"CLIENTS"})}),e.map(x=>a.jsx(Kp,{group:x,allStreams:t,clients:n,onVolume:s,onMute:i,onDelete:f,onGroupStream:o,onGroupMute:u,onGroupVolume:c},x.id))]}),r&&n.length===0&&a.jsx("div",{className:"panel-empty",children:"No Snapcast clients connected"})]})}const Zr=[{key:"mopidy",label:"Mopidy",desc:"Music server",check:()=>fetch("/api/mopidy/rpc",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"core.get_version"})}).then(e=>e.ok)},{key:"snapcast",label:"Snapserver",desc:"Multiroom audio",check:()=>fetch("/api/snapcast/rpc",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"Server.GetStatus"})}).then(e=>e.ok)},{key:"hifiberry",label:"HiFiBerry DSP",desc:"Audio processor (BeoCreate)",check:()=>fetch("/api/hifiberry/version").then(e=>e.ok)},{key:"nowplaying",label:"Now Playing",desc:"Song recognition + visualizer",check:()=>fetch("/api/now-playing/health").then(e=>e.ok)}];function Xp(){const e=Object.fromEntries(Zr.map(l=>[l.key,"checking"])),[t,n]=j.useState(e),r=j.useCallback(async()=>{n(Object.fromEntries(Zr.map(s=>[s.key,"checking"])));const l=await Promise.all(Zr.map(s=>s.check().then(i=>[s.key,i?"ok":"error"]).catch(()=>[s.key,"error"])));n(Object.fromEntries(l))},[]);return j.useEffect(()=>{r()},[r]),{statuses:t,check:r}}function Zp({status:e}){const t=`settings-service-badge settings-service-badge--${e}`,n=e==="checking"?"checking":e==="ok"?"online":"offline";return a.jsx("span",{className:t,children:n})}const Jp=[{key:"snapcast_url",label:"Snapcast RPC URL",hint:"Used by the Now Playing service"},{key:"mopidy_url",label:"Mopidy RPC URL",hint:"Used by the Now Playing service"},{key:"beocreate_host",label:"HiFiBerry host",hint:"BeoCreate Pi hostname or IP"},{key:"beocreate_port",label:"HiFiBerry port",hint:"",small:!0}];function bp(){const[e,t]=j.useState(null),[n,r]=j.useState("idle"),[l,s]=j.useState([]);j.useEffect(()=>{fetch("/api/now-playing/config").then(u=>u.json()).then(u=>t(u)).catch(()=>{})},[]);const i=(u,c)=>t(f=>({...f,[u]:c})),o=async()=>{r("saving"),s([]);try{const u=await fetch("/api/now-playing/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),c=await u.json();if(!u.ok)throw new Error(c.error||u.status);r("ok"),s(c.restart_required||[])}catch{r("error")}setTimeout(()=>r("idle"),6e3)};return e?a.jsxs(a.Fragment,{children:[Jp.map(({key:u,label:c,hint:f,small:p})=>a.jsxs("div",{className:"settings-row",children:[a.jsxs("div",{className:"settings-row-left",children:[a.jsx("div",{className:"settings-row-label",children:c}),f&&a.jsx("div",{className:"settings-row-hint",children:f})]}),a.jsx("input",{className:`settings-input${p?" settings-input--sm":""}`,value:e[u]??"",onChange:h=>i(u,h.target.value),spellCheck:!1})]},u)),a.jsx("div",{style:{display:"flex",justifyContent:"flex-end",marginTop:12},children:a.jsx("button",{className:"settings-action-btn",onClick:o,disabled:n==="saving",children:n==="saving"?"Saving…":"Save"})}),n==="ok"&&a.jsx("p",{className:"settings-feedback settings-feedback--ok",children:"✓ Settings saved"}),n==="error"&&a.jsx("p",{className:"settings-feedback settings-feedback--error",children:"✗ Failed to save settings"}),l.length>0&&a.jsxs("p",{className:"settings-feedback settings-feedback--warn",children:["↺ Restart required to apply ",l.join(", ")," changes:",a.jsx("br",{}),a.jsxs("code",{children:["docker compose restart ",l.join(" ")]})]})]}):a.jsx("div",{className:"settings-row-hint",children:"Connecting to now-playing service…"})}function em(){const{statuses:e,check:t}=Xp(),[n,r]=j.useState("idle"),l=async()=>{r("scanning");try{await I.localScan(),r("done")}catch{r("error")}setTimeout(()=>r("idle"),4e3)};return a.jsxs("div",{className:"panel",children:[a.jsxs("div",{className:"panel-section",children:[a.jsxs("div",{className:"section-header",children:[a.jsx("span",{className:"section-label",children:"SERVICES"}),a.jsx("button",{className:"icon-btn",style:{fontSize:"15px",padding:"1px 7px"},title:"Recheck all services",onClick:t,children:"↺"})]}),a.jsx("div",{className:"settings-service-list",children:Zr.map(s=>a.jsxs("div",{className:"settings-service-row",children:[a.jsxs("div",{style:{flex:1},children:[a.jsx("div",{className:"settings-service-label",children:s.label}),a.jsx("div",{className:"settings-service-desc",children:s.desc})]}),a.jsx(Zp,{status:e[s.key]})]},s.key))})]}),a.jsxs("div",{className:"panel-section",children:[a.jsx("div",{className:"section-label",style:{marginBottom:14},children:"CONNECTIONS"}),a.jsx(bp,{})]}),a.jsxs("div",{className:"panel-section",children:[a.jsx("div",{className:"section-label",style:{marginBottom:14},children:"MOPIDY"}),a.jsxs("div",{className:"settings-row",children:[a.jsxs("div",{className:"settings-row-left",children:[a.jsx("div",{className:"settings-row-label",children:"Local library scan"}),a.jsx("div",{className:"settings-row-hint",children:"Re-index files in the music directory"})]}),a.jsx("button",{className:"settings-action-btn",onClick:l,disabled:n==="scanning",children:n==="scanning"?"Scanning…":"Scan"})]}),(n==="done"||n==="error")&&a.jsx("p",{className:`settings-feedback settings-feedback--${n==="done"?"ok":"error"}`,children:n==="done"?"✓ Scan started":"✗ Failed to start scan"})]})]})}const tm={"--bg":"#1e1e2e","--surface":"#313244","--surface-hi":"#45475a","--surface-soft":"#272838","--border":"#45475a","--border-hi":"#585b70","--accent":"#cba6f7","--accent-lo":"rgba(203,166,247,0.16)","--accent-hi":"#f5c2e7","--accent-text":"#11111b","--blue":"#89b4fa","--mauve":"#cba6f7","--base":"#1e1e2e","--overlay":"#11111b"};function nt(e,t,n){return Math.max(t,Math.min(n,e))}function Oc(e,t,n){const r=e/255,l=t/255,s=n/255,i=Math.max(r,l,s),o=Math.min(r,l,s);let u=0,c=0;const f=(i+o)/2;if(i!==o){const p=i-o;c=f>.5?p/(2-i-o):p/(i+o),i===r?u=(l-s)/p+(lr.toString(16).padStart(2,"0")).join("")}`}function nm([e,t,n],r){return`rgba(${e},${t},${n},${r})`}function rm([e,t,n]){const r=Oc(e,t,n),l=r.s<.08?267:r.h,s=nt(Math.max(r.s,.36),.36,.76),i=rt(l,s,.74),o=rt((l+28)%360,nt(s*.86,.32,.72),.82),u=rt(l,nt(s*.22,.12,.28),.13),c=rt(l,nt(s*.24,.14,.32),.19),f=rt(l,nt(s*.2,.12,.28),.16),p=rt(l,nt(s*.22,.12,.3),.27),h=rt(l,nt(s*.2,.1,.28),.29),g=rt(l,nt(s*.22,.12,.32),.36),x=rt(l,nt(s*.18,.1,.24),.08);return{"--bg":Re(u),"--surface":Re(c),"--surface-soft":Re(f),"--surface-hi":Re(p),"--border":Re(h),"--border-hi":Re(g),"--accent":Re(i),"--accent-lo":nm(i,.16),"--accent-hi":Re(o),"--accent-text":"#0b0e11","--blue":Re(i),"--mauve":Re(o),"--base":Re(u),"--overlay":Re(x)}}function lm(e,t,n){const{s:r,l}=Oc(e,t,n);return l<.08||l>.92?0:r*1.8+(1-Math.abs(l-.52))*.7}async function sm(e){const t=new Image;t.decoding="async",t.src=e,await new Promise((c,f)=>{t.onload=c,t.onerror=f});const n=document.createElement("canvas"),r=64;n.width=r,n.height=r;const l=n.getContext("2d",{willReadFrequently:!0});l.drawImage(t,0,0,r,r);const s=l.getImageData(0,0,r,r).data,i=new Map;for(let c=0;c>4},${h>>4},${g>>4}`,w=i.get(x)??{r:0,g:0,b:0,count:0};w.r+=p,w.g+=h,w.b+=g,w.count+=1,i.set(x,w)}let o=null,u=-1;for(const c of i.values()){const f=[Math.round(c.r/c.count),Math.round(c.g/c.count),Math.round(c.b/c.count)],p=lm(...f)*Math.log2(c.count+1);p>u&&(u=p,o=f)}return o}function wu(e){const t=document.documentElement;Object.entries(e).forEach(([n,r])=>t.style.setProperty(n,r))}function im(){const e=j.useRef(null);j.useEffect(()=>{let t=!1;const n=async()=>{var l;try{const s=await Xn.get(),i=(l=s==null?void 0:s.metadata)==null?void 0:l.artwork,o=`${(s==null?void 0:s.active_stream)??""}:${i??""}`;if(!i||o===e.current)return;e.current=o;const u=i.startsWith("/api/mopidy-image/")?i:`/api/now-playing/artwork?t=${encodeURIComponent(o)}`,c=await sm(u);!t&&c&&wu(rm(c))}catch{!t&&e.current===null&&wu(tm)}};n();const r=setInterval(n,15e3);return()=>{t=!0,clearInterval(r)}},[])}const om=[{id:"dsp",label:"DSP"},{id:"player",label:"Player"},{id:"network",label:"Network"},{id:"settings",label:"Settings"}];function um(){const[e,t]=j.useState("player");return im(),a.jsxs("div",{className:"app",children:[a.jsxs("header",{className:"app-header",children:[a.jsxs("div",{className:"app-title",children:[a.jsx("span",{className:"app-title-main",children:"AUDIO"}),a.jsx("span",{className:"app-title-sub",children:"CONTROL"})]}),a.jsx("nav",{className:"tab-nav",children:om.map(n=>a.jsx("button",{className:`tab-btn ${e===n.id?"tab-btn--active":""}`,onClick:()=>t(n.id),"aria-pressed":e===n.id,children:n.label},n.id))})]}),a.jsxs("main",{className:"app-main",children:[e==="dsp"&&a.jsx(Sp,{}),e==="player"&&a.jsx(Bp,{}),e==="network"&&a.jsx(Yp,{}),e==="settings"&&a.jsx(em,{})]})]})}Rc(document.getElementById("root")).render(a.jsx(j.StrictMode,{children:a.jsx(um,{})})); diff --git a/audiocontrol/dist/assets/index-DqwSTyl8.css b/audiocontrol/dist/assets/index-DqwSTyl8.css deleted file mode 100644 index 9a173c1..0000000 --- a/audiocontrol/dist/assets/index-DqwSTyl8.css +++ /dev/null @@ -1 +0,0 @@ -@import"https://fonts.googleapis.com/css2?family=Syne:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap";*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:root{--bg: #1e1e2e;--surface: #313244;--surface-hi: #45475a;--border: #45475a;--border-hi: #585b70;--text: #cdd6f4;--text-muted: #a6adc8;--text-dim: #6c7086;--accent: #cba6f7;--accent-lo: rgba(203,166,247,.16);--accent-hi: #f5c2e7;--green: #a6e3a1;--green-lo: rgba(166,227,161,.16);--red: #f38ba8;--yellow: #f9e2af;--blue: #89b4fa;--mauve: #cba6f7;--overlay: #11111b;--radius: 3px;--ff: "Syne", sans-serif;--fm: "JetBrains Mono", monospace}html,body,#root{height:100%}body{background:var(--bg);color:var(--text);font-family:var(--ff);-webkit-font-smoothing:antialiased;font-size:14px}.app{display:flex;flex-direction:column;height:100%;max-width:720px;margin:0 auto}.app-header{display:flex;align-items:center;justify-content:space-between;padding:14px 20px 0;border-bottom:1px solid var(--border);flex-shrink:0}.app-title{display:flex;flex-direction:column;line-height:1;letter-spacing:.12em}.app-title-main{font-size:18px;font-weight:700;color:var(--accent)}.app-title-sub{font-size:9px;font-weight:500;color:var(--text-muted);letter-spacing:.25em;margin-top:2px}.tab-nav{display:flex;gap:2px}.tab-btn{background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;font-family:var(--ff);font-size:11px;font-weight:600;letter-spacing:.15em;padding:10px 14px 12px;transition:color .15s,border-color .15s}.tab-btn:hover{color:var(--text)}.tab-btn--active{color:var(--accent);border-bottom-color:var(--accent)}.app-main{flex:1;overflow-y:auto;padding:0 0 40px}.app-main::-webkit-scrollbar{width:4px}.app-main::-webkit-scrollbar-track{background:transparent}.app-main::-webkit-scrollbar-thumb{background:var(--border-hi);border-radius:2px}.panel{padding:0}.panel-section{padding:18px 20px;border-bottom:1px solid var(--border)}.panel-section--meta{padding:12px 20px}.panel-error{display:flex;align-items:center;gap:8px;padding:12px 20px;font-size:12px;color:var(--text-muted);border-bottom:1px solid var(--border)}.panel-empty{padding:32px 20px;font-size:12px;color:var(--text-muted);text-align:center;letter-spacing:.06em}.section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.section-label{font-size:10px;font-weight:600;letter-spacing:.2em;color:var(--text-muted)}.section-value{font-size:13px;color:var(--text)}.icon-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-family:var(--ff);line-height:1;transition:background .1s,border-color .1s,color .1s,opacity .1s}.icon-btn:hover:not(:disabled){background:var(--surface-hi);border-color:var(--border-hi);color:var(--text)}.icon-btn:disabled{cursor:default;opacity:.35}.action-toast{position:fixed;left:50%;bottom:18px;z-index:40;transform:translate(-50%);background:#11111beb;border:1px solid var(--border-hi);border-radius:var(--radius);color:var(--text);font-size:12px;padding:8px 12px;box-shadow:0 10px 30px #00000052}.dot{display:inline-block;width:6px;height:6px;border-radius:50%;flex-shrink:0}.dot-green{background:var(--green);box-shadow:0 0 6px var(--green)}.dot-red{background:var(--red)}.dot-dim{background:var(--text-dim)}.mono{font-family:var(--fm);font-size:12px}.vol-slider{position:relative;height:36px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.vol-fill{position:absolute;top:0;left:0;bottom:0;background:var(--accent-lo);border-right:1px solid var(--accent);pointer-events:none;transition:width .05s}.vol-slider input[type=range]{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;margin:0}.param-list{display:flex;flex-direction:column;gap:10px}.param-row{display:flex;align-items:center;gap:12px}.param-label{flex:0 0 140px;font-size:11px;color:var(--text-muted);letter-spacing:.05em;text-transform:capitalize}.param-control{flex:1;display:flex;align-items:center;gap:10px}.param-value{font-family:var(--fm);font-size:11px;color:var(--accent);flex:0 0 40px;text-align:right}.slider-track{flex:1;position:relative;height:24px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.slider-fill{position:absolute;top:0;left:0;bottom:0;background:var(--accent-lo);border-right:1px solid var(--accent);pointer-events:none}.slider-track input[type=range]{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;margin:0}.dsp-response-section{padding-bottom:10px}.dsp-response{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.dsp-response svg{display:block;width:100%;height:150px}.dsp-grid{stroke:#cdd6f41f;stroke-width:.35;vector-effect:non-scaling-stroke}.dsp-grid--freq{stroke:#cdd6f414}.dsp-axis{stroke:#cdd6f447;stroke-width:.55;vector-effect:non-scaling-stroke}.dsp-response-fill{fill:#89b4fa1f;stroke:none}.dsp-response-line{fill:none;stroke:var(--accent);stroke-width:1.6;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}.dsp-filter-dot{fill:var(--peach);stroke:var(--base);stroke-width:.7;vector-effect:non-scaling-stroke}.dsp-response-labels{display:flex;justify-content:space-between;border-top:1px solid var(--border);color:var(--text-muted);font-size:10px;padding:5px 8px 6px}.dsp-response-legend{display:flex;align-items:center;gap:14px;color:var(--text-muted);font-size:11px;margin-top:8px}.dsp-response-legend span{display:inline-flex;align-items:center;gap:6px}.legend-line{display:inline-block;width:18px;height:2px;border-radius:2px;background:var(--accent)}.legend-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--peach)}.select{width:100%;background:var(--surface);border:1px solid var(--border-hi);border-radius:var(--radius);color:var(--text);font-family:var(--ff);font-size:13px;padding:8px 28px 8px 12px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23a6adc8'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center}.select--sm{width:auto;font-size:11px;padding:4px 24px 4px 8px}.select:focus{outline:1px solid var(--accent)}.meta-row{display:flex;justify-content:space-between;padding:3px 0;border-bottom:1px solid var(--border);font-size:11px}.meta-key{color:var(--text-muted)}.meta-val{color:var(--text)}.now-playing{display:flex;align-items:center;gap:12px;padding:4px 0 12px}.now-playing--empty .track-title{color:var(--text-muted)}.now-cover{display:flex;align-items:center;justify-content:center;width:64px;height:64px;background:var(--overlay);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-dim);flex:0 0 64px;font-family:var(--fm);font-size:12px;overflow:hidden;position:relative}.now-cover img{width:100%;height:100%;object-fit:cover;display:block}.now-text{min-width:0}.track-title{font-size:16px;font-weight:600;margin-bottom:4px;line-height:1.3}.track-sub{font-size:12px;color:var(--text-muted)}.progress-bar{height:3px;background:var(--surface-hi);border-radius:2px;cursor:pointer;margin-bottom:6px;position:relative;overflow:visible}.progress-fill{height:100%;background:var(--accent);border-radius:2px;pointer-events:none;transition:width .5s linear}.progress-times{display:flex;justify-content:space-between;font-family:var(--fm);font-size:11px;color:var(--text-muted)}.transport-panel{display:flex;flex-direction:column;gap:10px}.transport-main{display:flex;align-items:center;gap:12px}.transport{flex:1;min-width:0;display:flex;align-items:center;justify-content:flex-start;gap:8px;margin-bottom:0}.transport-btn{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);cursor:pointer;font-size:18px;width:48px;height:42px;transition:border-color .1s,background .1s}.transport-btn:hover{border-color:var(--border-hi);background:var(--surface-hi)}.transport-btn--play{font-size:22px;width:72px;height:48px;border-color:var(--border-hi)}.transport-btn--play.transport-btn--active{background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.transport-btn--stop{font-size:14px;color:var(--text-muted)}.transport-btn--queue{color:var(--text-muted);font-family:var(--fm);font-size:12px;width:auto;min-width:54px;gap:6px;white-space:nowrap}.queue-count{color:var(--accent);font-size:11px}.transport-btn--active{background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.transport-volume{flex:0 0 150px;display:flex;align-items:center;gap:8px}.transport-volume-label{flex:0 0 28px;color:var(--text-muted);text-align:right}.vol-slider--sm{flex:1;height:28px;min-width:92px}.transport-toggles{display:flex;gap:6px;justify-content:flex-start}.toggle-btn{background:none;border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-family:var(--fm);font-size:14px;width:32px;height:28px;letter-spacing:.1em;transition:all .1s}.toggle-btn--on{background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.section-toggle{background:none;border:none;border-bottom:1px solid var(--border);color:var(--text-muted);cursor:pointer;font-family:var(--ff);font-size:10px;font-weight:600;letter-spacing:.2em;padding:6px 0;width:100%;text-align:left;transition:color .1s}.section-toggle:hover{color:var(--text)}.playlist-list{display:flex;flex-direction:column;margin-top:8px;gap:2px}.playlist-item{background:none;border:none;border-left:2px solid var(--border);color:var(--text);cursor:pointer;font-family:var(--ff);font-size:13px;padding:6px 12px;text-align:left;transition:border-color .1s,background .1s}.playlist-item:hover{border-left-color:var(--accent);background:var(--accent-lo)}.track-thumb,.search-thumb{display:inline-flex;align-items:center;justify-content:center;background:var(--overlay);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-dim);font-family:var(--fm);font-size:8px;overflow:hidden}.track-thumb img,.search-thumb img{width:100%;height:100%;object-fit:cover;display:block}.queue-shell{position:fixed;top:0;right:0;bottom:0;left:0;z-index:30;pointer-events:none}.queue-backdrop{position:absolute;top:0;right:0;bottom:0;left:0;background:#11111b85;border:none;cursor:pointer;pointer-events:auto}.queue-drawer{position:absolute;left:50%;bottom:0;width:min(720px,100%);max-height:min(78vh,680px);transform:translate(-50%);display:flex;flex-direction:column;background:var(--bg);border:1px solid var(--border-hi);border-bottom:none;border-radius:var(--radius) var(--radius) 0 0;box-shadow:0 -20px 44px #00000057;padding:14px 16px 18px;pointer-events:auto}.queue-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.queue-heading-actions{display:flex;align-items:center;gap:8px}.queue-subtitle{color:var(--text-dim);font-size:10px;margin-top:3px}.queue-close{width:30px;height:30px;font-size:18px}.queue-list{display:flex;flex-direction:column;gap:3px;overflow-y:auto;padding-right:2px}.queue-item{display:flex;align-items:center;gap:8px;padding:7px 8px;border-left:2px solid transparent;border-radius:var(--radius);transition:background .1s}.queue-item:hover{background:var(--surface-hi)}.queue-item--active{border-left-color:var(--accent);background:var(--accent-lo)}.queue-thumb{width:34px;height:34px;flex:0 0 34px}.queue-info{flex:1;min-width:0}.queue-title{display:block;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.queue-artist{font-size:11px;color:var(--text-muted)}.queue-dur{color:var(--text-muted);flex-shrink:0}.queue-play{width:28px;height:28px;font-size:10px;flex:0 0 28px}.queue-remove{width:28px;height:28px;color:var(--text-dim);font-size:16px;flex:0 0 28px}.queue-remove:hover{color:var(--red);border-color:var(--red)}.danger-btn{background:none;border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-family:var(--ff);font-size:11px;margin-top:10px;padding:6px 12px;transition:border-color .1s,color .1s}.danger-btn:hover{border-color:var(--red);color:var(--red)}.danger-btn--inline{margin-top:0;padding:4px 10px}.browser-search-row{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid var(--border)}.browser-input{flex:1;background:var(--surface);border:1px solid var(--border-hi);border-radius:var(--radius);color:var(--text);font-family:var(--fm);font-size:12px;padding:6px 10px;outline:none}.browser-input:focus{border-color:var(--accent)}.browser-icon-btn{background:none;border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-size:14px;padding:4px 8px;transition:color .1s,border-color .1s;flex-shrink:0}.browser-icon-btn:hover{color:var(--text);border-color:var(--border-hi)}.browser-nav{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border)}.browser-mode-row{display:flex;gap:6px;padding:8px 0 6px;border-bottom:1px solid var(--border)}.browser-mode-btn{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;flex:1;font-family:var(--ff);font-size:10px;font-weight:600;letter-spacing:.12em;padding:7px 10px;text-transform:uppercase;transition:background .1s,border-color .1s,color .1s}.browser-mode-btn:hover{color:var(--text);border-color:var(--border-hi)}.browser-mode-btn--active{background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.browser-mode-btn--search{flex:0 0 92px}.browser-back-btn{width:30px;height:28px;font-size:14px;flex-shrink:0}.browser-back-btn:hover:not(:disabled){color:var(--text);border-color:var(--border-hi)}.browser-back-btn:disabled{opacity:.25;cursor:default}.browser-crumbs{flex:1;display:flex;align-items:center;min-width:0;font-size:10px;color:var(--text-muted);overflow:hidden;white-space:nowrap}.browser-crumb{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.browser-crumb:last-child{color:var(--text)}.browser-crumb-sep{color:var(--text-dim);margin:0 5px}.browser-add-all-btn{font-family:var(--fm);font-size:10px;height:28px;padding:0 9px;white-space:nowrap;flex-shrink:0}.browser-add-all-btn:hover{color:var(--accent);border-color:var(--accent)}.browser-list{min-height:920px;max-height:920px;overflow-y:auto}.browser-list::-webkit-scrollbar{width:4px}.browser-list::-webkit-scrollbar-track{background:transparent}.browser-list::-webkit-scrollbar-thumb{background:var(--border-hi);border-radius:2px}.browser-msg{padding:16px 0;font-size:12px;color:var(--text-muted);text-align:center}.browser-row{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border)}.browser-row--search{padding:7px 0}.browser-row--dir{cursor:pointer}.browser-row--dir:hover .browser-name{color:var(--accent)}.browser-row--dir:hover{background:var(--surface-hi)}.browser-type{flex:0 0 28px;font-size:8px;color:var(--text-dim);letter-spacing:.05em}.browser-name{flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.browser-name-col{flex:1;display:flex;flex-direction:column;min-width:0}.browser-sub{font-size:10px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.browser-arrow{color:var(--text-muted);font-size:14px;flex-shrink:0}.browser-add-btn{font-size:13px;font-weight:600;width:28px;height:26px;flex-shrink:0}.browser-add-btn:hover{color:var(--accent);border-color:var(--accent)}.search-thumb{width:36px;height:36px;flex:0 0 36px}.cover-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:12px;padding:12px 0}.cover-card{min-width:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);cursor:pointer;font-family:var(--ff);overflow:hidden;text-align:left;transition:background .1s,border-color .1s,transform .1s}.cover-card:hover{background:var(--surface-hi);border-color:var(--accent);transform:translateY(-1px)}.cover-art{display:flex;align-items:center;justify-content:center;aspect-ratio:1;background:var(--overlay);border-bottom:1px solid var(--border);color:var(--text-dim);font-family:var(--fm);font-size:20px;overflow:hidden}.cover-art img{width:100%;height:100%;object-fit:cover;display:block}.cover-title{display:block;min-height:36px;padding:8px;font-size:12px;line-height:1.25;overflow:hidden}.group-vol{display:flex;align-items:center;gap:10px;padding:8px 12px;border-bottom:1px solid var(--border);background:var(--surface)}.group-vol-label{flex:0 0 28px;font-size:8px;color:var(--text-dim);letter-spacing:.05em}.snap-now{display:block}.snap-art{position:relative;display:flex;align-items:center;justify-content:center;width:100%;aspect-ratio:1;background:var(--overlay);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-dim);flex:none;font-family:var(--fm);font-size:34px;overflow:hidden}.snap-art img{width:100%;height:100%;object-fit:cover;display:block}.cava-overlay{position:absolute;left:0;right:0;bottom:0;display:flex;align-items:flex-end;gap:2px;pointer-events:none;background:transparent}.cava-overlay--cover{height:56%;padding:0 7px 7px}.cava-overlay--snapcast{height:50%;padding:0 10px 10px}.cava-overlay span{flex:1;min-width:2px;height:var(--bar-height);background:var(--accent-lo, rgba(205, 214, 244, .18));border-radius:2px 2px 0 0;transform-origin:bottom;animation:snap-cava-pulse 1.2s ease-in-out infinite alternate;animation-delay:var(--bar-delay)}.cava-overlay--live span{animation:none;transition:height .12s linear,opacity .12s linear}@keyframes snap-cava-pulse{0%{opacity:.12;transform:scaleY(.35)}to{opacity:.34;transform:scaleY(1)}}.snap-meta{position:absolute;left:0;right:0;top:0;min-width:0;max-height:50%;padding:12px;background:linear-gradient(to bottom,#11111bad,#11111b47,#11111b00);pointer-events:none;z-index:1}.snap-title{font-size:18px;font-weight:600;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.snap-artist{color:var(--text);font-size:14px;margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.snap-album,.snap-extra,.snap-source{color:var(--text-muted);font-size:12px;margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.section-header .snap-source{color:var(--text-dim);font-size:10px;margin-top:4px}.snap-error{color:var(--red);font-size:11px;margin-top:6px}.recognize-btn{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-family:var(--ff);font-size:10px;font-weight:600;letter-spacing:.12em;padding:5px 9px;text-transform:uppercase;transition:border-color .1s,color .1s,background .1s}.recognize-btn:hover:not(:disabled){background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.recognize-btn:disabled{cursor:default;opacity:.55}.stream-list{display:flex;flex-direction:column;gap:8px}.stream-row{display:flex;align-items:center;gap:10px;font-size:12px}.stream-id{flex:1;color:var(--text)}.stream-status,.stream-name{font-size:11px;color:var(--text-muted)}.group-section{margin-bottom:16px;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.group-header{display:flex;align-items:center;justify-content:space-between;background:var(--surface);padding:8px 12px;border-bottom:1px solid var(--border)}.group-name{font-size:10px;font-weight:600;letter-spacing:.2em;color:var(--text-muted)}.group-controls{display:flex;align-items:center;gap:8px}.client-row{padding:10px 12px;border-bottom:1px solid var(--border);transition:background .1s}.client-row:last-child{border-bottom:none}.client-row--offline{opacity:.45}.client-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.client-name-block{display:flex;align-items:center;gap:8px}.client-name{font-size:13px;font-weight:500}.client-host{font-size:10px;color:var(--text-muted)}.client-actions{display:flex;align-items:center;gap:8px}.client-stream{font-size:10px;color:var(--text-muted);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:2px 6px}.client-vol-row{display:flex;align-items:center;gap:10px}.mute-btn{background:none;border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;font-size:13px;padding:3px 8px;transition:border-color .1s}.mute-btn--muted{border-color:var(--accent);background:var(--accent-lo)}.mute-btn:hover{border-color:var(--border-hi)}.delete-btn{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:12px;padding:2px 6px;border-radius:var(--radius);transition:color .1s}.delete-btn:hover{color:var(--red)}@media (max-width: 560px){.app-header,.panel-section{padding-left:14px;padding-right:14px}.transport-main{flex-wrap:wrap}.transport{justify-content:center;overflow-x:auto;padding-bottom:2px}.transport-btn{width:42px;height:40px}.transport-btn--play{width:64px;height:48px}.transport-btn--queue{min-width:48px}.transport-volume{flex:1 0 100%}.browser-mode-row{flex-wrap:wrap}.browser-mode-btn,.browser-mode-btn--search{flex:1 1 calc(50% - 6px)}.queue-drawer{max-height:84vh;padding-left:12px;padding-right:12px}.queue-dur{display:none}.track-row .browser-add-btn{opacity:1}}.album-detail{position:relative}.album-header{display:flex;align-items:center;gap:8px;padding:4px 0;margin-bottom:8px}.album-back-btn{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:13px;padding:4px 8px;border-radius:var(--radius);transition:color .1s,background .1s}.album-back-btn:hover{color:var(--text);background:var(--surface-hi)}.album-type{font-size:11px;color:var(--text-dim);margin-left:auto}.album-play-menu{position:relative}.album-play-btn{display:inline-flex;align-items:center;gap:4px;background:var(--accent);border:1px solid var(--accent);border-radius:var(--radius);color:var(--accent-text);cursor:pointer;font-size:12px;font-weight:700;padding:4px 10px;transition:background .15s,transform .1s}.album-play-btn:hover{transform:scale(1.05)}.album-play-btn:disabled{cursor:default;opacity:.65;transform:none}.album-play-dropdown{position:absolute;top:100%;right:0;z-index:10;background:var(--overlay);border:1px solid var(--border);border-radius:var(--radius);box-shadow:0 8px 24px #0006;overflow:hidden;margin-top:4px;min-width:140px}.album-play-dropdown button{display:block;width:100%;background:none;border:none;color:var(--text);cursor:pointer;font-size:12px;padding:8px 12px;text-align:left;transition:background .1s}.album-play-dropdown button:hover{background:var(--surface-hi)}.album-play-dropdown button:disabled{cursor:default;opacity:.55}.album-info{display:flex;align-items:center;gap:16px;padding:8px 0 12px}.album-cover{width:64px;height:64px;min-width:64px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-weight:700;font-size:11px;flex-shrink:0}.album-cover img{width:100%;height:100%;object-fit:cover}.album-meta{flex:1;min-width:0}.album-name{font-weight:700;font-size:14px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.album-count{font-size:12px;color:var(--text-dim);margin-top:2px}.track-list{max-height:400px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--border) transparent}.disc-heading{position:sticky;top:0;z-index:1;background:var(--bg);border-bottom:1px solid var(--border);color:var(--accent);font-size:10px;padding:8px 8px 5px;text-transform:uppercase}.track-row{display:grid;grid-template-columns:32px 1fr 48px 32px;align-items:center;gap:8px;padding:4px 8px;border-radius:var(--radius);transition:background .1s}.track-row:hover{background:var(--surface-hi)}.track-num{font-size:11px;color:var(--text-dim)}.track-name{font-size:13px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.track-duration{font-size:12px;color:var(--text-dim);text-align:right}.track-row .browser-add-btn{justify-self:end;opacity:0;transition:opacity .15s}.track-row:hover .browser-add-btn{opacity:1}.settings-service-list{display:flex;flex-direction:column;gap:12px}.settings-service-row{display:flex;align-items:center;gap:10px}.settings-service-label{font-size:13px;color:var(--text)}.settings-service-desc{font-size:11px;color:var(--text-muted);margin-top:1px}.settings-service-badge{font-family:var(--fm);font-size:10px;padding:2px 8px;border-radius:var(--radius);letter-spacing:.06em;white-space:nowrap}.settings-service-badge--ok{color:var(--green);background:var(--green-lo)}.settings-service-badge--error{color:var(--red);background:#f38ba829}.settings-service-badge--checking{color:var(--text-dim);background:var(--surface)}.settings-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-bottom:1px solid var(--border)}.settings-row:last-child{border-bottom:none}.settings-row-left{flex:1;min-width:0}.settings-row-label{font-size:13px;color:var(--text)}.settings-row-hint{font-size:11px;color:var(--text-muted);margin-top:2px}.settings-action-btn{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-family:var(--ff);font-size:11px;font-weight:600;letter-spacing:.1em;padding:6px 14px;text-transform:uppercase;transition:border-color .1s,color .1s,background .1s;white-space:nowrap}.settings-action-btn:hover:not(:disabled){background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.settings-action-btn:disabled{cursor:default;opacity:.55}.settings-feedback{font-size:11px;font-family:var(--fm);margin-top:8px}.settings-feedback--ok{color:var(--green)}.settings-feedback--error{color:var(--red)}.settings-feedback--warn{color:var(--yellow)}.settings-feedback--warn code{font-family:var(--fm);background:var(--surface);padding:1px 5px;border-radius:var(--radius)}.settings-input{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);font-family:var(--fm);font-size:12px;min-width:0;padding:5px 8px;width:260px;transition:border-color .15s}.settings-input:focus{border-color:var(--accent);outline:none}.settings-input--sm{width:70px} diff --git a/audiocontrol/dist/assets/index-SAHpcFVS.css b/audiocontrol/dist/assets/index-SAHpcFVS.css new file mode 100644 index 0000000..ab30255 --- /dev/null +++ b/audiocontrol/dist/assets/index-SAHpcFVS.css @@ -0,0 +1 @@ +@import"https://fonts.googleapis.com/css2?family=Syne:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap";*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:root{--bg: #111418;--surface: #1b2026;--surface-hi: #252c34;--surface-soft: color-mix(in srgb, var(--surface) 58%, var(--bg));--border: #2d3540;--border-hi: #46515f;--text: #e7edf3;--text-muted: #9ba7b4;--text-dim: #677482;--accent: #44c2b4;--accent-lo: rgba(68,194,180,.15);--accent-hi: #8de3da;--accent-text: #071513;--green: #79d28f;--green-lo: rgba(121,210,143,.16);--red: #f07178;--yellow: #e9c46a;--blue: #7aa2f7;--mauve: #b48ead;--peach: #f4a261;--base: #111418;--overlay: #0b0e11;--radius: 6px;--ff: "Syne", sans-serif;--fm: "JetBrains Mono", monospace;--shadow: 0 18px 50px rgba(0, 0, 0, .28)}html,body,#root{height:100%}body{background:var(--bg);color:var(--text);font-family:var(--ff);-webkit-font-smoothing:antialiased;font-size:14px}.app{display:flex;flex-direction:column;height:100%;max-width:720px;margin:0 auto}.app-header{display:flex;align-items:center;justify-content:space-between;padding:14px 20px 0;border-bottom:1px solid var(--border);flex-shrink:0}.app-title{display:flex;flex-direction:column;line-height:1;letter-spacing:.12em}.app-title-main{font-size:18px;font-weight:700;color:var(--accent)}.app-title-sub{font-size:9px;font-weight:500;color:var(--text-muted);letter-spacing:.25em;margin-top:2px}.tab-nav{display:flex;gap:2px}.tab-btn{background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;font-family:var(--ff);font-size:11px;font-weight:600;letter-spacing:.15em;padding:10px 14px 12px;transition:color .15s,border-color .15s}.tab-btn:hover{color:var(--text)}.tab-btn--active{color:var(--accent);border-bottom-color:var(--accent)}.app-main{flex:1;overflow-y:auto;padding:0 0 40px}.app-main::-webkit-scrollbar{width:4px}.app-main::-webkit-scrollbar-track{background:transparent}.app-main::-webkit-scrollbar-thumb{background:var(--border-hi);border-radius:2px}.panel{padding:0}.panel-section{padding:18px 20px;border-bottom:1px solid var(--border)}.panel-section--meta{padding:12px 20px}.panel-error{display:flex;align-items:center;gap:8px;padding:12px 20px;font-size:12px;color:var(--text-muted);border-bottom:1px solid var(--border)}.panel-empty{padding:32px 20px;font-size:12px;color:var(--text-muted);text-align:center;letter-spacing:.06em}.section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.section-label{font-size:10px;font-weight:600;letter-spacing:.2em;color:var(--text-muted)}.section-value{font-size:13px;color:var(--text)}.icon-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-family:var(--ff);line-height:1;transition:background .1s,border-color .1s,color .1s,opacity .1s}.icon-btn:hover:not(:disabled){background:var(--surface-hi);border-color:var(--border-hi);color:var(--text)}.icon-btn:disabled{cursor:default;opacity:.35}.action-toast{position:fixed;left:50%;bottom:18px;z-index:40;transform:translate(-50%);background:#11111beb;border:1px solid var(--border-hi);border-radius:var(--radius);color:var(--text);font-size:12px;padding:8px 12px;box-shadow:0 10px 30px #00000052}.dot{display:inline-block;width:6px;height:6px;border-radius:50%;flex-shrink:0}.dot-green{background:var(--green);box-shadow:0 0 6px var(--green)}.dot-red{background:var(--red)}.dot-dim{background:var(--text-dim)}.mono{font-family:var(--fm);font-size:12px}.vol-slider{position:relative;height:36px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.vol-fill{position:absolute;top:0;left:0;bottom:0;background:var(--accent-lo);border-right:1px solid var(--accent);pointer-events:none;transition:width .05s}.vol-slider input[type=range]{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;margin:0}.param-list{display:flex;flex-direction:column;gap:10px}.param-row{display:flex;align-items:center;gap:12px}.param-label{flex:0 0 140px;font-size:11px;color:var(--text-muted);letter-spacing:.05em;text-transform:capitalize}.param-control{flex:1;display:flex;align-items:center;gap:10px}.param-value{font-family:var(--fm);font-size:11px;color:var(--accent);flex:0 0 40px;text-align:right}.slider-track{flex:1;position:relative;height:24px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.slider-fill{position:absolute;top:0;left:0;bottom:0;background:var(--accent-lo);border-right:1px solid var(--accent);pointer-events:none}.slider-track input[type=range]{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;margin:0}.dsp-response-section{padding-bottom:10px}.dsp-response{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.dsp-response svg{display:block;width:100%;height:150px}.dsp-grid{stroke:#cdd6f41f;stroke-width:.35;vector-effect:non-scaling-stroke}.dsp-grid--freq{stroke:#cdd6f414}.dsp-axis{stroke:#cdd6f447;stroke-width:.55;vector-effect:non-scaling-stroke}.dsp-response-fill{fill:#89b4fa1f;stroke:none}.dsp-response-line{fill:none;stroke:var(--accent);stroke-width:1.6;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}.dsp-filter-dot{fill:var(--peach);stroke:var(--base);stroke-width:.7;vector-effect:non-scaling-stroke}.dsp-response-labels{display:flex;justify-content:space-between;border-top:1px solid var(--border);color:var(--text-muted);font-size:10px;padding:5px 8px 6px}.dsp-response-legend{display:flex;align-items:center;gap:14px;color:var(--text-muted);font-size:11px;margin-top:8px}.dsp-response-legend span{display:inline-flex;align-items:center;gap:6px}.legend-line{display:inline-block;width:18px;height:2px;border-radius:2px;background:var(--accent)}.legend-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--peach)}.select{width:100%;background:var(--surface);border:1px solid var(--border-hi);border-radius:var(--radius);color:var(--text);font-family:var(--ff);font-size:13px;padding:8px 28px 8px 12px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23a6adc8'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center}.select--sm{width:auto;font-size:11px;padding:4px 24px 4px 8px}.select:focus{outline:1px solid var(--accent)}.meta-row{display:flex;justify-content:space-between;padding:3px 0;border-bottom:1px solid var(--border);font-size:11px}.meta-key{color:var(--text-muted)}.meta-val{color:var(--text)}.now-playing{display:flex;align-items:center;gap:12px;padding:4px 0 12px}.now-playing--empty .track-title{color:var(--text-muted)}.now-cover{display:flex;align-items:center;justify-content:center;width:64px;height:64px;background:var(--overlay);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-dim);flex:0 0 64px;font-family:var(--fm);font-size:12px;overflow:hidden;position:relative}.now-cover img{width:100%;height:100%;object-fit:cover;display:block}.now-text{min-width:0}.track-title{font-size:16px;font-weight:600;margin-bottom:4px;line-height:1.3}.track-sub{font-size:12px;color:var(--text-muted)}.progress-bar{height:3px;background:var(--surface-hi);border-radius:2px;cursor:pointer;margin-bottom:6px;position:relative;overflow:visible}.progress-fill{height:100%;background:var(--accent);border-radius:2px;pointer-events:none;transition:width .5s linear}.progress-times{display:flex;justify-content:space-between;font-family:var(--fm);font-size:11px;color:var(--text-muted)}.transport-panel{display:flex;flex-direction:column;gap:10px}.transport-main{display:flex;align-items:center;gap:12px}.transport{flex:1;min-width:0;display:flex;align-items:center;justify-content:flex-start;gap:8px;margin-bottom:0}.transport-btn{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);cursor:pointer;font-size:18px;width:48px;height:42px;transition:border-color .1s,background .1s}.transport-btn:hover{border-color:var(--border-hi);background:var(--surface-hi)}.transport-btn--play{font-size:22px;width:72px;height:48px;border-color:var(--border-hi)}.transport-btn--play.transport-btn--active{background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.transport-btn--stop{font-size:14px;color:var(--text-muted)}.transport-btn--queue{color:var(--text-muted);font-family:var(--fm);font-size:12px;width:auto;min-width:54px;gap:6px;white-space:nowrap}.queue-count{color:var(--accent);font-size:11px}.transport-btn--active{background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.transport-volume{flex:0 0 150px;display:flex;align-items:center;gap:8px}.transport-volume-label{flex:0 0 28px;color:var(--text-muted);text-align:right}.vol-slider--sm{flex:1;height:28px;min-width:92px}.transport-toggles{display:flex;gap:6px;justify-content:flex-start}.toggle-btn{background:none;border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-family:var(--fm);font-size:14px;width:32px;height:28px;letter-spacing:.1em;transition:all .1s}.toggle-btn--on{background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.section-toggle{background:none;border:none;border-bottom:1px solid var(--border);color:var(--text-muted);cursor:pointer;font-family:var(--ff);font-size:10px;font-weight:600;letter-spacing:.2em;padding:6px 0;width:100%;text-align:left;transition:color .1s}.section-toggle:hover{color:var(--text)}.playlist-list{display:flex;flex-direction:column;margin-top:8px;gap:2px}.playlist-item{background:none;border:none;border-left:2px solid var(--border);color:var(--text);cursor:pointer;font-family:var(--ff);font-size:13px;padding:6px 12px;text-align:left;transition:border-color .1s,background .1s}.playlist-item:hover{border-left-color:var(--accent);background:var(--accent-lo)}.track-thumb,.search-thumb{display:inline-flex;align-items:center;justify-content:center;background:var(--overlay);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-dim);font-family:var(--fm);font-size:8px;overflow:hidden}.track-thumb img,.search-thumb img{width:100%;height:100%;object-fit:cover;display:block}.queue-shell{position:fixed;top:0;right:0;bottom:0;left:0;z-index:30;pointer-events:none}.queue-backdrop{position:absolute;top:0;right:0;bottom:0;left:0;background:#11111b85;border:none;cursor:pointer;pointer-events:auto}.queue-drawer{position:absolute;left:50%;bottom:0;width:min(720px,100%);max-height:min(78vh,680px);transform:translate(-50%);display:flex;flex-direction:column;background:var(--bg);border:1px solid var(--border-hi);border-bottom:none;border-radius:var(--radius) var(--radius) 0 0;box-shadow:0 -20px 44px #00000057;padding:14px 16px 18px;pointer-events:auto}.queue-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.queue-heading-actions{display:flex;align-items:center;gap:8px}.queue-subtitle{color:var(--text-dim);font-size:10px;margin-top:3px}.queue-close{width:30px;height:30px;font-size:18px}.queue-list{display:flex;flex-direction:column;gap:3px;overflow-y:auto;padding-right:2px}.queue-item{display:flex;align-items:center;gap:8px;padding:7px 8px;border-left:2px solid transparent;border-radius:var(--radius);transition:background .1s}.queue-item:hover{background:var(--surface-hi)}.queue-item--active{border-left-color:var(--accent);background:var(--accent-lo)}.queue-thumb{width:34px;height:34px;flex:0 0 34px}.queue-info{flex:1;min-width:0}.queue-title{display:block;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.queue-artist{font-size:11px;color:var(--text-muted)}.queue-dur{color:var(--text-muted);flex-shrink:0}.queue-play{width:28px;height:28px;font-size:10px;flex:0 0 28px}.queue-remove{width:28px;height:28px;color:var(--text-dim);font-size:16px;flex:0 0 28px}.queue-remove:hover{color:var(--red);border-color:var(--red)}.danger-btn{background:none;border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-family:var(--ff);font-size:11px;margin-top:10px;padding:6px 12px;transition:border-color .1s,color .1s}.danger-btn:hover{border-color:var(--red);color:var(--red)}.danger-btn--inline{margin-top:0;padding:4px 10px}.browser-search-row{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid var(--border)}.browser-input{flex:1;background:var(--surface);border:1px solid var(--border-hi);border-radius:var(--radius);color:var(--text);font-family:var(--fm);font-size:12px;padding:6px 10px;outline:none}.browser-input:focus{border-color:var(--accent)}.browser-icon-btn{background:none;border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-size:14px;padding:4px 8px;transition:color .1s,border-color .1s;flex-shrink:0}.browser-icon-btn:hover{color:var(--text);border-color:var(--border-hi)}.browser-nav{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border)}.browser-mode-row{display:flex;gap:6px;padding:8px 0 6px;border-bottom:1px solid var(--border)}.browser-mode-btn{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;flex:1;font-family:var(--ff);font-size:10px;font-weight:600;letter-spacing:.12em;padding:7px 10px;text-transform:uppercase;transition:background .1s,border-color .1s,color .1s}.browser-mode-btn:hover{color:var(--text);border-color:var(--border-hi)}.browser-mode-btn--active{background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.browser-mode-btn--search{flex:0 0 92px}.browser-back-btn{width:30px;height:28px;font-size:14px;flex-shrink:0}.browser-back-btn:hover:not(:disabled){color:var(--text);border-color:var(--border-hi)}.browser-back-btn:disabled{opacity:.25;cursor:default}.browser-crumbs{flex:1;display:flex;align-items:center;min-width:0;font-size:10px;color:var(--text-muted);overflow:hidden;white-space:nowrap}.browser-crumb{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.browser-crumb:last-child{color:var(--text)}.browser-crumb-sep{color:var(--text-dim);margin:0 5px}.browser-add-all-btn{font-family:var(--fm);font-size:10px;height:28px;padding:0 9px;white-space:nowrap;flex-shrink:0}.browser-add-all-btn:hover{color:var(--accent);border-color:var(--accent)}.browser-list{min-height:920px;max-height:920px;overflow-y:auto}.browser-list::-webkit-scrollbar{width:4px}.browser-list::-webkit-scrollbar-track{background:transparent}.browser-list::-webkit-scrollbar-thumb{background:var(--border-hi);border-radius:2px}.browser-msg{padding:16px 0;font-size:12px;color:var(--text-muted);text-align:center}.browser-row{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border)}.browser-row--search{padding:7px 0}.browser-row--dir{cursor:pointer}.browser-row--dir:hover .browser-name{color:var(--accent)}.browser-row--dir:hover{background:var(--surface-hi)}.browser-type{flex:0 0 28px;font-size:8px;color:var(--text-dim);letter-spacing:.05em}.browser-name{flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.browser-name-col{flex:1;display:flex;flex-direction:column;min-width:0}.browser-sub{font-size:10px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.browser-arrow{color:var(--text-muted);font-size:14px;flex-shrink:0}.browser-add-btn{font-size:13px;font-weight:600;width:28px;height:26px;flex-shrink:0}.browser-add-btn:hover{color:var(--accent);border-color:var(--accent)}.search-thumb{width:36px;height:36px;flex:0 0 36px}.cover-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:12px;padding:12px 0}.cover-card{min-width:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);cursor:pointer;font-family:var(--ff);overflow:hidden;text-align:left;transition:background .1s,border-color .1s,transform .1s}.cover-card:hover{background:var(--surface-hi);border-color:var(--accent);transform:translateY(-1px)}.cover-art{display:flex;align-items:center;justify-content:center;aspect-ratio:1;background:var(--overlay);border-bottom:1px solid var(--border);color:var(--text-dim);font-family:var(--fm);font-size:20px;overflow:hidden}.cover-art img{width:100%;height:100%;object-fit:cover;display:block}.cover-title{display:block;min-height:36px;padding:8px;font-size:12px;line-height:1.25;overflow:hidden}.group-vol{display:flex;align-items:center;gap:10px;padding:8px 12px;border-bottom:1px solid var(--border);background:var(--surface)}.group-vol-label{flex:0 0 28px;font-size:8px;color:var(--text-dim);letter-spacing:.05em}.snap-now{display:block}.snap-art{position:relative;display:flex;align-items:center;justify-content:center;width:100%;aspect-ratio:1;background:var(--overlay);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-dim);flex:none;font-family:var(--fm);font-size:34px;overflow:hidden}.snap-art img{width:100%;height:100%;object-fit:cover;display:block}.cava-overlay{position:absolute;left:0;right:0;bottom:0;display:flex;align-items:flex-end;gap:2px;pointer-events:none;background:transparent}.cava-overlay--cover{height:56%;padding:0 7px 7px}.cava-overlay--snapcast{height:50%;padding:0 10px 10px}.cava-overlay span{flex:1;min-width:2px;height:var(--bar-height);background:var(--accent-lo, rgba(205, 214, 244, .18));border-radius:2px 2px 0 0;transform-origin:bottom;animation:snap-cava-pulse 1.2s ease-in-out infinite alternate;animation-delay:var(--bar-delay)}.cava-overlay--live span{animation:none;transition:height .12s linear,opacity .12s linear}@keyframes snap-cava-pulse{0%{opacity:.12;transform:scaleY(.35)}to{opacity:.34;transform:scaleY(1)}}.snap-meta{position:absolute;left:0;right:0;top:0;min-width:0;max-height:50%;padding:12px;background:linear-gradient(to bottom,#11111bad,#11111b47,#11111b00);pointer-events:none;z-index:1}.snap-title{font-size:18px;font-weight:600;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.snap-artist{color:var(--text);font-size:14px;margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.snap-album,.snap-extra,.snap-source{color:var(--text-muted);font-size:12px;margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.section-header .snap-source{color:var(--text-dim);font-size:10px;margin-top:4px}.snap-error{color:var(--red);font-size:11px;margin-top:6px}.recognize-btn{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-family:var(--ff);font-size:10px;font-weight:600;letter-spacing:.12em;padding:5px 9px;text-transform:uppercase;transition:border-color .1s,color .1s,background .1s}.recognize-btn:hover:not(:disabled){background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.recognize-btn:disabled{cursor:default;opacity:.55}.stream-list{display:flex;flex-direction:column;gap:8px}.stream-row{display:flex;align-items:center;gap:10px;font-size:12px}.stream-id{flex:1;color:var(--text)}.stream-status,.stream-name{font-size:11px;color:var(--text-muted)}.group-section{margin-bottom:16px;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.group-header{display:flex;align-items:center;justify-content:space-between;background:var(--surface);padding:8px 12px;border-bottom:1px solid var(--border)}.group-name{font-size:10px;font-weight:600;letter-spacing:.2em;color:var(--text-muted)}.group-controls{display:flex;align-items:center;gap:8px}.client-row{padding:10px 12px;border-bottom:1px solid var(--border);transition:background .1s}.client-row:last-child{border-bottom:none}.client-row--offline{opacity:.45}.client-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.client-name-block{display:flex;align-items:center;gap:8px}.client-name{font-size:13px;font-weight:500}.client-host{font-size:10px;color:var(--text-muted)}.client-actions{display:flex;align-items:center;gap:8px}.client-stream{font-size:10px;color:var(--text-muted);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:2px 6px}.client-vol-row{display:flex;align-items:center;gap:10px}.mute-btn{background:none;border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;font-size:13px;padding:3px 8px;transition:border-color .1s}.mute-btn--muted{border-color:var(--accent);background:var(--accent-lo)}.mute-btn:hover{border-color:var(--border-hi)}.delete-btn{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:12px;padding:2px 6px;border-radius:var(--radius);transition:color .1s}.delete-btn:hover{color:var(--red)}@media (max-width: 560px){.app-header,.panel-section{padding-left:14px;padding-right:14px}.transport-main{flex-wrap:wrap}.transport{justify-content:center;overflow-x:auto;padding-bottom:2px}.transport-btn{width:42px;height:40px}.transport-btn--play{width:64px;height:48px}.transport-btn--queue{min-width:48px}.transport-volume{flex:1 0 100%}.browser-mode-row{flex-wrap:wrap}.browser-mode-btn,.browser-mode-btn--search{flex:1 1 calc(50% - 6px)}.queue-drawer{max-height:84vh;padding-left:12px;padding-right:12px}.queue-dur{display:none}.track-row .browser-add-btn{opacity:1}}.album-detail{position:relative}.album-header{display:flex;align-items:center;gap:8px;padding:4px 0;margin-bottom:8px}.album-back-btn{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:13px;padding:4px 8px;border-radius:var(--radius);transition:color .1s,background .1s}.album-back-btn:hover{color:var(--text);background:var(--surface-hi)}.album-type{font-size:11px;color:var(--text-dim);margin-left:auto}.album-play-menu{position:relative}.album-play-btn{display:inline-flex;align-items:center;gap:4px;background:var(--accent);border:1px solid var(--accent);border-radius:var(--radius);color:var(--accent-text);cursor:pointer;font-size:12px;font-weight:700;padding:4px 10px;transition:background .15s,transform .1s}.album-play-btn:hover{transform:scale(1.05)}.album-play-btn:disabled{cursor:default;opacity:.65;transform:none}.album-play-dropdown{position:absolute;top:100%;right:0;z-index:10;background:var(--overlay);border:1px solid var(--border);border-radius:var(--radius);box-shadow:0 8px 24px #0006;overflow:hidden;margin-top:4px;min-width:140px}.album-play-dropdown button{display:block;width:100%;background:none;border:none;color:var(--text);cursor:pointer;font-size:12px;padding:8px 12px;text-align:left;transition:background .1s}.album-play-dropdown button:hover{background:var(--surface-hi)}.album-play-dropdown button:disabled{cursor:default;opacity:.55}.album-info{display:flex;align-items:center;gap:16px;padding:8px 0 12px}.album-cover{width:64px;height:64px;min-width:64px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-weight:700;font-size:11px;flex-shrink:0}.album-cover img{width:100%;height:100%;object-fit:cover}.album-meta{flex:1;min-width:0}.album-name{font-weight:700;font-size:14px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.album-count{font-size:12px;color:var(--text-dim);margin-top:2px}.track-list{max-height:400px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--border) transparent}.disc-heading{position:sticky;top:0;z-index:1;background:var(--bg);border-bottom:1px solid var(--border);color:var(--accent);font-size:10px;padding:8px 8px 5px;text-transform:uppercase}.track-row{display:grid;grid-template-columns:32px 1fr 48px 32px;align-items:center;gap:8px;padding:4px 8px;border-radius:var(--radius);transition:background .1s}.track-row:hover{background:var(--surface-hi)}.track-num{font-size:11px;color:var(--text-dim)}.track-name{font-size:13px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.track-duration{font-size:12px;color:var(--text-dim);text-align:right}.track-row .browser-add-btn{justify-self:end;opacity:0;transition:opacity .15s}.track-row:hover .browser-add-btn{opacity:1}.settings-service-list{display:flex;flex-direction:column;gap:12px}.settings-service-row{display:flex;align-items:center;gap:10px}.settings-service-label{font-size:13px;color:var(--text)}.settings-service-desc{font-size:11px;color:var(--text-muted);margin-top:1px}.settings-service-badge{font-family:var(--fm);font-size:10px;padding:2px 8px;border-radius:var(--radius);letter-spacing:.06em;white-space:nowrap}.settings-service-badge--ok{color:var(--green);background:var(--green-lo)}.settings-service-badge--error{color:var(--red);background:#f38ba829}.settings-service-badge--checking{color:var(--text-dim);background:var(--surface)}.settings-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-bottom:1px solid var(--border)}.settings-row:last-child{border-bottom:none}.settings-row-left{flex:1;min-width:0}.settings-row-label{font-size:13px;color:var(--text)}.settings-row-hint{font-size:11px;color:var(--text-muted);margin-top:2px}.settings-action-btn{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-muted);cursor:pointer;font-family:var(--ff);font-size:11px;font-weight:600;letter-spacing:.1em;padding:6px 14px;text-transform:uppercase;transition:border-color .1s,color .1s,background .1s;white-space:nowrap}.settings-action-btn:hover:not(:disabled){background:var(--accent-lo);border-color:var(--accent);color:var(--accent)}.settings-action-btn:disabled{cursor:default;opacity:.55}.settings-feedback{font-size:11px;font-family:var(--fm);margin-top:8px}.settings-feedback--ok{color:var(--green)}.settings-feedback--error{color:var(--red)}.settings-feedback--warn{color:var(--yellow)}.settings-feedback--warn code{font-family:var(--fm);background:var(--surface);padding:1px 5px;border-radius:var(--radius)}.settings-input{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);font-family:var(--fm);font-size:12px;min-width:0;padding:5px 8px;width:260px;transition:border-color .15s}.settings-input:focus{border-color:var(--accent);outline:none}.settings-input--sm{width:70px}body{background:radial-gradient(circle at 18% 0%,color-mix(in srgb,var(--accent) 14%,transparent),transparent 34%),linear-gradient(180deg,color-mix(in srgb,var(--surface-hi) 32%,var(--bg)) 0%,var(--bg) 48%,color-mix(in srgb,var(--overlay) 68%,var(--bg)) 100%)}.app{width:min(100%,980px);max-width:980px;min-height:100%;height:auto;padding:0 16px}.app-header{position:sticky;top:0;z-index:20;gap:22px;padding:18px 0 12px;border-bottom:1px solid color-mix(in srgb,var(--border-hi) 70%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--bg) 98%,transparent),color-mix(in srgb,var(--bg) 88%,transparent));-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.app-title{min-width:132px;letter-spacing:.08em}.app-title-main{color:var(--text);font-size:17px}.app-title-sub{color:var(--accent);font-size:10px}.tab-nav{flex:1;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;max-width:560px}.tab-btn{border:1px solid transparent;border-radius:var(--radius);color:var(--text-muted);font-size:12px;letter-spacing:.06em;padding:9px 10px;text-transform:none}.tab-btn:hover{background:#ffffff08;border-color:var(--border)}.tab-btn--active{background:var(--accent-lo);border-color:color-mix(in srgb,var(--accent) 55%,transparent);color:var(--accent-hi)}.app-main{padding:16px 0 48px}.panel{display:flex;flex-direction:column;gap:12px}.panel-section{border:1px solid var(--border);border-radius:var(--radius);background:linear-gradient(180deg,color-mix(in srgb,var(--surface-hi) 72%,transparent),color-mix(in srgb,var(--surface) 72%,transparent));padding:18px;box-shadow:0 1px #ffffff08 inset}.panel-section--meta{padding:12px 18px}.panel-error,.panel-empty{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface-soft)}.section-header{margin-bottom:16px}.section-label{color:var(--text-dim);font-size:11px;letter-spacing:.14em}.section-value{color:var(--text-muted)}.icon-btn,.browser-icon-btn,.browser-back-btn,.settings-action-btn,.recognize-btn,.danger-btn,.mute-btn,.toggle-btn,.transport-btn{min-height:32px}.icon-btn,.browser-icon-btn,.browser-back-btn,.settings-action-btn,.recognize-btn,.danger-btn,.mute-btn,.delete-btn,.toggle-btn,.transport-btn,.playlist-item,.cover-card,.browser-mode-btn,.album-back-btn,.album-play-btn,.album-play-dropdown button{-webkit-tap-highlight-color:transparent}.icon-btn:focus-visible,.tab-btn:focus-visible,.select:focus-visible,.settings-input:focus-visible,.browser-input:focus-visible,.transport-btn:focus-visible,.toggle-btn:focus-visible,.browser-mode-btn:focus-visible,.settings-action-btn:focus-visible{outline:2px solid color-mix(in srgb,var(--accent) 75%,transparent);outline-offset:2px}.vol-slider,.slider-track,.browser-input,.settings-input,.select{background:var(--surface-soft);border-color:var(--border)}.vol-slider{height:38px}.vol-fill,.slider-fill,.progress-fill{background:linear-gradient(90deg,color-mix(in srgb,var(--accent) 34%,transparent),var(--accent))}.now-playing{gap:16px;padding:2px 0 16px}.now-cover{width:92px;height:92px;flex-basis:92px;border-color:var(--border-hi);box-shadow:var(--shadow)}.now-cover--empty{box-shadow:none}.track-title{color:var(--text);font-size:22px;line-height:1.15;margin-bottom:8px}.track-sub{color:var(--text-muted);line-height:1.45}.progress-bar{height:8px;background:color-mix(in srgb,var(--overlay) 78%,var(--bg));border:1px solid var(--border);border-radius:999px;margin-bottom:8px}.progress-fill{border-radius:999px}.transport-panel{gap:14px}.transport{gap:10px}.transport-btn{background:var(--surface-soft);border-color:var(--border);border-radius:var(--radius);font-size:17px}.transport-btn:hover:not(:disabled){transform:translateY(-1px)}.transport-btn--play{width:76px;border-color:color-mix(in srgb,var(--accent) 55%,transparent);color:var(--accent-hi)}.transport-btn--play.transport-btn--active{background:linear-gradient(180deg,color-mix(in srgb,var(--accent) 28%,transparent),color-mix(in srgb,var(--accent) 12%,transparent))}.transport-volume{flex-basis:190px}.toggle-btn{width:38px;background:var(--surface-soft)}.toggle-btn--on,.transport-btn--active,.browser-mode-btn--active{box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 12%,transparent) inset}.section-toggle{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface-soft);color:var(--text-muted);padding:10px 12px}.playlist-list,.browser{margin-top:10px}.browser-mode-row{gap:8px;padding:0 0 10px}.browser-mode-btn{background:var(--surface-soft);padding:9px 10px;letter-spacing:.08em}.browser-search-row,.browser-nav{padding:10px 0}.browser-input{min-height:36px}.browser-list{min-height:min(66vh,720px);max-height:min(66vh,720px);padding-right:4px}.browser-row{min-height:42px;padding:7px 8px;border-radius:var(--radius)}.browser-row:hover{background:#ffffff09}.cover-grid{grid-template-columns:repeat(auto-fill,minmax(142px,1fr));gap:14px}.cover-card{background:var(--surface-soft)}.cover-title{min-height:48px;padding:10px}.queue-backdrop{background:#05070aad;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.queue-drawer{width:min(820px,calc(100% - 24px));background:color-mix(in srgb,var(--surface-soft) 80%,var(--overlay));border-color:var(--border-hi);border-radius:10px 10px 0 0}.queue-item{min-height:48px}.dsp-response{background:color-mix(in srgb,var(--overlay) 78%,var(--bg))}.dsp-response svg{height:190px}.dsp-response-fill{fill:color-mix(in srgb,var(--accent) 12%,transparent)}.group-section{background:var(--surface-soft);border-color:var(--border)}.group-header,.group-vol{background:color-mix(in srgb,var(--surface-hi) 78%,transparent)}.client-row:hover{background:#ffffff06}.stream-row,.settings-service-row,.settings-row,.meta-row{min-height:36px}.stream-row,.settings-service-row{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface-soft);padding:9px 10px}.snap-art{border-color:var(--border-hi);box-shadow:var(--shadow)}.snap-meta{background:linear-gradient(to bottom,rgba(5,7,10,.78),rgba(5,7,10,.34),transparent)}.snap-title{font-size:20px}.album-header{padding:8px 0}.album-play-btn{color:var(--accent-text)}.album-play-btn:hover{transform:translateY(-1px)}.track-list{max-height:min(54vh,520px)}.disc-heading{background:color-mix(in srgb,var(--surface-soft) 80%,var(--overlay))}.track-row{min-height:38px}.settings-input{min-height:34px}@media (min-width: 760px){.app-main>.panel{display:grid;grid-template-columns:minmax(0,1fr)}.panel-section:first-child .now-playing{align-items:flex-start}.panel-section:first-child .now-cover{width:124px;height:124px;flex-basis:124px}}@media (max-width: 640px){.app{padding:0 10px}.app-header{align-items:stretch;flex-direction:column;gap:12px;padding-top:14px}.app-title{min-width:0}.tab-nav{max-width:none}.tab-btn{font-size:11px;padding:9px 6px}.app-main{padding-top:10px}.panel{gap:10px}.panel-section{padding:14px 12px}.now-cover{width:76px;height:76px;flex-basis:76px}.track-title{font-size:18px}.transport-volume{flex-basis:100%}.browser-list{min-height:560px;max-height:560px}.cover-grid{grid-template-columns:repeat(auto-fill,minmax(118px,1fr))}.settings-row{align-items:stretch;flex-direction:column}.settings-input,.settings-input--sm{width:100%}} diff --git a/audiocontrol/dist/index.html b/audiocontrol/dist/index.html index efed572..e3e4a08 100644 --- a/audiocontrol/dist/index.html +++ b/audiocontrol/dist/index.html @@ -7,8 +7,8 @@ - - + +
diff --git a/audiocontrol/node_modules/.vite/deps/_metadata.json b/audiocontrol/node_modules/.vite/deps/_metadata.json new file mode 100644 index 0000000..0827f38 --- /dev/null +++ b/audiocontrol/node_modules/.vite/deps/_metadata.json @@ -0,0 +1,46 @@ +{ + "hash": "da0aea58", + "configHash": "f821e5b8", + "lockfileHash": "5d6ef89d", + "browserHash": "9295d454", + "optimized": { + "react": { + "src": "../../react/index.js", + "file": "react.js", + "fileHash": "ef6552ca", + "needsInterop": true + }, + "react-dom": { + "src": "../../react-dom/index.js", + "file": "react-dom.js", + "fileHash": "d1244567", + "needsInterop": true + }, + "react/jsx-dev-runtime": { + "src": "../../react/jsx-dev-runtime.js", + "file": "react_jsx-dev-runtime.js", + "fileHash": "a6e059f6", + "needsInterop": true + }, + "react/jsx-runtime": { + "src": "../../react/jsx-runtime.js", + "file": "react_jsx-runtime.js", + "fileHash": "eb926eaa", + "needsInterop": true + }, + "react-dom/client": { + "src": "../../react-dom/client.js", + "file": "react-dom_client.js", + "fileHash": "f7b551c0", + "needsInterop": true + } + }, + "chunks": { + "chunk-373CG7ZK": { + "file": "chunk-373CG7ZK.js" + }, + "chunk-REFQX4J5": { + "file": "chunk-REFQX4J5.js" + } + } +} \ No newline at end of file diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/chunk-373CG7ZK.js b/audiocontrol/node_modules/.vite/deps/chunk-373CG7ZK.js similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/chunk-373CG7ZK.js rename to audiocontrol/node_modules/.vite/deps/chunk-373CG7ZK.js diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/chunk-373CG7ZK.js.map b/audiocontrol/node_modules/.vite/deps/chunk-373CG7ZK.js.map similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/chunk-373CG7ZK.js.map rename to audiocontrol/node_modules/.vite/deps/chunk-373CG7ZK.js.map diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/chunk-REFQX4J5.js b/audiocontrol/node_modules/.vite/deps/chunk-REFQX4J5.js similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/chunk-REFQX4J5.js rename to audiocontrol/node_modules/.vite/deps/chunk-REFQX4J5.js diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/chunk-REFQX4J5.js.map b/audiocontrol/node_modules/.vite/deps/chunk-REFQX4J5.js.map similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/chunk-REFQX4J5.js.map rename to audiocontrol/node_modules/.vite/deps/chunk-REFQX4J5.js.map diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/package.json b/audiocontrol/node_modules/.vite/deps/package.json similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/package.json rename to audiocontrol/node_modules/.vite/deps/package.json diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/react-dom.js b/audiocontrol/node_modules/.vite/deps/react-dom.js similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/react-dom.js rename to audiocontrol/node_modules/.vite/deps/react-dom.js diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/react-dom.js.map b/audiocontrol/node_modules/.vite/deps/react-dom.js.map similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/react-dom.js.map rename to audiocontrol/node_modules/.vite/deps/react-dom.js.map diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/react-dom_client.js b/audiocontrol/node_modules/.vite/deps/react-dom_client.js similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/react-dom_client.js rename to audiocontrol/node_modules/.vite/deps/react-dom_client.js diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/react-dom_client.js.map b/audiocontrol/node_modules/.vite/deps/react-dom_client.js.map similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/react-dom_client.js.map rename to audiocontrol/node_modules/.vite/deps/react-dom_client.js.map diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/react.js b/audiocontrol/node_modules/.vite/deps/react.js similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/react.js rename to audiocontrol/node_modules/.vite/deps/react.js diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/react.js.map b/audiocontrol/node_modules/.vite/deps/react.js.map similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/react.js.map rename to audiocontrol/node_modules/.vite/deps/react.js.map diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/react_jsx-dev-runtime.js b/audiocontrol/node_modules/.vite/deps/react_jsx-dev-runtime.js similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/react_jsx-dev-runtime.js rename to audiocontrol/node_modules/.vite/deps/react_jsx-dev-runtime.js diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/react_jsx-dev-runtime.js.map b/audiocontrol/node_modules/.vite/deps/react_jsx-dev-runtime.js.map similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/react_jsx-dev-runtime.js.map rename to audiocontrol/node_modules/.vite/deps/react_jsx-dev-runtime.js.map diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/react_jsx-runtime.js b/audiocontrol/node_modules/.vite/deps/react_jsx-runtime.js similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/react_jsx-runtime.js rename to audiocontrol/node_modules/.vite/deps/react_jsx-runtime.js diff --git a/audiocontrol/node_modules/.vite/deps_temp_23962ec5/react_jsx-runtime.js.map b/audiocontrol/node_modules/.vite/deps/react_jsx-runtime.js.map similarity index 100% rename from audiocontrol/node_modules/.vite/deps_temp_23962ec5/react_jsx-runtime.js.map rename to audiocontrol/node_modules/.vite/deps/react_jsx-runtime.js.map diff --git a/audiocontrol/src/App.css b/audiocontrol/src/App.css index 5165601..9442cb9 100644 --- a/audiocontrol/src/App.css +++ b/audiocontrol/src/App.css @@ -3,27 +3,32 @@ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { - --bg: #1e1e2e; - --surface: #313244; - --surface-hi: #45475a; - --border: #45475a; - --border-hi: #585b70; - --text: #cdd6f4; - --text-muted: #a6adc8; - --text-dim: #6c7086; - --accent: #cba6f7; - --accent-lo: rgba(203,166,247,0.16); - --accent-hi: #f5c2e7; - --green: #a6e3a1; - --green-lo: rgba(166,227,161,0.16); - --red: #f38ba8; - --yellow: #f9e2af; - --blue: #89b4fa; - --mauve: #cba6f7; - --overlay: #11111b; - --radius: 3px; + --bg: #111418; + --surface: #1b2026; + --surface-hi: #252c34; + --surface-soft: color-mix(in srgb, var(--surface) 58%, var(--bg)); + --border: #2d3540; + --border-hi: #46515f; + --text: #e7edf3; + --text-muted: #9ba7b4; + --text-dim: #677482; + --accent: #44c2b4; + --accent-lo: rgba(68,194,180,0.15); + --accent-hi: #8de3da; + --accent-text: #071513; + --green: #79d28f; + --green-lo: rgba(121,210,143,0.16); + --red: #f07178; + --yellow: #e9c46a; + --blue: #7aa2f7; + --mauve: #b48ead; + --peach: #f4a261; + --base: #111418; + --overlay: #0b0e11; + --radius: 6px; --ff: 'Syne', sans-serif; --fm: 'JetBrains Mono', monospace; + --shadow: 0 18px 50px rgba(0, 0, 0, 0.28); } html, body, #root { height: 100%; } @@ -1597,3 +1602,513 @@ body { outline: none; } .settings-input--sm { width: 70px; } + +/* ── Design refresh ───────────────────────────────────────────────────────── */ +body { + background: + radial-gradient(circle at 18% 0%, color-mix(in srgb, var(--accent) 14%, transparent), transparent 34%), + linear-gradient(180deg, color-mix(in srgb, var(--surface-hi) 32%, var(--bg)) 0%, var(--bg) 48%, color-mix(in srgb, var(--overlay) 68%, var(--bg)) 100%); +} + +.app { + width: min(100%, 980px); + max-width: 980px; + min-height: 100%; + height: auto; + padding: 0 16px; +} + +.app-header { + position: sticky; + top: 0; + z-index: 20; + gap: 22px; + padding: 18px 0 12px; + border-bottom: 1px solid color-mix(in srgb, var(--border-hi) 70%, transparent); + background: linear-gradient(180deg, color-mix(in srgb, var(--bg) 98%, transparent), color-mix(in srgb, var(--bg) 88%, transparent)); + backdrop-filter: blur(14px); +} + +.app-title { + min-width: 132px; + letter-spacing: 0.08em; +} + +.app-title-main { + color: var(--text); + font-size: 17px; +} + +.app-title-sub { + color: var(--accent); + font-size: 10px; +} + +.tab-nav { + flex: 1; + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 6px; + max-width: 560px; +} + +.tab-btn { + border: 1px solid transparent; + border-radius: var(--radius); + color: var(--text-muted); + font-size: 12px; + letter-spacing: 0.06em; + padding: 9px 10px; + text-transform: none; +} + +.tab-btn:hover { + background: rgba(255, 255, 255, 0.03); + border-color: var(--border); +} + +.tab-btn--active { + background: var(--accent-lo); + border-color: color-mix(in srgb, var(--accent) 55%, transparent); + color: var(--accent-hi); +} + +.app-main { + padding: 16px 0 48px; +} + +.panel { + display: flex; + flex-direction: column; + gap: 12px; +} + +.panel-section { + border: 1px solid var(--border); + border-radius: var(--radius); + background: linear-gradient(180deg, color-mix(in srgb, var(--surface-hi) 72%, transparent), color-mix(in srgb, var(--surface) 72%, transparent)); + padding: 18px; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.03) inset; +} + +.panel-section--meta { + padding: 12px 18px; +} + +.panel-error, +.panel-empty { + border: 1px solid var(--border); + border-radius: var(--radius); + background: var(--surface-soft); +} + +.section-header { + margin-bottom: 16px; +} + +.section-label { + color: var(--text-dim); + font-size: 11px; + letter-spacing: 0.14em; +} + +.section-value { + color: var(--text-muted); +} + +.icon-btn, +.browser-icon-btn, +.browser-back-btn, +.settings-action-btn, +.recognize-btn, +.danger-btn, +.mute-btn, +.toggle-btn, +.transport-btn { + min-height: 32px; +} + +.icon-btn, +.browser-icon-btn, +.browser-back-btn, +.settings-action-btn, +.recognize-btn, +.danger-btn, +.mute-btn, +.delete-btn, +.toggle-btn, +.transport-btn, +.playlist-item, +.cover-card, +.browser-mode-btn, +.album-back-btn, +.album-play-btn, +.album-play-dropdown button { + -webkit-tap-highlight-color: transparent; +} + +.icon-btn:focus-visible, +.tab-btn:focus-visible, +.select:focus-visible, +.settings-input:focus-visible, +.browser-input:focus-visible, +.transport-btn:focus-visible, +.toggle-btn:focus-visible, +.browser-mode-btn:focus-visible, +.settings-action-btn:focus-visible { + outline: 2px solid color-mix(in srgb, var(--accent) 75%, transparent); + outline-offset: 2px; +} + +.vol-slider, +.slider-track, +.browser-input, +.settings-input, +.select { + background: var(--surface-soft); + border-color: var(--border); +} + +.vol-slider { + height: 38px; +} + +.vol-fill, +.slider-fill, +.progress-fill { + background: linear-gradient(90deg, color-mix(in srgb, var(--accent) 34%, transparent), var(--accent)); +} + +.now-playing { + gap: 16px; + padding: 2px 0 16px; +} + +.now-cover { + width: 92px; + height: 92px; + flex-basis: 92px; + border-color: var(--border-hi); + box-shadow: var(--shadow); +} + +.now-cover--empty { + box-shadow: none; +} + +.track-title { + color: var(--text); + font-size: 22px; + line-height: 1.15; + margin-bottom: 8px; +} + +.track-sub { + color: var(--text-muted); + line-height: 1.45; +} + +.progress-bar { + height: 8px; + background: color-mix(in srgb, var(--overlay) 78%, var(--bg)); + border: 1px solid var(--border); + border-radius: 999px; + margin-bottom: 8px; +} + +.progress-fill { + border-radius: 999px; +} + +.transport-panel { + gap: 14px; +} + +.transport { + gap: 10px; +} + +.transport-btn { + background: var(--surface-soft); + border-color: var(--border); + border-radius: var(--radius); + font-size: 17px; +} + +.transport-btn:hover:not(:disabled) { + transform: translateY(-1px); +} + +.transport-btn--play { + width: 76px; + border-color: color-mix(in srgb, var(--accent) 55%, transparent); + color: var(--accent-hi); +} + +.transport-btn--play.transport-btn--active { + background: linear-gradient(180deg, color-mix(in srgb, var(--accent) 28%, transparent), color-mix(in srgb, var(--accent) 12%, transparent)); +} + +.transport-volume { + flex-basis: 190px; +} + +.toggle-btn { + width: 38px; + background: var(--surface-soft); +} + +.toggle-btn--on, +.transport-btn--active, +.browser-mode-btn--active { + box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 12%, transparent) inset; +} + +.section-toggle { + border: 1px solid var(--border); + border-radius: var(--radius); + background: var(--surface-soft); + color: var(--text-muted); + padding: 10px 12px; +} + +.playlist-list, +.browser { + margin-top: 10px; +} + +.browser-mode-row { + gap: 8px; + padding: 0 0 10px; +} + +.browser-mode-btn { + background: var(--surface-soft); + padding: 9px 10px; + letter-spacing: 0.08em; +} + +.browser-search-row, +.browser-nav { + padding: 10px 0; +} + +.browser-input { + min-height: 36px; +} + +.browser-list { + min-height: min(66vh, 720px); + max-height: min(66vh, 720px); + padding-right: 4px; +} + +.browser-row { + min-height: 42px; + padding: 7px 8px; + border-radius: var(--radius); +} + +.browser-row:hover { + background: rgba(255, 255, 255, 0.035); +} + +.cover-grid { + grid-template-columns: repeat(auto-fill, minmax(142px, 1fr)); + gap: 14px; +} + +.cover-card { + background: var(--surface-soft); +} + +.cover-title { + min-height: 48px; + padding: 10px; +} + +.queue-backdrop { + background: rgba(5, 7, 10, 0.68); + backdrop-filter: blur(3px); +} + +.queue-drawer { + width: min(820px, calc(100% - 24px)); + background: color-mix(in srgb, var(--surface-soft) 80%, var(--overlay)); + border-color: var(--border-hi); + border-radius: 10px 10px 0 0; +} + +.queue-item { + min-height: 48px; +} + +.dsp-response { + background: color-mix(in srgb, var(--overlay) 78%, var(--bg)); +} + +.dsp-response svg { + height: 190px; +} + +.dsp-response-fill { + fill: color-mix(in srgb, var(--accent) 12%, transparent); +} + +.group-section { + background: var(--surface-soft); + border-color: var(--border); +} + +.group-header, +.group-vol { + background: color-mix(in srgb, var(--surface-hi) 78%, transparent); +} + +.client-row:hover { + background: rgba(255, 255, 255, 0.025); +} + +.stream-row, +.settings-service-row, +.settings-row, +.meta-row { + min-height: 36px; +} + +.stream-row, +.settings-service-row { + border: 1px solid var(--border); + border-radius: var(--radius); + background: var(--surface-soft); + padding: 9px 10px; +} + +.snap-art { + border-color: var(--border-hi); + box-shadow: var(--shadow); +} + +.snap-meta { + background: linear-gradient(to bottom, rgba(5, 7, 10, 0.78), rgba(5, 7, 10, 0.34), transparent); +} + +.snap-title { + font-size: 20px; +} + +.album-header { + padding: 8px 0; +} + +.album-play-btn { + color: var(--accent-text); +} + +.album-play-btn:hover { + transform: translateY(-1px); +} + +.track-list { + max-height: min(54vh, 520px); +} + +.disc-heading { + background: color-mix(in srgb, var(--surface-soft) 80%, var(--overlay)); +} + +.track-row { + min-height: 38px; +} + +.settings-input { + min-height: 34px; +} + +@media (min-width: 760px) { + .app-main > .panel { + display: grid; + grid-template-columns: minmax(0, 1fr); + } + + .panel-section:first-child .now-playing { + align-items: flex-start; + } + + .panel-section:first-child .now-cover { + width: 124px; + height: 124px; + flex-basis: 124px; + } +} + +@media (max-width: 640px) { + .app { + padding: 0 10px; + } + + .app-header { + align-items: stretch; + flex-direction: column; + gap: 12px; + padding-top: 14px; + } + + .app-title { + min-width: 0; + } + + .tab-nav { + max-width: none; + } + + .tab-btn { + font-size: 11px; + padding: 9px 6px; + } + + .app-main { + padding-top: 10px; + } + + .panel { + gap: 10px; + } + + .panel-section { + padding: 14px 12px; + } + + .now-cover { + width: 76px; + height: 76px; + flex-basis: 76px; + } + + .track-title { + font-size: 18px; + } + + .transport-volume { + flex-basis: 100%; + } + + .browser-list { + min-height: 560px; + max-height: 560px; + } + + .cover-grid { + grid-template-columns: repeat(auto-fill, minmax(118px, 1fr)); + } + + .settings-row { + align-items: stretch; + flex-direction: column; + } + + .settings-input, + .settings-input--sm { + width: 100%; + } +} diff --git a/audiocontrol/src/App.jsx b/audiocontrol/src/App.jsx index 1f3dff8..f25d29a 100644 --- a/audiocontrol/src/App.jsx +++ b/audiocontrol/src/App.jsx @@ -8,9 +8,9 @@ import './App.css'; const TABS = [ { id: 'dsp', label: 'DSP' }, - { id: 'player', label: 'PLAYER' }, - { id: 'network', label: 'NETWORK' }, - { id: 'settings', label: 'SETTINGS' }, + { id: 'player', label: 'Player' }, + { id: 'network', label: 'Network' }, + { id: 'settings', label: 'Settings' }, ]; export default function App() { @@ -30,6 +30,7 @@ export default function App() { key={t.id} className={`tab-btn ${tab === t.id ? 'tab-btn--active' : ''}`} onClick={() => setTab(t.id)} + aria-pressed={tab === t.id} > {t.label} diff --git a/audiocontrol/src/hooks/useArtworkTheme.js b/audiocontrol/src/hooks/useArtworkTheme.js index a29fcc1..6a71ff2 100644 --- a/audiocontrol/src/hooks/useArtworkTheme.js +++ b/audiocontrol/src/hooks/useArtworkTheme.js @@ -5,13 +5,17 @@ const DEFAULT_THEME = { '--bg': '#1e1e2e', '--surface': '#313244', '--surface-hi': '#45475a', + '--surface-soft': '#272838', '--border': '#45475a', '--border-hi': '#585b70', '--accent': '#cba6f7', '--accent-lo': 'rgba(203,166,247,0.16)', '--accent-hi': '#f5c2e7', + '--accent-text': '#11111b', '--blue': '#89b4fa', '--mauve': '#cba6f7', + '--base': '#1e1e2e', + '--overlay': '#11111b', }; function clamp(value, min, max) { @@ -74,21 +78,27 @@ function deriveTheme([r, g, b]) { const accentHi = hslToRgb((hue + 28) % 360, clamp(sat * 0.86, 0.32, 0.72), 0.82); const bg = hslToRgb(hue, clamp(sat * 0.22, 0.12, 0.28), 0.13); const surface = hslToRgb(hue, clamp(sat * 0.24, 0.14, 0.32), 0.19); + const surfaceSoft = hslToRgb(hue, clamp(sat * 0.20, 0.12, 0.28), 0.16); const surfaceHi = hslToRgb(hue, clamp(sat * 0.22, 0.12, 0.3), 0.27); const border = hslToRgb(hue, clamp(sat * 0.20, 0.10, 0.28), 0.29); const borderHi = hslToRgb(hue, clamp(sat * 0.22, 0.12, 0.32), 0.36); + const overlay = hslToRgb(hue, clamp(sat * 0.18, 0.10, 0.24), 0.08); return { '--bg': hex(bg), '--surface': hex(surface), + '--surface-soft': hex(surfaceSoft), '--surface-hi': hex(surfaceHi), '--border': hex(border), '--border-hi': hex(borderHi), '--accent': hex(accent), '--accent-lo': rgba(accent, 0.16), '--accent-hi': hex(accentHi), + '--accent-text': '#0b0e11', '--blue': hex(accent), '--mauve': hex(accentHi), + '--base': hex(bg), + '--overlay': hex(overlay), }; } diff --git a/mopidy/mopidy.conf b/mopidy/mopidy.conf index 7345fbd..1fa11c3 100644 --- a/mopidy/mopidy.conf +++ b/mopidy/mopidy.conf @@ -14,7 +14,7 @@ config_file = [audio] mixer = software mixer_volume = -output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! tee name=t ! queue leaky=2 ! filesink location=/audio/mopidy.fifo t. ! queue leaky=2 ! filesink location=/audio/cava.fifo +output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! tee name=t ! queue max-size-buffers=0 max-size-bytes=0 max-size-time=2000000000 ! filesink location=/audio/mopidy.fifo sync=true async=false t. ! queue leaky=2 max-size-buffers=0 max-size-bytes=0 max-size-time=200000000 ! filesink location=/audio/cava.fifo sync=true async=false buffer_time = [proxy] diff --git a/scripts/snapcast-now-playing.py b/scripts/snapcast-now-playing.py index 5bc119e..f3d8e4b 100755 --- a/scripts/snapcast-now-playing.py +++ b/scripts/snapcast-now-playing.py @@ -106,6 +106,7 @@ def _update_env_file(updates): # ── Internal state ──────────────────────────────────────────────────────────── _rpc_id = itertools.count(1) _cache = {} +_cache_lock = threading.Lock() _cava_lock = threading.Lock() _cava_process = None _cava_thread = None @@ -151,7 +152,14 @@ def rpc(url, method, params=None, timeout=8): # ── Snapcast / Mopidy metadata ──────────────────────────────────────────────── -def snapcast_status(): +def snapcast_status(max_age=0.75): + cache_key = ("snapcast_status", effective_snapcast_url()) + now = time.time() + with _cache_lock: + cached = _cache.get(cache_key) + if cached and now - cached["at"] <= max_age: + return cached["data"] + result = rpc(effective_snapcast_url(), "Server.GetStatus") server = result.get("server", result) groups = server.get("groups", []) @@ -162,12 +170,15 @@ def snapcast_status(): ) active_stream_id = active_group.get("stream_id") if active_group else None active_stream = next((s for s in streams if s.get("id") == active_stream_id), None) - return { + data = { "group": active_group, "stream": active_stream, "stream_id": active_stream_id, "streams": streams, } + with _cache_lock: + _cache[cache_key] = {"at": now, "data": data} + return data def mopidy_now_playing(): diff --git a/snapserver/Dockerfile b/snapserver/Dockerfile index a4322e1..3b9529d 100644 --- a/snapserver/Dockerfile +++ b/snapserver/Dockerfile @@ -25,7 +25,8 @@ ENTRYPOINT ["/entrypoint.sh"] EXPOSE 1704 1705 1780 HEALTHCHECK --interval=15s --timeout=5s --start-period=10s \ - CMD wget -qO- http://localhost:1780/jsonrpc \ + CMD curl -fsS http://localhost:1780/jsonrpc \ + -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","method":"Server.GetStatus","id":1}' \ | grep -q '"id":1' || exit 1