From 331302da0196d3c0d3dbb7eb8805e65efaf2c2bb Mon Sep 17 00:00:00 2001 From: legop3 Date: Thu, 21 May 2026 02:42:44 -0400 Subject: [PATCH] pre cardcolor --- server/public/assets/index-4eskKUF4.js | 131 ------------------ server/public/assets/index-B8wCAHw2.css | 1 - server/public/assets/index-BBFCmHB8.js | 131 ++++++++++++++++++ server/public/assets/index-Dva9v7lV.css | 1 + server/public/index.html | 4 +- webui/src/components/ButtonBoxPanel/index.jsx | 8 +- webui/src/components/CardFrame/index.jsx | 43 ++++++ webui/src/components/ChatPanel/index.jsx | 15 +- .../HomeAssistantControls/index.jsx | 52 ++++--- webui/src/components/LogPanel/index.jsx | 23 ++- .../OverseerPreferencePanel/index.jsx | 8 +- .../src/components/RawUserPilePanel/index.jsx | 18 +-- .../components/ReplaySourcesPanel/index.jsx | 10 +- webui/src/components/RightPaneTabs/index.jsx | 5 +- .../src/components/RoomCameraPanel/index.jsx | 56 ++++---- .../src/components/RoverQueuesPanel/index.jsx | 10 +- webui/src/components/TelemetryPanel/index.jsx | 2 +- .../TopDownMap/TopDownMapContent.jsx | 6 - webui/src/components/UserListPanel/index.jsx | 8 +- .../VipAudioUploadCardContent.jsx | 6 +- webui/src/components/vip/VipIdentityCard.jsx | 6 +- webui/src/components/vip/VipLiftCard.jsx | 28 ++-- webui/src/components/vip/VipNeatoCard.jsx | 26 ++-- .../vip/VipPrivateRoverAccessCard.jsx | 7 +- .../components/vip/VipProfileImageCard.jsx | 6 +- .../components/vip/VipVerificationCard.jsx | 17 +-- webui/src/index.css | 24 ---- 27 files changed, 324 insertions(+), 328 deletions(-) delete mode 100644 server/public/assets/index-4eskKUF4.js delete mode 100644 server/public/assets/index-B8wCAHw2.css create mode 100644 server/public/assets/index-BBFCmHB8.js create mode 100644 server/public/assets/index-Dva9v7lV.css create mode 100644 webui/src/components/CardFrame/index.jsx diff --git a/server/public/assets/index-4eskKUF4.js b/server/public/assets/index-4eskKUF4.js deleted file mode 100644 index e8aea877..00000000 --- a/server/public/assets/index-4eskKUF4.js +++ /dev/null @@ -1,131 +0,0 @@ -(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))o(u);new MutationObserver(u=>{for(const f of u)if(f.type==="childList")for(const h of f.addedNodes)h.tagName==="LINK"&&h.rel==="modulepreload"&&o(h)}).observe(document,{childList:!0,subtree:!0});function r(u){const f={};return u.integrity&&(f.integrity=u.integrity),u.referrerPolicy&&(f.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?f.credentials="include":u.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function o(u){if(u.ep)return;u.ep=!0;const f=r(u);fetch(u.href,f)}})();function wy(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var Yu={exports:{}},Jl={};var b0;function Ay(){if(b0)return Jl;b0=1;var n=Symbol.for("react.transitional.element"),a=Symbol.for("react.fragment");function r(o,u,f){var h=null;if(f!==void 0&&(h=""+f),u.key!==void 0&&(h=""+u.key),"key"in u){f={};for(var p in u)p!=="key"&&(f[p]=u[p])}else f=u;return u=f.ref,{$$typeof:n,type:o,key:h,ref:u!==void 0?u:null,props:f}}return Jl.Fragment=a,Jl.jsx=r,Jl.jsxs=r,Jl}var y0;function Cy(){return y0||(y0=1,Yu.exports=Ay()),Yu.exports}var l=Cy(),Fu={exports:{}},Me={};var S0;function ky(){if(S0)return Me;S0=1;var n=Symbol.for("react.transitional.element"),a=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),f=Symbol.for("react.consumer"),h=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),g=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),v=Symbol.for("react.lazy"),b=Symbol.for("react.activity"),S=Symbol.iterator;function k(T){return T===null||typeof T!="object"?null:(T=S&&T[S]||T["@@iterator"],typeof T=="function"?T:null)}var E={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},N=Object.assign,w={};function j(T,z,H){this.props=T,this.context=z,this.refs=w,this.updater=H||E}j.prototype.isReactComponent={},j.prototype.setState=function(T,z){if(typeof T!="object"&&typeof T!="function"&&T!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,T,z,"setState")},j.prototype.forceUpdate=function(T){this.updater.enqueueForceUpdate(this,T,"forceUpdate")};function M(){}M.prototype=j.prototype;function A(T,z,H){this.props=T,this.context=z,this.refs=w,this.updater=H||E}var R=A.prototype=new M;R.constructor=A,N(R,j.prototype),R.isPureReactComponent=!0;var q=Array.isArray;function G(){}var B={H:null,A:null,T:null,S:null},_=Object.prototype.hasOwnProperty;function X(T,z,H){var ae=H.ref;return{$$typeof:n,type:T,key:z,ref:ae!==void 0?ae:null,props:H}}function U(T,z){return X(T.type,z,T.props)}function J(T){return typeof T=="object"&&T!==null&&T.$$typeof===n}function Q(T){var z={"=":"=0",":":"=2"};return"$"+T.replace(/[=:]/g,function(H){return z[H]})}var de=/\/+/g;function ce(T,z){return typeof T=="object"&&T!==null&&T.key!=null?Q(""+T.key):z.toString(36)}function le(T){switch(T.status){case"fulfilled":return T.value;case"rejected":throw T.reason;default:switch(typeof T.status=="string"?T.then(G,G):(T.status="pending",T.then(function(z){T.status==="pending"&&(T.status="fulfilled",T.value=z)},function(z){T.status==="pending"&&(T.status="rejected",T.reason=z)})),T.status){case"fulfilled":return T.value;case"rejected":throw T.reason}}throw T}function O(T,z,H,ae,ue){var Se=typeof T;(Se==="undefined"||Se==="boolean")&&(T=null);var pe=!1;if(T===null)pe=!0;else switch(Se){case"bigint":case"string":case"number":pe=!0;break;case"object":switch(T.$$typeof){case n:case a:pe=!0;break;case v:return pe=T._init,O(pe(T._payload),z,H,ae,ue)}}if(pe)return ue=ue(T),pe=ae===""?"."+ce(T,0):ae,q(ue)?(H="",pe!=null&&(H=pe.replace(de,"$&/")+"/"),O(ue,z,H,"",function(ye){return ye})):ue!=null&&(J(ue)&&(ue=U(ue,H+(ue.key==null||T&&T.key===ue.key?"":(""+ue.key).replace(de,"$&/")+"/")+pe)),z.push(ue)),1;pe=0;var ge=ae===""?".":ae+":";if(q(T))for(var xe=0;xe>>1,ie=O[Z];if(0>>1;Zu(H,I))aeu(ue,H)?(O[Z]=ue,O[ae]=I,Z=ae):(O[Z]=H,O[z]=I,Z=z);else if(aeu(ue,I))O[Z]=ue,O[ae]=I,Z=ae;else break e}}return V}function u(O,V){var I=O.sortIndex-V.sortIndex;return I!==0?I:O.id-V.id}if(n.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var f=performance;n.unstable_now=function(){return f.now()}}else{var h=Date,p=h.now();n.unstable_now=function(){return h.now()-p}}var g=[],x=[],v=1,b=null,S=3,k=!1,E=!1,N=!1,w=!1,j=typeof setTimeout=="function"?setTimeout:null,M=typeof clearTimeout=="function"?clearTimeout:null,A=typeof setImmediate<"u"?setImmediate:null;function R(O){for(var V=r(x);V!==null;){if(V.callback===null)o(x);else if(V.startTime<=O)o(x),V.sortIndex=V.expirationTime,a(g,V);else break;V=r(x)}}function q(O){if(N=!1,R(O),!E)if(r(g)!==null)E=!0,G||(G=!0,Q());else{var V=r(x);V!==null&&le(q,V.startTime-O)}}var G=!1,B=-1,_=5,X=-1;function U(){return w?!0:!(n.unstable_now()-X<_)}function J(){if(w=!1,G){var O=n.unstable_now();X=O;var V=!0;try{e:{E=!1,N&&(N=!1,M(B),B=-1),k=!0;var I=S;try{t:{for(R(O),b=r(g);b!==null&&!(b.expirationTime>O&&U());){var Z=b.callback;if(typeof Z=="function"){b.callback=null,S=b.priorityLevel;var ie=Z(b.expirationTime<=O);if(O=n.unstable_now(),typeof ie=="function"){b.callback=ie,R(O),V=!0;break t}b===r(g)&&o(g),R(O)}else o(g);b=r(g)}if(b!==null)V=!0;else{var T=r(x);T!==null&&le(q,T.startTime-O),V=!1}}break e}finally{b=null,S=I,k=!1}V=void 0}}finally{V?Q():G=!1}}}var Q;if(typeof A=="function")Q=function(){A(J)};else if(typeof MessageChannel<"u"){var de=new MessageChannel,ce=de.port2;de.port1.onmessage=J,Q=function(){ce.postMessage(null)}}else Q=function(){j(J,0)};function le(O,V){B=j(function(){O(n.unstable_now())},V)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(O){O.callback=null},n.unstable_forceFrameRate=function(O){0>O||125Z?(O.sortIndex=I,a(x,O),r(g)===null&&O===r(x)&&(N?(M(B),B=-1):N=!0,le(q,I-Z))):(O.sortIndex=ie,a(g,O),E||k||(E=!0,G||(G=!0,Q()))),O},n.unstable_shouldYield=U,n.unstable_wrapCallback=function(O){var V=S;return function(){var I=S;S=V;try{return O.apply(this,arguments)}finally{S=I}}}})(Qu)),Qu}var w0;function My(){return w0||(w0=1,Xu.exports=Ey()),Xu.exports}var Ku={exports:{}},qt={};var A0;function Ry(){if(A0)return qt;A0=1;var n=Hd();function a(g){var x="https://react.dev/errors/"+g;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(a){console.error(a)}}return n(),Ku.exports=Ry(),Ku.exports}var k0;function qy(){if(k0)return Pl;k0=1;var n=My(),a=Hd(),r=Ty();function o(e){var t="https://react.dev/errors/"+e;if(1ie||(e.current=Z[ie],Z[ie]=null,ie--)}function H(e,t){ie++,Z[ie]=e.current,e.current=t}var ae=T(null),ue=T(null),Se=T(null),pe=T(null);function ge(e,t){switch(H(Se,t),H(ue,e),H(ae,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?$p(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=$p(t),e=Gp(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}z(ae),H(ae,e)}function xe(){z(ae),z(ue),z(Se)}function ye(e){e.memoizedState!==null&&H(pe,e);var t=ae.current,s=Gp(t,e.type);t!==s&&(H(ue,e),H(ae,s))}function Ce(e){ue.current===e&&(z(ae),z(ue)),pe.current===e&&(z(pe),Xl._currentValue=I)}var qe,Ze;function je(e){if(qe===void 0)try{throw Error()}catch(s){var t=s.stack.trim().match(/\n( *(at )?)/);qe=t&&t[1]||"",Ze=-1)":-1c||D[i]!==F[c]){var W=` -`+D[i].replace(" at new "," at ");return e.displayName&&W.includes("")&&(W=W.replace("",e.displayName)),W}while(1<=i&&0<=c);break}}}finally{at=!1,Error.prepareStackTrace=s}return(s=e?e.displayName||e.name:"")?je(s):""}function Ge(e,t){switch(e.tag){case 26:case 27:case 5:return je(e.type);case 16:return je("Lazy");case 13:return e.child!==t&&t!==null?je("Suspense Fallback"):je("Suspense");case 19:return je("SuspenseList");case 0:case 15:return ht(e.type,!1);case 11:return ht(e.type.render,!1);case 1:return ht(e.type,!0);case 31:return je("Activity");default:return""}}function Ne(e){try{var t="",s=null;do t+=Ge(e,s),s=e,e=e.return;while(e);return t}catch(i){return` -Error generating stack: `+i.message+` -`+i.stack}}var se=Object.prototype.hasOwnProperty,re=n.unstable_scheduleCallback,fe=n.unstable_cancelCallback,me=n.unstable_shouldYield,Re=n.unstable_requestPaint,te=n.unstable_now,he=n.unstable_getCurrentPriorityLevel,_e=n.unstable_ImmediatePriority,en=n.unstable_UserBlockingPriority,tn=n.unstable_NormalPriority,nn=n.unstable_LowPriority,Nt=n.unstable_IdlePriority,Ae=n.log,tt=n.unstable_setDisableYieldValue,Xe=null,Ee=null;function ze(e){if(typeof Ae=="function"&&tt(e),Ee&&typeof Ee.setStrictMode=="function")try{Ee.setStrictMode(Xe,e)}catch{}}var rt=Math.clz32?Math.clz32:St,Rs=Math.log,sa=Math.LN2;function St(e){return e>>>=0,e===0?32:31-(Rs(e)/sa|0)|0}var Nn=256,wr=262144,Ar=4194304;function Ts(e){var t=e&42;if(t!==0)return t;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:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Cr(e,t,s){var i=e.pendingLanes;if(i===0)return 0;var c=0,d=e.suspendedLanes,y=e.pingedLanes;e=e.warmLanes;var C=i&134217727;return C!==0?(i=C&~d,i!==0?c=Ts(i):(y&=C,y!==0?c=Ts(y):s||(s=C&~e,s!==0&&(c=Ts(s))))):(C=i&~d,C!==0?c=Ts(C):y!==0?c=Ts(y):s||(s=i&~e,s!==0&&(c=Ts(s)))),c===0?0:t!==0&&t!==c&&(t&d)===0&&(d=c&-c,s=t&-t,d>=s||d===32&&(s&4194048)!==0)?t:c}function rl(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function dv(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32: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 t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Nf(){var e=Ar;return Ar<<=1,(Ar&62914560)===0&&(Ar=4194304),e}function qo(e){for(var t=[],s=0;31>s;s++)t.push(e);return t}function il(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function fv(e,t,s,i,c,d){var y=e.pendingLanes;e.pendingLanes=s,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=s,e.entangledLanes&=s,e.errorRecoveryDisabledLanes&=s,e.shellSuspendCounter=0;var C=e.entanglements,D=e.expirationTimes,F=e.hiddenUpdates;for(s=y&~s;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var vv=/[\n"\\]/g;function an(e){return e.replace(vv,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function zo(e,t,s,i,c,d,y,C){e.name="",y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?e.type=y:e.removeAttribute("type"),t!=null?y==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+sn(t)):e.value!==""+sn(t)&&(e.value=""+sn(t)):y!=="submit"&&y!=="reset"||e.removeAttribute("value"),t!=null?Uo(e,y,sn(t)):s!=null?Uo(e,y,sn(s)):i!=null&&e.removeAttribute("value"),c==null&&d!=null&&(e.defaultChecked=!!d),c!=null&&(e.checked=c&&typeof c!="function"&&typeof c!="symbol"),C!=null&&typeof C!="function"&&typeof C!="symbol"&&typeof C!="boolean"?e.name=""+sn(C):e.removeAttribute("name")}function Of(e,t,s,i,c,d,y,C){if(d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"&&(e.type=d),t!=null||s!=null){if(!(d!=="submit"&&d!=="reset"||t!=null)){Lo(e);return}s=s!=null?""+sn(s):"",t=t!=null?""+sn(t):s,C||t===e.value||(e.value=t),e.defaultValue=t}i=i??c,i=typeof i!="function"&&typeof i!="symbol"&&!!i,e.checked=C?e.checked:!!i,e.defaultChecked=!!i,y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"&&(e.name=y),Lo(e)}function Uo(e,t,s){t==="number"&&Mr(e.ownerDocument)===e||e.defaultValue===""+s||(e.defaultValue=""+s)}function ca(e,t,s,i){if(e=e.options,t){t={};for(var c=0;c"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Yo=!1;if(_n)try{var dl={};Object.defineProperty(dl,"passive",{get:function(){Yo=!0}}),window.addEventListener("test",dl,dl),window.removeEventListener("test",dl,dl)}catch{Yo=!1}var ls=null,Fo=null,Tr=null;function Gf(){if(Tr)return Tr;var e,t=Fo,s=t.length,i,c="value"in ls?ls.value:ls.textContent,d=c.length;for(e=0;e=hl),Kf=" ",Zf=!1;function Jf(e,t){switch(e){case"keyup":return Iv.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Pf(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var ma=!1;function Qv(e,t){switch(e){case"compositionend":return Pf(t);case"keypress":return t.which!==32?null:(Zf=!0,Kf);case"textInput":return e=t.data,e===Kf&&Zf?null:e;default:return null}}function Kv(e,t){if(ma)return e==="compositionend"||!Zo&&Jf(e,t)?(e=Gf(),Tr=Fo=ls=null,ma=!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:s,offset:t-e};e=i}e:{for(;s;){if(s.nextSibling){s=s.nextSibling;break e}s=s.parentNode}s=void 0}s=rm(s)}}function om(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?om(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function cm(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Mr(e.document);t instanceof e.HTMLIFrameElement;){try{var s=typeof t.contentWindow.location.href=="string"}catch{s=!1}if(s)e=t.contentWindow;else break;t=Mr(e.document)}return t}function Wo(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")}var sb=_n&&"documentMode"in document&&11>=document.documentMode,ha=null,ec=null,vl=null,tc=!1;function um(e,t,s){var i=s.window===s?s.document:s.nodeType===9?s:s.ownerDocument;tc||ha==null||ha!==Mr(i)||(i=ha,"selectionStart"in i&&Wo(i)?i={start:i.selectionStart,end:i.selectionEnd}:(i=(i.ownerDocument&&i.ownerDocument.defaultView||window).getSelection(),i={anchorNode:i.anchorNode,anchorOffset:i.anchorOffset,focusNode:i.focusNode,focusOffset:i.focusOffset}),vl&&gl(vl,i)||(vl=i,i=wi(ec,"onSelect"),0>=y,c-=y,wn=1<<32-rt(t)+c|s<De?(He=be,be=null):He=be.sibling;var Fe=K($,be,Y[De],ee);if(Fe===null){be===null&&(be=He);break}e&&be&&Fe.alternate===null&&t($,be),L=d(Fe,L,De),Ye===null?we=Fe:Ye.sibling=Fe,Ye=Fe,be=He}if(De===Y.length)return s($,be),Ve&&On($,De),we;if(be===null){for(;DeDe?(He=be,be=null):He=be.sibling;var ks=K($,be,Fe.value,ee);if(ks===null){be===null&&(be=He);break}e&&be&&ks.alternate===null&&t($,be),L=d(ks,L,De),Ye===null?we=ks:Ye.sibling=ks,Ye=ks,be=He}if(Fe.done)return s($,be),Ve&&On($,De),we;if(be===null){for(;!Fe.done;De++,Fe=Y.next())Fe=ne($,Fe.value,ee),Fe!==null&&(L=d(Fe,L,De),Ye===null?we=Fe:Ye.sibling=Fe,Ye=Fe);return Ve&&On($,De),we}for(be=i(be);!Fe.done;De++,Fe=Y.next())Fe=P(be,$,De,Fe.value,ee),Fe!==null&&(e&&Fe.alternate!==null&&be.delete(Fe.key===null?De:Fe.key),L=d(Fe,L,De),Ye===null?we=Fe:Ye.sibling=Fe,Ye=Fe);return e&&be.forEach(function(Ny){return t($,Ny)}),Ve&&On($,De),we}function We($,L,Y,ee){if(typeof Y=="object"&&Y!==null&&Y.type===N&&Y.key===null&&(Y=Y.props.children),typeof Y=="object"&&Y!==null){switch(Y.$$typeof){case k:e:{for(var we=Y.key;L!==null;){if(L.key===we){if(we=Y.type,we===N){if(L.tag===7){s($,L.sibling),ee=c(L,Y.props.children),ee.return=$,$=ee;break e}}else if(L.elementType===we||typeof we=="object"&&we!==null&&we.$$typeof===_&&$s(we)===L.type){s($,L.sibling),ee=c(L,Y.props),wl(ee,Y),ee.return=$,$=ee;break e}s($,L);break}else t($,L);L=L.sibling}Y.type===N?(ee=Ls(Y.props.children,$.mode,ee,Y.key),ee.return=$,$=ee):(ee=Vr(Y.type,Y.key,Y.props,null,$.mode,ee),wl(ee,Y),ee.return=$,$=ee)}return y($);case E:e:{for(we=Y.key;L!==null;){if(L.key===we)if(L.tag===4&&L.stateNode.containerInfo===Y.containerInfo&&L.stateNode.implementation===Y.implementation){s($,L.sibling),ee=c(L,Y.children||[]),ee.return=$,$=ee;break e}else{s($,L);break}else t($,L);L=L.sibling}ee=oc(Y,$.mode,ee),ee.return=$,$=ee}return y($);case _:return Y=$s(Y),We($,L,Y,ee)}if(le(Y))return ve($,L,Y,ee);if(Q(Y)){if(we=Q(Y),typeof we!="function")throw Error(o(150));return Y=we.call(Y),ke($,L,Y,ee)}if(typeof Y.then=="function")return We($,L,Qr(Y),ee);if(Y.$$typeof===A)return We($,L,Yr($,Y),ee);Kr($,Y)}return typeof Y=="string"&&Y!==""||typeof Y=="number"||typeof Y=="bigint"?(Y=""+Y,L!==null&&L.tag===6?(s($,L.sibling),ee=c(L,Y),ee.return=$,$=ee):(s($,L),ee=ic(Y,$.mode,ee),ee.return=$,$=ee),y($)):s($,L)}return function($,L,Y,ee){try{Nl=0;var we=We($,L,Y,ee);return Aa=null,we}catch(be){if(be===wa||be===Ir)throw be;var Ye=Yt(29,be,null,$.mode);return Ye.lanes=ee,Ye.return=$,Ye}finally{}}}var Ys=Dm(!0),_m=Dm(!1),us=!1;function yc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Sc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function ds(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function fs(e,t,s){var i=e.updateQueue;if(i===null)return null;if(i=i.shared,(Ie&2)!==0){var c=i.pending;return c===null?t.next=t:(t.next=c.next,c.next=t),i.pending=t,t=Hr(e),gm(e,null,s),t}return Ur(e,i,t,s),Hr(e)}function Al(e,t,s){if(t=t.updateQueue,t!==null&&(t=t.shared,(s&4194048)!==0)){var i=t.lanes;i&=e.pendingLanes,s|=i,t.lanes=s,Af(e,s)}}function jc(e,t){var s=e.updateQueue,i=e.alternate;if(i!==null&&(i=i.updateQueue,s===i)){var c=null,d=null;if(s=s.firstBaseUpdate,s!==null){do{var y={lane:s.lane,tag:s.tag,payload:s.payload,callback:null,next:null};d===null?c=d=y:d=d.next=y,s=s.next}while(s!==null);d===null?c=d=t:d=d.next=t}else c=d=t;s={baseState:i.baseState,firstBaseUpdate:c,lastBaseUpdate:d,shared:i.shared,callbacks:i.callbacks},e.updateQueue=s;return}e=s.lastBaseUpdate,e===null?s.firstBaseUpdate=t:e.next=t,s.lastBaseUpdate=t}var Nc=!1;function Cl(){if(Nc){var e=Na;if(e!==null)throw e}}function kl(e,t,s,i){Nc=!1;var c=e.updateQueue;us=!1;var d=c.firstBaseUpdate,y=c.lastBaseUpdate,C=c.shared.pending;if(C!==null){c.shared.pending=null;var D=C,F=D.next;D.next=null,y===null?d=F:y.next=F,y=D;var W=e.alternate;W!==null&&(W=W.updateQueue,C=W.lastBaseUpdate,C!==y&&(C===null?W.firstBaseUpdate=F:C.next=F,W.lastBaseUpdate=D))}if(d!==null){var ne=c.baseState;y=0,W=F=D=null,C=d;do{var K=C.lane&-536870913,P=K!==C.lane;if(P?(Ue&K)===K:(i&K)===K){K!==0&&K===ja&&(Nc=!0),W!==null&&(W=W.next={lane:0,tag:C.tag,payload:C.payload,callback:null,next:null});e:{var ve=e,ke=C;K=t;var We=s;switch(ke.tag){case 1:if(ve=ke.payload,typeof ve=="function"){ne=ve.call(We,ne,K);break e}ne=ve;break e;case 3:ve.flags=ve.flags&-65537|128;case 0:if(ve=ke.payload,K=typeof ve=="function"?ve.call(We,ne,K):ve,K==null)break e;ne=b({},ne,K);break e;case 2:us=!0}}K=C.callback,K!==null&&(e.flags|=64,P&&(e.flags|=8192),P=c.callbacks,P===null?c.callbacks=[K]:P.push(K))}else P={lane:K,tag:C.tag,payload:C.payload,callback:C.callback,next:null},W===null?(F=W=P,D=ne):W=W.next=P,y|=K;if(C=C.next,C===null){if(C=c.shared.pending,C===null)break;P=C,C=P.next,P.next=null,c.lastBaseUpdate=P,c.shared.pending=null}}while(!0);W===null&&(D=ne),c.baseState=D,c.firstBaseUpdate=F,c.lastBaseUpdate=W,d===null&&(c.shared.lanes=0),gs|=y,e.lanes=y,e.memoizedState=ne}}function Bm(e,t){if(typeof e!="function")throw Error(o(191,e));e.call(t)}function Om(e,t){var s=e.callbacks;if(s!==null)for(e.callbacks=null,e=0;ed?d:8;var y=O.T,C={};O.T=C,$c(e,!1,t,s);try{var D=c(),F=O.S;if(F!==null&&F(C,D),D!==null&&typeof D=="object"&&typeof D.then=="function"){var W=fb(D,i);Rl(e,t,W,Kt(e))}else Rl(e,t,i,Kt(e))}catch(ne){Rl(e,t,{then:function(){},status:"rejected",reason:ne},Kt())}finally{V.p=d,y!==null&&C.types!==null&&(y.types=C.types),O.T=y}}function vb(){}function Hc(e,t,s,i){if(e.tag!==5)throw Error(o(476));var c=hh(e).queue;mh(e,c,t,I,s===null?vb:function(){return ph(e),s(i)})}function hh(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:I,baseState:I,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Hn,lastRenderedState:I},next:null};var s={};return t.next={memoizedState:s,baseState:s,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Hn,lastRenderedState:s},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ph(e){var t=hh(e);t.next===null&&(t=e.alternate.memoizedState),Rl(e,t.next.queue,{},Kt())}function Vc(){return Et(Xl)}function xh(){return mt().memoizedState}function gh(){return mt().memoizedState}function bb(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var s=Kt();e=ds(s);var i=fs(t,e,s);i!==null&&($t(i,t,s),Al(i,t,s)),t={cache:xc()},e.payload=t;return}t=t.return}}function yb(e,t,s){var i=Kt();s={lane:i,revertLane:0,gesture:null,action:s,hasEagerState:!1,eagerState:null,next:null},li(e)?bh(t,s):(s=lc(e,t,s,i),s!==null&&($t(s,e,i),yh(s,t,i)))}function vh(e,t,s){var i=Kt();Rl(e,t,s,i)}function Rl(e,t,s,i){var c={lane:i,revertLane:0,gesture:null,action:s,hasEagerState:!1,eagerState:null,next:null};if(li(e))bh(t,c);else{var d=e.alternate;if(e.lanes===0&&(d===null||d.lanes===0)&&(d=t.lastRenderedReducer,d!==null))try{var y=t.lastRenderedState,C=d(y,s);if(c.hasEagerState=!0,c.eagerState=C,Gt(C,y))return Ur(e,t,c,0),et===null&&zr(),!1}catch{}finally{}if(s=lc(e,t,c,i),s!==null)return $t(s,e,i),yh(s,t,i),!0}return!1}function $c(e,t,s,i){if(i={lane:2,revertLane:yu(),gesture:null,action:i,hasEagerState:!1,eagerState:null,next:null},li(e)){if(t)throw Error(o(479))}else t=lc(e,s,i,2),t!==null&&$t(t,e,2)}function li(e){var t=e.alternate;return e===Te||t!==null&&t===Te}function bh(e,t){ka=Pr=!0;var s=e.pending;s===null?t.next=t:(t.next=s.next,s.next=t),e.pending=t}function yh(e,t,s){if((s&4194048)!==0){var i=t.lanes;i&=e.pendingLanes,s|=i,t.lanes=s,Af(e,s)}}var Tl={readContext:Et,use:ti,useCallback:ct,useContext:ct,useEffect:ct,useImperativeHandle:ct,useLayoutEffect:ct,useInsertionEffect:ct,useMemo:ct,useReducer:ct,useRef:ct,useState:ct,useDebugValue:ct,useDeferredValue:ct,useTransition:ct,useSyncExternalStore:ct,useId:ct,useHostTransitionStatus:ct,useFormState:ct,useActionState:ct,useOptimistic:ct,useMemoCache:ct,useCacheRefresh:ct};Tl.useEffectEvent=ct;var Sh={readContext:Et,use:ti,useCallback:function(e,t){return _t().memoizedState=[e,t===void 0?null:t],e},useContext:Et,useEffect:ah,useImperativeHandle:function(e,t,s){s=s!=null?s.concat([e]):null,si(4194308,4,oh.bind(null,t,e),s)},useLayoutEffect:function(e,t){return si(4194308,4,e,t)},useInsertionEffect:function(e,t){si(4,2,e,t)},useMemo:function(e,t){var s=_t();t=t===void 0?null:t;var i=e();if(Fs){ze(!0);try{e()}finally{ze(!1)}}return s.memoizedState=[i,t],i},useReducer:function(e,t,s){var i=_t();if(s!==void 0){var c=s(t);if(Fs){ze(!0);try{s(t)}finally{ze(!1)}}}else c=t;return i.memoizedState=i.baseState=c,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:c},i.queue=e,e=e.dispatch=yb.bind(null,Te,e),[i.memoizedState,e]},useRef:function(e){var t=_t();return e={current:e},t.memoizedState=e},useState:function(e){e=Bc(e);var t=e.queue,s=vh.bind(null,Te,t);return t.dispatch=s,[e.memoizedState,s]},useDebugValue:zc,useDeferredValue:function(e,t){var s=_t();return Uc(s,e,t)},useTransition:function(){var e=Bc(!1);return e=mh.bind(null,Te,e.queue,!0,!1),_t().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,s){var i=Te,c=_t();if(Ve){if(s===void 0)throw Error(o(407));s=s()}else{if(s=t(),et===null)throw Error(o(349));(Ue&127)!==0||$m(i,t,s)}c.memoizedState=s;var d={value:s,getSnapshot:t};return c.queue=d,ah(Ym.bind(null,i,d,e),[e]),i.flags|=2048,Ma(9,{destroy:void 0},Gm.bind(null,i,d,s,t),null),s},useId:function(){var e=_t(),t=et.identifierPrefix;if(Ve){var s=An,i=wn;s=(i&~(1<<32-rt(i)-1)).toString(32)+s,t="_"+t+"R_"+s,s=Wr++,0<\/script>",d=d.removeChild(d.firstChild);break;case"select":d=typeof i.is=="string"?y.createElement("select",{is:i.is}):y.createElement("select"),i.multiple?d.multiple=!0:i.size&&(d.size=i.size);break;default:d=typeof i.is=="string"?y.createElement(c,{is:i.is}):y.createElement(c)}}d[Ct]=t,d[Ot]=i;e:for(y=t.child;y!==null;){if(y.tag===5||y.tag===6)d.appendChild(y.stateNode);else if(y.tag!==4&&y.tag!==27&&y.child!==null){y.child.return=y,y=y.child;continue}if(y===t)break e;for(;y.sibling===null;){if(y.return===null||y.return===t)break e;y=y.return}y.sibling.return=y.return,y=y.sibling}t.stateNode=d;e:switch(Rt(d,c,i),c){case"button":case"input":case"select":case"textarea":i=!!i.autoFocus;break e;case"img":i=!0;break e;default:i=!1}i&&$n(t)}}return st(t),nu(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,s),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==i&&$n(t);else{if(typeof i!="string"&&t.stateNode===null)throw Error(o(166));if(e=Se.current,ya(t)){if(e=t.stateNode,s=t.memoizedProps,i=null,c=kt,c!==null)switch(c.tag){case 27:case 5:i=c.memoizedProps}e[Ct]=t,e=!!(e.nodeValue===s||i!==null&&i.suppressHydrationWarning===!0||Hp(e.nodeValue,s)),e||os(t,!0)}else e=Ai(e).createTextNode(i),e[Ct]=t,t.stateNode=e}return st(t),null;case 31:if(s=t.memoizedState,e===null||e.memoizedState!==null){if(i=ya(t),s!==null){if(e===null){if(!i)throw Error(o(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(o(557));e[Ct]=t}else zs(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;st(t),e=!1}else s=fc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=s),e=!0;if(!e)return t.flags&256?(It(t),t):(It(t),null);if((t.flags&128)!==0)throw Error(o(558))}return st(t),null;case 13:if(i=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(c=ya(t),i!==null&&i.dehydrated!==null){if(e===null){if(!c)throw Error(o(318));if(c=t.memoizedState,c=c!==null?c.dehydrated:null,!c)throw Error(o(317));c[Ct]=t}else zs(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;st(t),c=!1}else c=fc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=c),c=!0;if(!c)return t.flags&256?(It(t),t):(It(t),null)}return It(t),(t.flags&128)!==0?(t.lanes=s,t):(s=i!==null,e=e!==null&&e.memoizedState!==null,s&&(i=t.child,c=null,i.alternate!==null&&i.alternate.memoizedState!==null&&i.alternate.memoizedState.cachePool!==null&&(c=i.alternate.memoizedState.cachePool.pool),d=null,i.memoizedState!==null&&i.memoizedState.cachePool!==null&&(d=i.memoizedState.cachePool.pool),d!==c&&(i.flags|=2048)),s!==e&&s&&(t.child.flags|=8192),ui(t,t.updateQueue),st(t),null);case 4:return xe(),e===null&&wu(t.stateNode.containerInfo),st(t),null;case 10:return zn(t.type),st(t),null;case 19:if(z(ft),i=t.memoizedState,i===null)return st(t),null;if(c=(t.flags&128)!==0,d=i.rendering,d===null)if(c)Dl(i,!1);else{if(ut!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(d=Jr(e),d!==null){for(t.flags|=128,Dl(i,!1),e=d.updateQueue,t.updateQueue=e,ui(t,e),t.subtreeFlags=0,e=s,s=t.child;s!==null;)vm(s,e),s=s.sibling;return H(ft,ft.current&1|2),Ve&&On(t,i.treeForkCount),t.child}e=e.sibling}i.tail!==null&&te()>pi&&(t.flags|=128,c=!0,Dl(i,!1),t.lanes=4194304)}else{if(!c)if(e=Jr(d),e!==null){if(t.flags|=128,c=!0,e=e.updateQueue,t.updateQueue=e,ui(t,e),Dl(i,!0),i.tail===null&&i.tailMode==="hidden"&&!d.alternate&&!Ve)return st(t),null}else 2*te()-i.renderingStartTime>pi&&s!==536870912&&(t.flags|=128,c=!0,Dl(i,!1),t.lanes=4194304);i.isBackwards?(d.sibling=t.child,t.child=d):(e=i.last,e!==null?e.sibling=d:t.child=d,i.last=d)}return i.tail!==null?(e=i.tail,i.rendering=e,i.tail=e.sibling,i.renderingStartTime=te(),e.sibling=null,s=ft.current,H(ft,c?s&1|2:s&1),Ve&&On(t,i.treeForkCount),e):(st(t),null);case 22:case 23:return It(t),Ac(),i=t.memoizedState!==null,e!==null?e.memoizedState!==null!==i&&(t.flags|=8192):i&&(t.flags|=8192),i?(s&536870912)!==0&&(t.flags&128)===0&&(st(t),t.subtreeFlags&6&&(t.flags|=8192)):st(t),s=t.updateQueue,s!==null&&ui(t,s.retryQueue),s=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(s=e.memoizedState.cachePool.pool),i=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(i=t.memoizedState.cachePool.pool),i!==s&&(t.flags|=2048),e!==null&&z(Vs),null;case 24:return s=null,e!==null&&(s=e.memoizedState.cache),t.memoizedState.cache!==s&&(t.flags|=2048),zn(pt),st(t),null;case 25:return null;case 30:return null}throw Error(o(156,t.tag))}function Ab(e,t){switch(uc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return zn(pt),xe(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ce(t),null;case 31:if(t.memoizedState!==null){if(It(t),t.alternate===null)throw Error(o(340));zs()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(It(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(o(340));zs()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return z(ft),null;case 4:return xe(),null;case 10:return zn(t.type),null;case 22:case 23:return It(t),Ac(),e!==null&&z(Vs),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return zn(pt),null;case 25:return null;default:return null}}function Fh(e,t){switch(uc(t),t.tag){case 3:zn(pt),xe();break;case 26:case 27:case 5:Ce(t);break;case 4:xe();break;case 31:t.memoizedState!==null&&It(t);break;case 13:It(t);break;case 19:z(ft);break;case 10:zn(t.type);break;case 22:case 23:It(t),Ac(),e!==null&&z(Vs);break;case 24:zn(pt)}}function _l(e,t){try{var s=t.updateQueue,i=s!==null?s.lastEffect:null;if(i!==null){var c=i.next;s=c;do{if((s.tag&e)===e){i=void 0;var d=s.create,y=s.inst;i=d(),y.destroy=i}s=s.next}while(s!==c)}}catch(C){Ke(t,t.return,C)}}function ps(e,t,s){try{var i=t.updateQueue,c=i!==null?i.lastEffect:null;if(c!==null){var d=c.next;i=d;do{if((i.tag&e)===e){var y=i.inst,C=y.destroy;if(C!==void 0){y.destroy=void 0,c=t;var D=s,F=C;try{F()}catch(W){Ke(c,D,W)}}}i=i.next}while(i!==d)}}catch(W){Ke(t,t.return,W)}}function Ih(e){var t=e.updateQueue;if(t!==null){var s=e.stateNode;try{Om(t,s)}catch(i){Ke(e,e.return,i)}}}function Xh(e,t,s){s.props=Is(e.type,e.memoizedProps),s.state=e.memoizedState;try{s.componentWillUnmount()}catch(i){Ke(e,t,i)}}function Bl(e,t){try{var s=e.ref;if(s!==null){switch(e.tag){case 26:case 27:case 5:var i=e.stateNode;break;case 30:i=e.stateNode;break;default:i=e.stateNode}typeof s=="function"?e.refCleanup=s(i):s.current=i}}catch(c){Ke(e,t,c)}}function Cn(e,t){var s=e.ref,i=e.refCleanup;if(s!==null)if(typeof i=="function")try{i()}catch(c){Ke(e,t,c)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof s=="function")try{s(null)}catch(c){Ke(e,t,c)}else s.current=null}function Qh(e){var t=e.type,s=e.memoizedProps,i=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":s.autoFocus&&i.focus();break e;case"img":s.src?i.src=s.src:s.srcSet&&(i.srcset=s.srcSet)}}catch(c){Ke(e,e.return,c)}}function su(e,t,s){try{var i=e.stateNode;Xb(i,e.type,s,t),i[Ot]=t}catch(c){Ke(e,e.return,c)}}function Kh(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&js(e.type)||e.tag===4}function au(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Kh(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.tag===27&&js(e.type)||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 lu(e,t,s){var i=e.tag;if(i===5||i===6)e=e.stateNode,t?(s.nodeType===9?s.body:s.nodeName==="HTML"?s.ownerDocument.body:s).insertBefore(e,t):(t=s.nodeType===9?s.body:s.nodeName==="HTML"?s.ownerDocument.body:s,t.appendChild(e),s=s._reactRootContainer,s!=null||t.onclick!==null||(t.onclick=Dn));else if(i!==4&&(i===27&&js(e.type)&&(s=e.stateNode,t=null),e=e.child,e!==null))for(lu(e,t,s),e=e.sibling;e!==null;)lu(e,t,s),e=e.sibling}function di(e,t,s){var i=e.tag;if(i===5||i===6)e=e.stateNode,t?s.insertBefore(e,t):s.appendChild(e);else if(i!==4&&(i===27&&js(e.type)&&(s=e.stateNode),e=e.child,e!==null))for(di(e,t,s),e=e.sibling;e!==null;)di(e,t,s),e=e.sibling}function Zh(e){var t=e.stateNode,s=e.memoizedProps;try{for(var i=e.type,c=t.attributes;c.length;)t.removeAttributeNode(c[0]);Rt(t,i,s),t[Ct]=e,t[Ot]=s}catch(d){Ke(e,e.return,d)}}var Gn=!1,vt=!1,ru=!1,Jh=typeof WeakSet=="function"?WeakSet:Set,At=null;function Cb(e,t){if(e=e.containerInfo,ku=qi,e=cm(e),Wo(e)){if("selectionStart"in e)var s={start:e.selectionStart,end:e.selectionEnd};else e:{s=(s=e.ownerDocument)&&s.defaultView||window;var i=s.getSelection&&s.getSelection();if(i&&i.rangeCount!==0){s=i.anchorNode;var c=i.anchorOffset,d=i.focusNode;i=i.focusOffset;try{s.nodeType,d.nodeType}catch{s=null;break e}var y=0,C=-1,D=-1,F=0,W=0,ne=e,K=null;t:for(;;){for(var P;ne!==s||c!==0&&ne.nodeType!==3||(C=y+c),ne!==d||i!==0&&ne.nodeType!==3||(D=y+i),ne.nodeType===3&&(y+=ne.nodeValue.length),(P=ne.firstChild)!==null;)K=ne,ne=P;for(;;){if(ne===e)break t;if(K===s&&++F===c&&(C=y),K===d&&++W===i&&(D=y),(P=ne.nextSibling)!==null)break;ne=K,K=ne.parentNode}ne=P}s=C===-1||D===-1?null:{start:C,end:D}}else s=null}s=s||{start:0,end:0}}else s=null;for(Eu={focusedElem:e,selectionRange:s},qi=!1,At=t;At!==null;)if(t=At,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,At=e;else for(;At!==null;){switch(t=At,d=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(s=0;s title"))),Rt(d,i,s),d[Ct]=e,wt(d),i=d;break e;case"link":var y=s0("link","href",c).get(i+(s.href||""));if(y){for(var C=0;CWe&&(y=We,We=ke,ke=y);var $=im(C,ke),L=im(C,We);if($&&L&&(P.rangeCount!==1||P.anchorNode!==$.node||P.anchorOffset!==$.offset||P.focusNode!==L.node||P.focusOffset!==L.offset)){var Y=ne.createRange();Y.setStart($.node,$.offset),P.removeAllRanges(),ke>We?(P.addRange(Y),P.extend(L.node,L.offset)):(Y.setEnd(L.node,L.offset),P.addRange(Y))}}}}for(ne=[],P=C;P=P.parentNode;)P.nodeType===1&&ne.push({element:P,left:P.scrollLeft,top:P.scrollTop});for(typeof C.focus=="function"&&C.focus(),C=0;Cs?32:s,O.T=null,s=mu,mu=null;var d=bs,y=Qn;if(jt=0,_a=bs=null,Qn=0,(Ie&6)!==0)throw Error(o(331));var C=Ie;if(Ie|=4,op(d.current),lp(d,d.current,y,s),Ie=C,Vl(0,!1),Ee&&typeof Ee.onPostCommitFiberRoot=="function")try{Ee.onPostCommitFiberRoot(Xe,d)}catch{}return!0}finally{V.p=c,O.T=i,Cp(e,t)}}function Ep(e,t,s){t=rn(s,t),t=Ic(e.stateNode,t,2),e=fs(e,t,2),e!==null&&(il(e,2),kn(e))}function Ke(e,t,s){if(e.tag===3)Ep(e,e,s);else for(;t!==null;){if(t.tag===3){Ep(t,e,s);break}else if(t.tag===1){var i=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof i.componentDidCatch=="function"&&(vs===null||!vs.has(i))){e=rn(s,e),s=Mh(2),i=fs(t,s,2),i!==null&&(Rh(s,i,t,e),il(i,2),kn(i));break}}t=t.return}}function gu(e,t,s){var i=e.pingCache;if(i===null){i=e.pingCache=new Mb;var c=new Set;i.set(t,c)}else c=i.get(t),c===void 0&&(c=new Set,i.set(t,c));c.has(s)||(cu=!0,c.add(s),e=_b.bind(null,e,t,s),t.then(e,e))}function _b(e,t,s){var i=e.pingCache;i!==null&&i.delete(t),e.pingedLanes|=e.suspendedLanes&s,e.warmLanes&=~s,et===e&&(Ue&s)===s&&(ut===4||ut===3&&(Ue&62914560)===Ue&&300>te()-hi?(Ie&2)===0&&Ba(e,0):uu|=s,Da===Ue&&(Da=0)),kn(e)}function Mp(e,t){t===0&&(t=Nf()),e=Os(e,t),e!==null&&(il(e,t),kn(e))}function Bb(e){var t=e.memoizedState,s=0;t!==null&&(s=t.retryLane),Mp(e,s)}function Ob(e,t){var s=0;switch(e.tag){case 31:case 13:var i=e.stateNode,c=e.memoizedState;c!==null&&(s=c.retryLane);break;case 19:i=e.stateNode;break;case 22:i=e.stateNode._retryCache;break;default:throw Error(o(314))}i!==null&&i.delete(t),Mp(e,s)}function Lb(e,t){return re(e,t)}var Si=null,La=null,vu=!1,ji=!1,bu=!1,Ss=0;function kn(e){e!==La&&e.next===null&&(La===null?Si=La=e:La=La.next=e),ji=!0,vu||(vu=!0,Ub())}function Vl(e,t){if(!bu&&ji){bu=!0;do for(var s=!1,i=Si;i!==null;){if(e!==0){var c=i.pendingLanes;if(c===0)var d=0;else{var y=i.suspendedLanes,C=i.pingedLanes;d=(1<<31-rt(42|e)+1)-1,d&=c&~(y&~C),d=d&201326741?d&201326741|1:d?d|2:0}d!==0&&(s=!0,Dp(i,d))}else d=Ue,d=Cr(i,i===et?d:0,i.cancelPendingCommit!==null||i.timeoutHandle!==-1),(d&3)===0||rl(i,d)||(s=!0,Dp(i,d));i=i.next}while(s);bu=!1}}function zb(){Rp()}function Rp(){ji=vu=!1;var e=0;Ss!==0&&Kb()&&(e=Ss);for(var t=te(),s=null,i=Si;i!==null;){var c=i.next,d=Tp(i,t);d===0?(i.next=null,s===null?Si=c:s.next=c,c===null&&(La=s)):(s=i,(e!==0||(d&3)!==0)&&(ji=!0)),i=c}jt!==0&&jt!==5||Vl(e),Ss!==0&&(Ss=0)}function Tp(e,t){for(var s=e.suspendedLanes,i=e.pingedLanes,c=e.expirationTimes,d=e.pendingLanes&-62914561;0C)break;var W=D.transferSize,ne=D.initiatorType;W&&Vp(ne)&&(D=D.responseEnd,y+=W*(D"u"?null:document;function Wp(e,t,s){var i=za;if(i&&typeof t=="string"&&t){var c=an(t);c='link[rel="'+e+'"][href="'+c+'"]',typeof s=="string"&&(c+='[crossorigin="'+s+'"]'),Pp.has(c)||(Pp.add(c),e={rel:e,crossOrigin:s,href:t},i.querySelector(c)===null&&(t=i.createElement("link"),Rt(t,"link",e),wt(t),i.head.appendChild(t)))}}function ay(e){Kn.D(e),Wp("dns-prefetch",e,null)}function ly(e,t){Kn.C(e,t),Wp("preconnect",e,t)}function ry(e,t,s){Kn.L(e,t,s);var i=za;if(i&&e&&t){var c='link[rel="preload"][as="'+an(t)+'"]';t==="image"&&s&&s.imageSrcSet?(c+='[imagesrcset="'+an(s.imageSrcSet)+'"]',typeof s.imageSizes=="string"&&(c+='[imagesizes="'+an(s.imageSizes)+'"]')):c+='[href="'+an(e)+'"]';var d=c;switch(t){case"style":d=Ua(e);break;case"script":d=Ha(e)}mn.has(d)||(e=b({rel:"preload",href:t==="image"&&s&&s.imageSrcSet?void 0:e,as:t},s),mn.set(d,e),i.querySelector(c)!==null||t==="style"&&i.querySelector(Fl(d))||t==="script"&&i.querySelector(Il(d))||(t=i.createElement("link"),Rt(t,"link",e),wt(t),i.head.appendChild(t)))}}function iy(e,t){Kn.m(e,t);var s=za;if(s&&e){var i=t&&typeof t.as=="string"?t.as:"script",c='link[rel="modulepreload"][as="'+an(i)+'"][href="'+an(e)+'"]',d=c;switch(i){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":d=Ha(e)}if(!mn.has(d)&&(e=b({rel:"modulepreload",href:e},t),mn.set(d,e),s.querySelector(c)===null)){switch(i){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(s.querySelector(Il(d)))return}i=s.createElement("link"),Rt(i,"link",e),wt(i),s.head.appendChild(i)}}}function oy(e,t,s){Kn.S(e,t,s);var i=za;if(i&&e){var c=ia(i).hoistableStyles,d=Ua(e);t=t||"default";var y=c.get(d);if(!y){var C={loading:0,preload:null};if(y=i.querySelector(Fl(d)))C.loading=5;else{e=b({rel:"stylesheet",href:e,"data-precedence":t},s),(s=mn.get(d))&&Bu(e,s);var D=y=i.createElement("link");wt(D),Rt(D,"link",e),D._p=new Promise(function(F,W){D.onload=F,D.onerror=W}),D.addEventListener("load",function(){C.loading|=1}),D.addEventListener("error",function(){C.loading|=2}),C.loading|=4,ki(y,t,i)}y={type:"stylesheet",instance:y,count:1,state:C},c.set(d,y)}}}function cy(e,t){Kn.X(e,t);var s=za;if(s&&e){var i=ia(s).hoistableScripts,c=Ha(e),d=i.get(c);d||(d=s.querySelector(Il(c)),d||(e=b({src:e,async:!0},t),(t=mn.get(c))&&Ou(e,t),d=s.createElement("script"),wt(d),Rt(d,"link",e),s.head.appendChild(d)),d={type:"script",instance:d,count:1,state:null},i.set(c,d))}}function uy(e,t){Kn.M(e,t);var s=za;if(s&&e){var i=ia(s).hoistableScripts,c=Ha(e),d=i.get(c);d||(d=s.querySelector(Il(c)),d||(e=b({src:e,async:!0,type:"module"},t),(t=mn.get(c))&&Ou(e,t),d=s.createElement("script"),wt(d),Rt(d,"link",e),s.head.appendChild(d)),d={type:"script",instance:d,count:1,state:null},i.set(c,d))}}function e0(e,t,s,i){var c=(c=Se.current)?Ci(c):null;if(!c)throw Error(o(446));switch(e){case"meta":case"title":return null;case"style":return typeof s.precedence=="string"&&typeof s.href=="string"?(t=Ua(s.href),s=ia(c).hoistableStyles,i=s.get(t),i||(i={type:"style",instance:null,count:0,state:null},s.set(t,i)),i):{type:"void",instance:null,count:0,state:null};case"link":if(s.rel==="stylesheet"&&typeof s.href=="string"&&typeof s.precedence=="string"){e=Ua(s.href);var d=ia(c).hoistableStyles,y=d.get(e);if(y||(c=c.ownerDocument||c,y={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},d.set(e,y),(d=c.querySelector(Fl(e)))&&!d._p&&(y.instance=d,y.state.loading=5),mn.has(e)||(s={rel:"preload",as:"style",href:s.href,crossOrigin:s.crossOrigin,integrity:s.integrity,media:s.media,hrefLang:s.hrefLang,referrerPolicy:s.referrerPolicy},mn.set(e,s),d||dy(c,e,s,y.state))),t&&i===null)throw Error(o(528,""));return y}if(t&&i!==null)throw Error(o(529,""));return null;case"script":return t=s.async,s=s.src,typeof s=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Ha(s),s=ia(c).hoistableScripts,i=s.get(t),i||(i={type:"script",instance:null,count:0,state:null},s.set(t,i)),i):{type:"void",instance:null,count:0,state:null};default:throw Error(o(444,e))}}function Ua(e){return'href="'+an(e)+'"'}function Fl(e){return'link[rel="stylesheet"]['+e+"]"}function t0(e){return b({},e,{"data-precedence":e.precedence,precedence:null})}function dy(e,t,s,i){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?i.loading=1:(t=e.createElement("link"),i.preload=t,t.addEventListener("load",function(){return i.loading|=1}),t.addEventListener("error",function(){return i.loading|=2}),Rt(t,"link",s),wt(t),e.head.appendChild(t))}function Ha(e){return'[src="'+an(e)+'"]'}function Il(e){return"script[async]"+e}function n0(e,t,s){if(t.count++,t.instance===null)switch(t.type){case"style":var i=e.querySelector('style[data-href~="'+an(s.href)+'"]');if(i)return t.instance=i,wt(i),i;var c=b({},s,{"data-href":s.href,"data-precedence":s.precedence,href:null,precedence:null});return i=(e.ownerDocument||e).createElement("style"),wt(i),Rt(i,"style",c),ki(i,s.precedence,e),t.instance=i;case"stylesheet":c=Ua(s.href);var d=e.querySelector(Fl(c));if(d)return t.state.loading|=4,t.instance=d,wt(d),d;i=t0(s),(c=mn.get(c))&&Bu(i,c),d=(e.ownerDocument||e).createElement("link"),wt(d);var y=d;return y._p=new Promise(function(C,D){y.onload=C,y.onerror=D}),Rt(d,"link",i),t.state.loading|=4,ki(d,s.precedence,e),t.instance=d;case"script":return d=Ha(s.src),(c=e.querySelector(Il(d)))?(t.instance=c,wt(c),c):(i=s,(c=mn.get(d))&&(i=b({},s),Ou(i,c)),e=e.ownerDocument||e,c=e.createElement("script"),wt(c),Rt(c,"link",i),e.head.appendChild(c),t.instance=c);case"void":return null;default:throw Error(o(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(i=t.instance,t.state.loading|=4,ki(i,s.precedence,e));return t.instance}function ki(e,t,s){for(var i=s.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),c=i.length?i[i.length-1]:null,d=c,y=0;y title"):null)}function fy(e,t,s){if(s===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function l0(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function my(e,t,s,i){if(s.type==="stylesheet"&&(typeof i.media!="string"||matchMedia(i.media).matches!==!1)&&(s.state.loading&4)===0){if(s.instance===null){var c=Ua(i.href),d=t.querySelector(Fl(c));if(d){t=d._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Mi.bind(e),t.then(e,e)),s.state.loading|=4,s.instance=d,wt(d);return}d=t.ownerDocument||t,i=t0(i),(c=mn.get(c))&&Bu(i,c),d=d.createElement("link"),wt(d);var y=d;y._p=new Promise(function(C,D){y.onload=C,y.onerror=D}),Rt(d,"link",i),s.instance=d}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(s,t),(t=s.state.preload)&&(s.state.loading&3)===0&&(e.count++,s=Mi.bind(e),t.addEventListener("load",s),t.addEventListener("error",s))}}var Lu=0;function hy(e,t){return e.stylesheets&&e.count===0&&Ti(e,e.stylesheets),0Lu?50:800)+t);return e.unsuspend=s,function(){e.unsuspend=null,clearTimeout(i),clearTimeout(c)}}:null}function Mi(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Ti(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Ri=null;function Ti(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Ri=new Map,t.forEach(py,e),Ri=null,Mi.call(e))}function py(e,t){if(!(t.state.loading&4)){var s=Ri.get(e);if(s)var i=s.get(null);else{s=new Map,Ri.set(e,s);for(var c=e.querySelectorAll("link[data-precedence],style[data-precedence]"),d=0;d"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(a){console.error(a)}}return n(),Iu.exports=qy(),Iu.exports}var _y=Dy();var M0="popstate";function By(n={}){function a(o,u){let{pathname:f,search:h,hash:p}=o.location;return Sd("",{pathname:f,search:h,hash:p},u.state&&u.state.usr||null,u.state&&u.state.key||"default")}function r(o,u){return typeof u=="string"?u:ur(u)}return Ly(a,r,null,n)}function ot(n,a){if(n===!1||n===null||typeof n>"u")throw new Error(a)}function jn(n,a){if(!n){typeof console<"u"&&console.warn(a);try{throw new Error(a)}catch{}}}function Oy(){return Math.random().toString(36).substring(2,10)}function R0(n,a){return{usr:n.state,key:n.key,idx:a}}function Sd(n,a,r=null,o){return{pathname:typeof n=="string"?n:n.pathname,search:"",hash:"",...typeof a=="string"?tl(a):a,state:r,key:a&&a.key||o||Oy()}}function ur({pathname:n="/",search:a="",hash:r=""}){return a&&a!=="?"&&(n+=a.charAt(0)==="?"?a:"?"+a),r&&r!=="#"&&(n+=r.charAt(0)==="#"?r:"#"+r),n}function tl(n){let a={};if(n){let r=n.indexOf("#");r>=0&&(a.hash=n.substring(r),n=n.substring(0,r));let o=n.indexOf("?");o>=0&&(a.search=n.substring(o),n=n.substring(0,o)),n&&(a.pathname=n)}return a}function Ly(n,a,r,o={}){let{window:u=document.defaultView,v5Compat:f=!1}=o,h=u.history,p="POP",g=null,x=v();x==null&&(x=0,h.replaceState({...h.state,idx:x},""));function v(){return(h.state||{idx:null}).idx}function b(){p="POP";let w=v(),j=w==null?null:w-x;x=w,g&&g({action:p,location:N.location,delta:j})}function S(w,j){p="PUSH";let M=Sd(N.location,w,j);x=v()+1;let A=R0(M,x),R=N.createHref(M);try{h.pushState(A,"",R)}catch(q){if(q instanceof DOMException&&q.name==="DataCloneError")throw q;u.location.assign(R)}f&&g&&g({action:p,location:N.location,delta:1})}function k(w,j){p="REPLACE";let M=Sd(N.location,w,j);x=v();let A=R0(M,x),R=N.createHref(M);h.replaceState(A,"",R),f&&g&&g({action:p,location:N.location,delta:0})}function E(w){return zy(w)}let N={get action(){return p},get location(){return n(u,h)},listen(w){if(g)throw new Error("A history only accepts one active listener");return u.addEventListener(M0,b),g=w,()=>{u.removeEventListener(M0,b),g=null}},createHref(w){return a(u,w)},createURL:E,encodeLocation(w){let j=E(w);return{pathname:j.pathname,search:j.search,hash:j.hash}},push:S,replace:k,go(w){return h.go(w)}};return N}function zy(n,a=!1){let r="http://localhost";typeof window<"u"&&(r=window.location.origin!=="null"?window.location.origin:window.location.href),ot(r,"No window.location.(origin|href) available to create URL");let o=typeof n=="string"?n:ur(n);return o=o.replace(/ $/,"%20"),!a&&o.startsWith("//")&&(o=r+o),new URL(o,r)}function Dx(n,a,r="/"){return Uy(n,a,r,!1)}function Uy(n,a,r,o){let u=typeof a=="string"?tl(a):a,f=ts(u.pathname||"/",r);if(f==null)return null;let h=_x(n);Hy(h);let p=null;for(let g=0;p==null&&g{let v={relativePath:x===void 0?h.path||"":x,caseSensitive:h.caseSensitive===!0,childrenIndex:p,route:h};if(v.relativePath.startsWith("/")){if(!v.relativePath.startsWith(o)&&g)return;ot(v.relativePath.startsWith(o),`Absolute route path "${v.relativePath}" nested under path "${o}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),v.relativePath=v.relativePath.slice(o.length)}let b=es([o,v.relativePath]),S=r.concat(v);h.children&&h.children.length>0&&(ot(h.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${b}".`),_x(h.children,a,S,b,g)),!(h.path==null&&!h.index)&&a.push({path:b,score:Xy(b,h.index),routesMeta:S})};return n.forEach((h,p)=>{if(h.path===""||!h.path?.includes("?"))f(h,p);else for(let g of Bx(h.path))f(h,p,!0,g)}),a}function Bx(n){let a=n.split("/");if(a.length===0)return[];let[r,...o]=a,u=r.endsWith("?"),f=r.replace(/\?$/,"");if(o.length===0)return u?[f,""]:[f];let h=Bx(o.join("/")),p=[];return p.push(...h.map(g=>g===""?f:[f,g].join("/"))),u&&p.push(...h),p.map(g=>n.startsWith("/")&&g===""?"/":g)}function Hy(n){n.sort((a,r)=>a.score!==r.score?r.score-a.score:Qy(a.routesMeta.map(o=>o.childrenIndex),r.routesMeta.map(o=>o.childrenIndex)))}var Vy=/^:[\w-]+$/,$y=3,Gy=2,Yy=1,Fy=10,Iy=-2,T0=n=>n==="*";function Xy(n,a){let r=n.split("/"),o=r.length;return r.some(T0)&&(o+=Iy),a&&(o+=Gy),r.filter(u=>!T0(u)).reduce((u,f)=>u+(Vy.test(f)?$y:f===""?Yy:Fy),o)}function Qy(n,a){return n.length===a.length&&n.slice(0,-1).every((o,u)=>o===a[u])?n[n.length-1]-a[a.length-1]:0}function Ky(n,a,r=!1){let{routesMeta:o}=n,u={},f="/",h=[];for(let p=0;p{if(v==="*"){let E=p[S]||"";h=f.slice(0,f.length-E.length).replace(/(.)\/+$/,"$1")}const k=p[S];return b&&!k?x[v]=void 0:x[v]=(k||"").replace(/%2F/g,"/"),x},{}),pathname:f,pathnameBase:h,pattern:n}}function Zy(n,a=!1,r=!0){jn(n==="*"||!n.endsWith("*")||n.endsWith("/*"),`Route path "${n}" will be treated as if it were "${n.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${n.replace(/\*$/,"/*")}".`);let o=[],u="^"+n.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(h,p,g)=>(o.push({paramName:p,isOptional:g!=null}),g?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return n.endsWith("*")?(o.push({paramName:"*"}),u+=n==="*"||n==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?u+="\\/*$":n!==""&&n!=="/"&&(u+="(?:(?=\\/|$))"),[new RegExp(u,a?void 0:"i"),o]}function Jy(n){try{return n.split("/").map(a=>decodeURIComponent(a).replace(/\//g,"%2F")).join("/")}catch(a){return jn(!1,`The URL path "${n}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${a}).`),n}}function ts(n,a){if(a==="/")return n;if(!n.toLowerCase().startsWith(a.toLowerCase()))return null;let r=a.endsWith("/")?a.length-1:a.length,o=n.charAt(r);return o&&o!=="/"?null:n.slice(r)||"/"}var Py=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Wy=n=>Py.test(n);function e1(n,a="/"){let{pathname:r,search:o="",hash:u=""}=typeof n=="string"?tl(n):n,f;if(r)if(Wy(r))f=r;else{if(r.includes("//")){let h=r;r=r.replace(/\/\/+/g,"/"),jn(!1,`Pathnames cannot have embedded double slashes - normalizing ${h} -> ${r}`)}r.startsWith("/")?f=q0(r.substring(1),"/"):f=q0(r,a)}else f=a;return{pathname:f,search:s1(o),hash:a1(u)}}function q0(n,a){let r=a.replace(/\/+$/,"").split("/");return n.split("/").forEach(u=>{u===".."?r.length>1&&r.pop():u!=="."&&r.push(u)}),r.length>1?r.join("/"):"/"}function Zu(n,a,r,o){return`Cannot include a '${n}' character in a manually specified \`to.${a}\` field [${JSON.stringify(o)}]. Please separate it out to the \`to.${r}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function t1(n){return n.filter((a,r)=>r===0||a.route.path&&a.route.path.length>0)}function Ox(n){let a=t1(n);return a.map((r,o)=>o===a.length-1?r.pathname:r.pathnameBase)}function Lx(n,a,r,o=!1){let u;typeof n=="string"?u=tl(n):(u={...n},ot(!u.pathname||!u.pathname.includes("?"),Zu("?","pathname","search",u)),ot(!u.pathname||!u.pathname.includes("#"),Zu("#","pathname","hash",u)),ot(!u.search||!u.search.includes("#"),Zu("#","search","hash",u)));let f=n===""||u.pathname==="",h=f?"/":u.pathname,p;if(h==null)p=r;else{let b=a.length-1;if(!o&&h.startsWith("..")){let S=h.split("/");for(;S[0]==="..";)S.shift(),b-=1;u.pathname=S.join("/")}p=b>=0?a[b]:"/"}let g=e1(u,p),x=h&&h!=="/"&&h.endsWith("/"),v=(f||h===".")&&r.endsWith("/");return!g.pathname.endsWith("/")&&(x||v)&&(g.pathname+="/"),g}var es=n=>n.join("/").replace(/\/\/+/g,"/"),n1=n=>n.replace(/\/+$/,"").replace(/^\/*/,"/"),s1=n=>!n||n==="?"?"":n.startsWith("?")?n:"?"+n,a1=n=>!n||n==="#"?"":n.startsWith("#")?n:"#"+n;function l1(n){return n!=null&&typeof n.status=="number"&&typeof n.statusText=="string"&&typeof n.internal=="boolean"&&"data"in n}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var zx=["POST","PUT","PATCH","DELETE"];new Set(zx);var r1=["GET",...zx];new Set(r1);var nl=m.createContext(null);nl.displayName="DataRouter";var So=m.createContext(null);So.displayName="DataRouterState";m.createContext(!1);var Ux=m.createContext({isTransitioning:!1});Ux.displayName="ViewTransition";var i1=m.createContext(new Map);i1.displayName="Fetchers";var o1=m.createContext(null);o1.displayName="Await";var Tn=m.createContext(null);Tn.displayName="Navigation";var gr=m.createContext(null);gr.displayName="Location";var ss=m.createContext({outlet:null,matches:[],isDataRoute:!1});ss.displayName="Route";var Vd=m.createContext(null);Vd.displayName="RouteError";function c1(n,{relative:a}={}){ot(vr(),"useHref() may be used only in the context of a component.");let{basename:r,navigator:o}=m.useContext(Tn),{hash:u,pathname:f,search:h}=br(n,{relative:a}),p=f;return r!=="/"&&(p=f==="/"?r:es([r,f])),o.createHref({pathname:p,search:h,hash:u})}function vr(){return m.useContext(gr)!=null}function na(){return ot(vr(),"useLocation() may be used only in the context of a component."),m.useContext(gr).location}var Hx="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function Vx(n){m.useContext(Tn).static||m.useLayoutEffect(n)}function u1(){let{isDataRoute:n}=m.useContext(ss);return n?N1():d1()}function d1(){ot(vr(),"useNavigate() may be used only in the context of a component.");let n=m.useContext(nl),{basename:a,navigator:r}=m.useContext(Tn),{matches:o}=m.useContext(ss),{pathname:u}=na(),f=JSON.stringify(Ox(o)),h=m.useRef(!1);return Vx(()=>{h.current=!0}),m.useCallback((g,x={})=>{if(jn(h.current,Hx),!h.current)return;if(typeof g=="number"){r.go(g);return}let v=Lx(g,JSON.parse(f),u,x.relative==="path");n==null&&a!=="/"&&(v.pathname=v.pathname==="/"?a:es([a,v.pathname])),(x.replace?r.replace:r.push)(v,x.state,x)},[a,r,f,u,n])}m.createContext(null);function br(n,{relative:a}={}){let{matches:r}=m.useContext(ss),{pathname:o}=na(),u=JSON.stringify(Ox(r));return m.useMemo(()=>Lx(n,JSON.parse(u),o,a==="path"),[n,u,o,a])}function f1(n,a){return $x(n,a)}function $x(n,a,r,o,u){ot(vr(),"useRoutes() may be used only in the context of a component.");let{navigator:f}=m.useContext(Tn),{matches:h}=m.useContext(ss),p=h[h.length-1],g=p?p.params:{},x=p?p.pathname:"/",v=p?p.pathnameBase:"/",b=p&&p.route;{let M=b&&b.path||"";Gx(x,!b||M.endsWith("*")||M.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${x}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. - -Please change the parent to .`)}let S=na(),k;if(a){let M=typeof a=="string"?tl(a):a;ot(v==="/"||M.pathname?.startsWith(v),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${v}" but pathname "${M.pathname}" was given in the \`location\` prop.`),k=M}else k=S;let E=k.pathname||"/",N=E;if(v!=="/"){let M=v.replace(/^\//,"").split("/");N="/"+E.replace(/^\//,"").split("/").slice(M.length).join("/")}let w=Dx(n,{pathname:N});jn(b||w!=null,`No routes matched location "${k.pathname}${k.search}${k.hash}" `),jn(w==null||w[w.length-1].route.element!==void 0||w[w.length-1].route.Component!==void 0||w[w.length-1].route.lazy!==void 0,`Matched leaf route at location "${k.pathname}${k.search}${k.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let j=g1(w&&w.map(M=>Object.assign({},M,{params:Object.assign({},g,M.params),pathname:es([v,f.encodeLocation?f.encodeLocation(M.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:M.pathname]),pathnameBase:M.pathnameBase==="/"?v:es([v,f.encodeLocation?f.encodeLocation(M.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:M.pathnameBase])})),h,r,o,u);return a&&j?m.createElement(gr.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...k},navigationType:"POP"}},j):j}function m1(){let n=j1(),a=l1(n)?`${n.status} ${n.statusText}`:n instanceof Error?n.message:JSON.stringify(n),r=n instanceof Error?n.stack:null,o="rgba(200,200,200, 0.5)",u={padding:"0.5rem",backgroundColor:o},f={padding:"2px 4px",backgroundColor:o},h=null;return console.error("Error handled by React Router default ErrorBoundary:",n),h=m.createElement(m.Fragment,null,m.createElement("p",null,"💿 Hey developer 👋"),m.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",m.createElement("code",{style:f},"ErrorBoundary")," or"," ",m.createElement("code",{style:f},"errorElement")," prop on your route.")),m.createElement(m.Fragment,null,m.createElement("h2",null,"Unexpected Application Error!"),m.createElement("h3",{style:{fontStyle:"italic"}},a),r?m.createElement("pre",{style:u},r):null,h)}var h1=m.createElement(m1,null),p1=class extends m.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,a){return a.location!==n.location||a.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:a.error,location:a.location,revalidation:n.revalidation||a.revalidation}}componentDidCatch(n,a){this.props.onError?this.props.onError(n,a):console.error("React Router caught the following error during render",n)}render(){return this.state.error!==void 0?m.createElement(ss.Provider,{value:this.props.routeContext},m.createElement(Vd.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function x1({routeContext:n,match:a,children:r}){let o=m.useContext(nl);return o&&o.static&&o.staticContext&&(a.route.errorElement||a.route.ErrorBoundary)&&(o.staticContext._deepestRenderedBoundaryId=a.route.id),m.createElement(ss.Provider,{value:n},r)}function g1(n,a=[],r=null,o=null,u=null){if(n==null){if(!r)return null;if(r.errors)n=r.matches;else if(a.length===0&&!r.initialized&&r.matches.length>0)n=r.matches;else return null}let f=n,h=r?.errors;if(h!=null){let v=f.findIndex(b=>b.route.id&&h?.[b.route.id]!==void 0);ot(v>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(h).join(",")}`),f=f.slice(0,Math.min(f.length,v+1))}let p=!1,g=-1;if(r)for(let v=0;v=0?f=f.slice(0,g+1):f=[f[0]];break}}}let x=r&&o?(v,b)=>{o(v,{location:r.location,params:r.matches?.[0]?.params??{},errorInfo:b})}:void 0;return f.reduceRight((v,b,S)=>{let k,E=!1,N=null,w=null;r&&(k=h&&b.route.id?h[b.route.id]:void 0,N=b.route.errorElement||h1,p&&(g<0&&S===0?(Gx("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),E=!0,w=null):g===S&&(E=!0,w=b.route.hydrateFallbackElement||null)));let j=a.concat(f.slice(0,S+1)),M=()=>{let A;return k?A=N:E?A=w:b.route.Component?A=m.createElement(b.route.Component,null):b.route.element?A=b.route.element:A=v,m.createElement(x1,{match:b,routeContext:{outlet:v,matches:j,isDataRoute:r!=null},children:A})};return r&&(b.route.ErrorBoundary||b.route.errorElement||S===0)?m.createElement(p1,{location:r.location,revalidation:r.revalidation,component:N,error:k,children:M(),routeContext:{outlet:null,matches:j,isDataRoute:!0},onError:x}):M()},null)}function $d(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function v1(n){let a=m.useContext(nl);return ot(a,$d(n)),a}function b1(n){let a=m.useContext(So);return ot(a,$d(n)),a}function y1(n){let a=m.useContext(ss);return ot(a,$d(n)),a}function Gd(n){let a=y1(n),r=a.matches[a.matches.length-1];return ot(r.route.id,`${n} can only be used on routes that contain a unique "id"`),r.route.id}function S1(){return Gd("useRouteId")}function j1(){let n=m.useContext(Vd),a=b1("useRouteError"),r=Gd("useRouteError");return n!==void 0?n:a.errors?.[r]}function N1(){let{router:n}=v1("useNavigate"),a=Gd("useNavigate"),r=m.useRef(!1);return Vx(()=>{r.current=!0}),m.useCallback(async(u,f={})=>{jn(r.current,Hx),r.current&&(typeof u=="number"?n.navigate(u):await n.navigate(u,{fromRouteId:a,...f}))},[n,a])}var D0={};function Gx(n,a,r){!a&&!D0[n]&&(D0[n]=!0,jn(!1,r))}m.memo(w1);function w1({routes:n,future:a,state:r,unstable_onError:o}){return $x(n,void 0,r,o,a)}function Zi(n){ot(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function A1({basename:n="/",children:a=null,location:r,navigationType:o="POP",navigator:u,static:f=!1}){ot(!vr(),"You cannot render a inside another . You should never have more than one in your app.");let h=n.replace(/^\/*/,"/"),p=m.useMemo(()=>({basename:h,navigator:u,static:f,future:{}}),[h,u,f]);typeof r=="string"&&(r=tl(r));let{pathname:g="/",search:x="",hash:v="",state:b=null,key:S="default"}=r,k=m.useMemo(()=>{let E=ts(g,h);return E==null?null:{location:{pathname:E,search:x,hash:v,state:b,key:S},navigationType:o}},[h,g,x,v,b,S,o]);return jn(k!=null,` is not able to match the URL "${g}${x}${v}" because it does not start with the basename, so the won't render anything.`),k==null?null:m.createElement(Tn.Provider,{value:p},m.createElement(gr.Provider,{children:a,value:k}))}function C1({children:n,location:a}){return f1(jd(n),a)}function jd(n,a=[]){let r=[];return m.Children.forEach(n,(o,u)=>{if(!m.isValidElement(o))return;let f=[...a,u];if(o.type===m.Fragment){r.push.apply(r,jd(o.props.children,f));return}ot(o.type===Zi,`[${typeof o.type=="string"?o.type:o.type.name}] is not a component. All component children of must be a or `),ot(!o.props.index||!o.props.children,"An index route cannot have child routes.");let h={id:o.props.id||f.join("-"),caseSensitive:o.props.caseSensitive,element:o.props.element,Component:o.props.Component,index:o.props.index,path:o.props.path,middleware:o.props.middleware,loader:o.props.loader,action:o.props.action,hydrateFallbackElement:o.props.hydrateFallbackElement,HydrateFallback:o.props.HydrateFallback,errorElement:o.props.errorElement,ErrorBoundary:o.props.ErrorBoundary,hasErrorBoundary:o.props.hasErrorBoundary===!0||o.props.ErrorBoundary!=null||o.props.errorElement!=null,shouldRevalidate:o.props.shouldRevalidate,handle:o.props.handle,lazy:o.props.lazy};o.props.children&&(h.children=jd(o.props.children,f)),r.push(h)}),r}var Ji="get",Pi="application/x-www-form-urlencoded";function jo(n){return n!=null&&typeof n.tagName=="string"}function k1(n){return jo(n)&&n.tagName.toLowerCase()==="button"}function E1(n){return jo(n)&&n.tagName.toLowerCase()==="form"}function M1(n){return jo(n)&&n.tagName.toLowerCase()==="input"}function R1(n){return!!(n.metaKey||n.altKey||n.ctrlKey||n.shiftKey)}function T1(n,a){return n.button===0&&(!a||a==="_self")&&!R1(n)}var Ui=null;function q1(){if(Ui===null)try{new FormData(document.createElement("form"),0),Ui=!1}catch{Ui=!0}return Ui}var D1=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Ju(n){return n!=null&&!D1.has(n)?(jn(!1,`"${n}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${Pi}"`),null):n}function _1(n,a){let r,o,u,f,h;if(E1(n)){let p=n.getAttribute("action");o=p?ts(p,a):null,r=n.getAttribute("method")||Ji,u=Ju(n.getAttribute("enctype"))||Pi,f=new FormData(n)}else if(k1(n)||M1(n)&&(n.type==="submit"||n.type==="image")){let p=n.form;if(p==null)throw new Error('Cannot submit a )} - + ); } diff --git a/webui/src/components/HomeAssistantControls/index.jsx b/webui/src/components/HomeAssistantControls/index.jsx index 0dfd25b4..54475977 100644 --- a/webui/src/components/HomeAssistantControls/index.jsx +++ b/webui/src/components/HomeAssistantControls/index.jsx @@ -5,6 +5,7 @@ import { useEffect, useMemo, useRef, useState } from 'react'; import { useSessionActions, useSessionSelector } from '../../context/SessionContext.jsx'; import { useControlSystem } from '../../controls/index.js'; import { formatKeyLabel } from '../../controls/keymapUtils.js'; +import CardFrame from '../CardFrame/index.jsx'; function StatusBadge({ label, tone = 'muted' }) { const styles = @@ -255,46 +256,41 @@ export default function HomeAssistantControls() { if (!ha?.enabled) { return ( -
-

Room Controls

+

Not configured on the server.

-
+ ); } if (entities.length === 0) { return ( -
-

Room Controls

+

No lights or switches configured.

-
+ ); } const connected = Boolean(ha?.connected); + const actions = ( + <> +
+ + On + {onKeyLabel ? : null} + + + Off + {offKeyLabel ? : null} + +
+ {controlsLocked ? : null} + + + ); + return ( -
-
-
-

Room Controls

- {entities.length} -
-
-
- - On - {onKeyLabel ? : null} - - - Off - {offKeyLabel ? : null} - -
- {controlsLocked ? : null} - -
-
+ {controlsLocked ? (

{lockState === 'off' @@ -315,7 +311,7 @@ export default function HomeAssistantControls() { /> ))} -

+ ); } diff --git a/webui/src/components/LogPanel/index.jsx b/webui/src/components/LogPanel/index.jsx index 98549b20..18045b7e 100644 --- a/webui/src/components/LogPanel/index.jsx +++ b/webui/src/components/LogPanel/index.jsx @@ -3,30 +3,27 @@ // Scope: Keeps behavior unchanged while isolating this concern into a clear, single-responsibility unit. import { useSessionSelector } from '../../context/SessionContext.jsx'; import { useMemo } from 'react'; +import CardFrame from '../CardFrame/index.jsx'; export default function LogPanel() { const logs = useSessionSelector((state) => state.logs); const rendered = useMemo(() => logs.slice().reverse(), [logs]); return ( -
-
- Server logs - {logs.length} -
+
{logs.length === 0 ? (

No logs yet.

) : ( rendered.map((entry) => ( -
- {entry.timestamp}{' '} - [{entry.level}]{' '} - {entry.label && [{entry.label}]}{' '} - {entry.message} -
- )) +
+ {entry.timestamp}{' '} + [{entry.level}]{' '} + {entry.label && [{entry.label}]}{' '} + {entry.message} +
+ )) )}
-
+ ); } diff --git a/webui/src/components/OverseerPreferencePanel/index.jsx b/webui/src/components/OverseerPreferencePanel/index.jsx index a0ea6af4..0398c49f 100644 --- a/webui/src/components/OverseerPreferencePanel/index.jsx +++ b/webui/src/components/OverseerPreferencePanel/index.jsx @@ -1,5 +1,6 @@ import { useSessionActions, useSessionSelector } from '../../context/SessionContext.jsx'; import { useSettingsNamespace } from '../../settings/index.js'; +import CardFrame from '../CardFrame/index.jsx'; export default function OverseerPreferencePanel() { const { identifySession } = useSessionActions(); @@ -21,10 +22,7 @@ export default function OverseerPreferencePanel() { }; return ( -
-
- Overseer vote -
+
+ ); } diff --git a/webui/src/components/RawUserPilePanel/index.jsx b/webui/src/components/RawUserPilePanel/index.jsx index 8d2075bf..d9411bf4 100644 --- a/webui/src/components/RawUserPilePanel/index.jsx +++ b/webui/src/components/RawUserPilePanel/index.jsx @@ -5,6 +5,7 @@ import { useMemo } from 'react'; import { useSessionSelector } from '../../context/SessionContext.jsx'; import NicknameForm from '../NicknameForm/index.jsx'; import SocialButtonsGrid from '../SocialButtonsGrid/index.jsx'; +import CardFrame from '../CardFrame/index.jsx'; function roleColors(role) { switch (role) { @@ -57,8 +58,13 @@ export default function RawUserPilePanel({ : 'h-48 overflow-y-auto'; return ( -
{!hideNicknameForm && (
@@ -75,12 +81,6 @@ export default function RawUserPilePanel({ )}
- {!hideHeader && ( -
- Users - {sorted.length} -
- )}
@@ -98,6 +98,6 @@ export default function RawUserPilePanel({ )}
-
+ ); } diff --git a/webui/src/components/ReplaySourcesPanel/index.jsx b/webui/src/components/ReplaySourcesPanel/index.jsx index 966ba6e9..9bc1ca6d 100644 --- a/webui/src/components/ReplaySourcesPanel/index.jsx +++ b/webui/src/components/ReplaySourcesPanel/index.jsx @@ -5,6 +5,7 @@ import { useEffect, useMemo, useState } from 'react'; import { useSessionActions, useSessionSelector } from '../../context/SessionContext.jsx'; import { useSettingsNamespace } from '../../settings/index.js'; import { roverNameChromeStyle } from '../../lib/roverColor.js'; +import CardFrame from '../CardFrame/index.jsx'; function normalizeSources(list = []) { return list @@ -146,15 +147,10 @@ export default function ReplaySourcesPanel({ panelId = 'replay-sources', fillHei } }; - const containerClass = fillHeight ? 'h-full flex flex-col' : ''; const listWrapClass = fillHeight ? 'flex-1 min-h-0 overflow-y-auto' : ''; return ( -
-
- Replay Sources - {sources.length} -
+
@@ -201,7 +197,7 @@ export default function ReplaySourcesPanel({ panelId = 'replay-sources', fillHei {error ?
{error}
: null} {success ?
{success}
: null}
-
+ ); } diff --git a/webui/src/components/RightPaneTabs/index.jsx b/webui/src/components/RightPaneTabs/index.jsx index a47d4e58..1ea6f296 100644 --- a/webui/src/components/RightPaneTabs/index.jsx +++ b/webui/src/components/RightPaneTabs/index.jsx @@ -24,6 +24,7 @@ import { useSessionSelector } from '../../context/SessionContext.jsx'; import { useSettingsNamespace } from '../../settings/index.js'; import ButtonBoxPanel from '../ButtonBoxPanel/index.jsx'; import OverseerPreferencePanel from '../OverseerPreferencePanel/index.jsx'; +import CardFrame from '../CardFrame/index.jsx'; import { useState } from 'react'; import { useManualDockAssist } from '../../features/manualDockAssist/useManualDockAssist.js'; @@ -35,11 +36,11 @@ function TopDownMapPanel() { const sensors = frame?.sensors || {}; return ( -
+
-
+ ); } diff --git a/webui/src/components/RoomCameraPanel/index.jsx b/webui/src/components/RoomCameraPanel/index.jsx index 5c5e8863..08be23a8 100644 --- a/webui/src/components/RoomCameraPanel/index.jsx +++ b/webui/src/components/RoomCameraPanel/index.jsx @@ -6,6 +6,7 @@ import { useSessionSelector } from '../../context/SessionContext.jsx'; import { useSettingsNamespace } from '../../settings/index.js'; import { useRoomCameraSnapshots } from '../../hooks/useRoomCameraSnapshots.js'; import RoomCameraFeed from '../RoomCameraFeed/index.jsx'; +import CardFrame from '../CardFrame/index.jsx'; function EmptyState() { return ( @@ -66,35 +67,32 @@ export default function RoomCameraPanel({ return ; } + const actions = showLayoutToggle ? ( +
+ Layout +
+ {ORIENTATIONS.map((option) => ( + + ))} +
+
+ ) : null; + return ( -
- {!hideHeader && ( -
-
-

Room cameras

- {cameras.length} -
-
- {showLayoutToggle && ( -
- Layout -
- {ORIENTATIONS.map((option) => ( - - ))} -
-
- )} -
-
- )} +
{cameras.map((camera) => { const feed = feedMap[camera.id] || null; @@ -109,6 +107,6 @@ export default function RoomCameraPanel({ ); })}
-
+ ); } diff --git a/webui/src/components/RoverQueuesPanel/index.jsx b/webui/src/components/RoverQueuesPanel/index.jsx index 5262a3b5..2db1420d 100644 --- a/webui/src/components/RoverQueuesPanel/index.jsx +++ b/webui/src/components/RoverQueuesPanel/index.jsx @@ -4,6 +4,7 @@ import { useEffect, useMemo, useState } from 'react'; import { useSessionActions, useSessionSelector } from '../../context/SessionContext.jsx'; import { roverNameChromeStyle } from '../../lib/roverColor.js'; +import CardFrame from '../CardFrame/index.jsx'; function classNames(...values) { return values.filter(Boolean).join(' '); @@ -96,12 +97,7 @@ export default function RoverQueuesPanel({ title = 'Rovers' }) { users.find((u) => u.socketId === socketId) || { socketId, nickname: null, role: null }; return ( -
- {title && ( -
-

{title}

-
- )} + {rosterItems.length === 0 ? (

No rovers registered.

) : ( @@ -220,6 +216,6 @@ export default function RoverQueuesPanel({ title = 'Rovers' }) { })} )} -
+ ); } diff --git a/webui/src/components/TelemetryPanel/index.jsx b/webui/src/components/TelemetryPanel/index.jsx index da6ace82..5d989806 100644 --- a/webui/src/components/TelemetryPanel/index.jsx +++ b/webui/src/components/TelemetryPanel/index.jsx @@ -173,7 +173,7 @@ function SensorDetails({ sensors, dockState }) { function DetailCard({ title, children }) { return (
-
{title}
+
{title}
{children}
); diff --git a/webui/src/components/TopDownMap/TopDownMapContent.jsx b/webui/src/components/TopDownMap/TopDownMapContent.jsx index a38467f2..b8a545f0 100644 --- a/webui/src/components/TopDownMap/TopDownMapContent.jsx +++ b/webui/src/components/TopDownMap/TopDownMapContent.jsx @@ -68,12 +68,6 @@ function TopDownMapContent({ sensors = {}, variant = 'full', size: overrideSize, className={`${overlay ? 'relative' : 'surface relative p-1'}`} style={overlay ? { width: `${size}px`, height: `${size}px` } : { height: '100%', width: '100%', aspectRatio: '1 / 1' }} > - {!overlay ? ( - <> -
Top-down
-
0–{maxLight}
- - ) : null} diff --git a/webui/src/components/UserListPanel/index.jsx b/webui/src/components/UserListPanel/index.jsx index 071d1c0b..a1d7f1c9 100644 --- a/webui/src/components/UserListPanel/index.jsx +++ b/webui/src/components/UserListPanel/index.jsx @@ -6,6 +6,7 @@ import { useSessionSelector } from '../../context/SessionContext.jsx'; import NicknameForm from '../NicknameForm/index.jsx'; import SocialButtonsGrid from '../SocialButtonsGrid/index.jsx'; import { roverBadgeStyle, roverNameChromeStyle } from '../../lib/roverColor.js'; +import CardFrame from '../CardFrame/index.jsx'; export function NicknameEntryPanel({ compact = false }) { return ( @@ -19,12 +20,9 @@ export function NicknameEntryPanel({ compact = false }) { export function LinkButtonsPanel() { return ( -
-
- Socials -
+ - + ); } diff --git a/webui/src/components/vip/VipAudioUploadCard/VipAudioUploadCardContent.jsx b/webui/src/components/vip/VipAudioUploadCard/VipAudioUploadCardContent.jsx index 9a966dcd..a39dac53 100644 --- a/webui/src/components/vip/VipAudioUploadCard/VipAudioUploadCardContent.jsx +++ b/webui/src/components/vip/VipAudioUploadCard/VipAudioUploadCardContent.jsx @@ -17,6 +17,7 @@ import { import { mergeFloatChunks, encodeWavMono16 } from './audioCodec.js'; import StatusIndicator from './StatusIndicator.jsx'; import KeyPill from './KeyPill.jsx'; +import CardFrame from '../../CardFrame/index.jsx'; export default function VipAudioUploadCard({ ownRoverId = '', @@ -529,9 +530,8 @@ export default function VipAudioUploadCard({ ); return ( -
+
-

Audio Controls

Push-to-Talk Key @@ -653,6 +653,6 @@ export default function VipAudioUploadCard({
-
+ ); } diff --git a/webui/src/components/vip/VipIdentityCard.jsx b/webui/src/components/vip/VipIdentityCard.jsx index 7a96c2a3..fc09dfba 100644 --- a/webui/src/components/vip/VipIdentityCard.jsx +++ b/webui/src/components/vip/VipIdentityCard.jsx @@ -2,6 +2,7 @@ // Purpose: Defines the Vip Identity Card module and the local helpers/components used in this file. // Scope: Keeps behavior unchanged while isolating this concern into a clear, single-responsibility unit. import { useState } from 'react'; +import CardFrame from '../CardFrame/index.jsx'; import { fieldClass, flowWrapClass, innerFlowClass, maskKey } from './constants.js'; export default function VipIdentityCard({ currentStoredKey, applyIdentityKey, onMessage, fullWidth = false }) { @@ -40,9 +41,8 @@ export default function VipIdentityCard({ currentStoredKey, applyIdentityKey, on const wrapClass = fullWidth ? 'w-full' : flowWrapClass; return ( -
+
-

Identity key

Current: {maskKey(currentStoredKey) || 'not set yet'}

) : null}
-
+ ); } diff --git a/webui/src/components/vip/VipLiftCard.jsx b/webui/src/components/vip/VipLiftCard.jsx index a8b0b042..1fbbe3ff 100644 --- a/webui/src/components/vip/VipLiftCard.jsx +++ b/webui/src/components/vip/VipLiftCard.jsx @@ -2,6 +2,7 @@ // Purpose: Renders a shared lift controller panel synced from server session state. // Scope: Presents verified-user controls while reflecting global busy/position/cooldown state. import { useEffect, useMemo, useState } from 'react'; +import CardFrame from '../CardFrame/index.jsx'; function badgeClass(tone) { if (tone === 'good') return 'bg-emerald-600 text-white'; @@ -67,7 +68,16 @@ export default function VipLiftCard({ lift, onUp, onDown, fullWidth = false }) { }; return ( -
+ + {status} + + } + > {blocked ? (
@@ -82,18 +92,10 @@ export default function VipLiftCard({ lift, onUp, onDown, fullWidth = false }) { ) : null}
- ) : null} + ) : null}
-
-
-

Lift Controls

-

Move the lift up and down. Please don't break anything...

-
- - {status} - +
+

Move the lift up and down. Please don't break anything...

@@ -133,6 +135,6 @@ export default function VipLiftCard({ lift, onUp, onDown, fullWidth = false }) { {lift?.lastError ?

Last error: {lift.lastError}

: null}
-
+ ); } diff --git a/webui/src/components/vip/VipNeatoCard.jsx b/webui/src/components/vip/VipNeatoCard.jsx index 8acf66c3..4a3d8b0d 100644 --- a/webui/src/components/vip/VipNeatoCard.jsx +++ b/webui/src/components/vip/VipNeatoCard.jsx @@ -2,6 +2,7 @@ // Purpose: Defines the Vip Neato Card module and the local helpers/components used in this file. // Scope: Keeps behavior unchanged while isolating this concern into a clear, single-responsibility unit. import { useState } from 'react'; +import CardFrame from '../CardFrame/index.jsx'; function normalizeState(value) { return String(value || '').trim(); @@ -98,18 +99,19 @@ export default function VipNeatoCard({ const primaryState = docked ? 'Docked' : uiStateLabel !== '--' ? uiStateLabel : 'Away from dock'; return ( -
+ + {headerStatus} + + } + >
-
-
-

Neato Controls

-

Control the autonomous Neato robovac. Be nice to him.

-
- - {headerStatus} - +
+

Control the autonomous Neato robovac. Be nice to him.

@@ -217,6 +219,6 @@ export default function VipNeatoCard({

) : null}
-
+ ); } diff --git a/webui/src/components/vip/VipPrivateRoverAccessCard.jsx b/webui/src/components/vip/VipPrivateRoverAccessCard.jsx index 057577a5..e7561425 100644 --- a/webui/src/components/vip/VipPrivateRoverAccessCard.jsx +++ b/webui/src/components/vip/VipPrivateRoverAccessCard.jsx @@ -2,6 +2,7 @@ // Purpose: Defines the Vip Private Rover Access Card module and the local helpers/components used in this file. // Scope: Keeps behavior unchanged while isolating this concern into a clear, single-responsibility unit. import { useMemo, useState } from 'react'; +import CardFrame from '../CardFrame/index.jsx'; import { flowWrapClass, innerFlowClass } from './constants.js'; export default function VipPrivateRoverAccessCard({ @@ -42,9 +43,8 @@ export default function VipPrivateRoverAccessCard({ }; return ( -
+
-

Private rover access requests

{requestableRovers.length === 0 ? (

No closed private rovers are available to request right now.

) : ( @@ -79,7 +79,6 @@ export default function VipPrivateRoverAccessCard({
)} -
+ ); } - diff --git a/webui/src/components/vip/VipProfileImageCard.jsx b/webui/src/components/vip/VipProfileImageCard.jsx index dc859334..daa35129 100644 --- a/webui/src/components/vip/VipProfileImageCard.jsx +++ b/webui/src/components/vip/VipProfileImageCard.jsx @@ -3,6 +3,7 @@ // Scope: Owns local URL validation UX and writes to the existing profile settings namespace. import { useEffect, useMemo, useState } from 'react'; import { useSettingsNamespace } from '../../settings/index.js'; +import CardFrame from '../CardFrame/index.jsx'; import { fieldClass, flowWrapClass, innerFlowClass } from './constants.js'; function normalizeHttpUrl(value) { @@ -54,9 +55,8 @@ export default function VipProfileImageCard({ isVerified = false, fullWidth = fa }; return ( -
+
-

Chat profile image URL

Verified users can set a custom avatar for chat and Discord bridge messages.

@@ -86,6 +86,6 @@ export default function VipProfileImageCard({ isVerified = false, fullWidth = fa
-
+ ); } diff --git a/webui/src/components/vip/VipVerificationCard.jsx b/webui/src/components/vip/VipVerificationCard.jsx index f884cc34..e0c8d2b5 100644 --- a/webui/src/components/vip/VipVerificationCard.jsx +++ b/webui/src/components/vip/VipVerificationCard.jsx @@ -3,6 +3,7 @@ // Scope: Keeps behavior unchanged while isolating this concern into a clear, single-responsibility unit. import { useState } from 'react'; import NicknameForm from '../NicknameForm/index.jsx'; +import CardFrame from '../CardFrame/index.jsx'; import { flowWrapClass, innerFlowClass, fieldClass } from './constants.js'; export default function VipVerificationCard({ @@ -61,29 +62,28 @@ export default function VipVerificationCard({ if (pendingRequestId) { return ( -
+
Verification request pending: {pendingRequestId}
-
+ ); } if (requestFlowStep === 0) { return ( -
+
-

Verification

-
+ ); } return ( -
+ +
-

Request verification

Step {requestFlowStep} of 3

@@ -189,6 +189,7 @@ export default function VipVerificationCard({
) : null} - + +
); } diff --git a/webui/src/index.css b/webui/src/index.css index af35a521..f4ddc368 100644 --- a/webui/src/index.css +++ b/webui/src/index.css @@ -71,30 +71,6 @@ body { @apply text-sm text-slate-400 rounded-md; } - .panel-title-row { - @apply flex items-center justify-between gap-0.5 rounded-md bg-slate-900 px-0.5 py-0.5 text-left; - } - - .panel-title-text { - @apply text-[0.78rem] font-semibold tracking-normal text-slate-200 leading-none text-left; - } - - .panel-title-meta { - @apply text-[0.68rem] font-medium tracking-normal text-slate-400 leading-none; - } - - .panel-title-left { - @apply flex min-w-0 items-center gap-0.5; - } - - .panel-title-right { - @apply flex flex-wrap items-center justify-end gap-0.5; - } - - .panel-title-actions { - @apply flex items-center gap-0.5 text-[0.68rem] text-slate-400 leading-none; - } - .surface { @apply bg-neutral-800 text-white px-0.5 py-0.5 rounded-md; }