From b9a007bd48f4a162de07225edfc2c97e2448308e Mon Sep 17 00:00:00 2001 From: legop3 Date: Tue, 20 Jan 2026 14:25:48 -0500 Subject: [PATCH] big ui sweep. combined queue and roster. --- server/public/assets/index-B5QFIE1I.js | 119 ----------- server/public/assets/index-BjSf29Wv.css | 1 - server/public/assets/index-Cbwue-lt.css | 1 + server/public/assets/index-D58yshkA.js | 119 +++++++++++ server/public/index.html | 4 +- webui/src/App.jsx | 14 +- webui/src/components/AdminPanel.jsx | 6 +- webui/src/components/CameraServoPanel.jsx | 2 +- webui/src/components/ChatMessageRow.jsx | 2 +- webui/src/components/ChatPanel.jsx | 8 +- webui/src/components/ControlSummary.jsx | 10 +- webui/src/components/DiscordInviteButton.jsx | 6 +- webui/src/components/DriveDockAction.jsx | 10 +- webui/src/components/DrivePanel.jsx | 4 +- webui/src/components/DriverVideoPanel.jsx | 2 +- webui/src/components/FullscreenPrompt.jsx | 4 +- .../src/components/GamepadMappingSettings.jsx | 4 +- webui/src/components/HelpContentView.jsx | 26 +-- webui/src/components/HelpOverlay.jsx | 2 +- .../src/components/HomeAssistantControls.jsx | 10 +- webui/src/components/KeymapSettings.jsx | 2 +- webui/src/components/KoFiButton.jsx | 4 +- webui/src/components/MobileControls.jsx | 2 +- webui/src/components/NicknameForm.jsx | 4 +- webui/src/components/RawUserPilePanel.jsx | 135 ++++++++++++ webui/src/components/ReplaySourcesPanel.jsx | 6 +- webui/src/components/RightPaneTabs.jsx | 14 +- webui/src/components/RoomCameraFeed.jsx | 2 +- webui/src/components/RoomCameraPanel.jsx | 4 +- webui/src/components/RoverQueuesPanel.jsx | 197 ++++++++++++++++++ webui/src/components/RoverRoster.jsx | 2 +- webui/src/components/Tabs.jsx | 2 +- webui/src/components/TelemetryPanel.jsx | 10 +- webui/src/components/UserListPanel.jsx | 20 +- webui/src/components/VideoTile.jsx | 24 +-- .../components/controls/DriveModeToggle.jsx | 2 +- webui/src/index.css | 4 +- webui/src/mini/MiniSummaryApp.jsx | 2 +- webui/src/spectate/SpectatorApp.jsx | 12 +- 39 files changed, 568 insertions(+), 234 deletions(-) delete mode 100644 server/public/assets/index-B5QFIE1I.js delete mode 100644 server/public/assets/index-BjSf29Wv.css create mode 100644 server/public/assets/index-Cbwue-lt.css create mode 100644 server/public/assets/index-D58yshkA.js create mode 100644 webui/src/components/RawUserPilePanel.jsx create mode 100644 webui/src/components/RoverQueuesPanel.jsx diff --git a/server/public/assets/index-B5QFIE1I.js b/server/public/assets/index-B5QFIE1I.js deleted file mode 100644 index e3455947..00000000 --- a/server/public/assets/index-B5QFIE1I.js +++ /dev/null @@ -1,119 +0,0 @@ -(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))r(f);new MutationObserver(f=>{for(const d of f)if(d.type==="childList")for(const p of d.addedNodes)p.tagName==="LINK"&&p.rel==="modulepreload"&&r(p)}).observe(document,{childList:!0,subtree:!0});function i(f){const d={};return f.integrity&&(d.integrity=f.integrity),f.referrerPolicy&&(d.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?d.credentials="include":f.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function r(f){if(f.ep)return;f.ep=!0;const d=i(f);fetch(f.href,d)}})();function Vv(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var Vc={exports:{}},gs={};var up;function Yv(){if(up)return gs;up=1;var a=Symbol.for("react.transitional.element"),s=Symbol.for("react.fragment");function i(r,f,d){var p=null;if(d!==void 0&&(p=""+d),f.key!==void 0&&(p=""+f.key),"key"in f){d={};for(var m in f)m!=="key"&&(d[m]=f[m])}else d=f;return f=d.ref,{$$typeof:a,type:r,key:p,ref:f!==void 0?f:null,props:d}}return gs.Fragment=s,gs.jsx=i,gs.jsxs=i,gs}var fp;function Gv(){return fp||(fp=1,Vc.exports=Yv()),Vc.exports}var c=Gv(),Yc={exports:{}},me={};var dp;function Qv(){if(dp)return me;dp=1;var a=Symbol.for("react.transitional.element"),s=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),d=Symbol.for("react.consumer"),p=Symbol.for("react.context"),m=Symbol.for("react.forward_ref"),y=Symbol.for("react.suspense"),v=Symbol.for("react.memo"),S=Symbol.for("react.lazy"),b=Symbol.for("react.activity"),M=Symbol.iterator;function N(C){return C===null||typeof C!="object"?null:(C=M&&C[M]||C["@@iterator"],typeof C=="function"?C:null)}var j={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},T=Object.assign,A={};function E(C,B,H){this.props=C,this.context=B,this.refs=A,this.updater=H||j}E.prototype.isReactComponent={},E.prototype.setState=function(C,B){if(typeof C!="object"&&typeof C!="function"&&C!=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,C,B,"setState")},E.prototype.forceUpdate=function(C){this.updater.enqueueForceUpdate(this,C,"forceUpdate")};function w(){}w.prototype=E.prototype;function O(C,B,H){this.props=C,this.context=B,this.refs=A,this.updater=H||j}var F=O.prototype=new w;F.constructor=O,T(F,E.prototype),F.isPureReactComponent=!0;var Y=Array.isArray;function X(){}var K={H:null,A:null,T:null,S:null},te=Object.prototype.hasOwnProperty;function I(C,B,H){var G=H.ref;return{$$typeof:a,type:C,key:B,ref:G!==void 0?G:null,props:H}}function ne(C,B){return I(C.type,B,C.props)}function se(C){return typeof C=="object"&&C!==null&&C.$$typeof===a}function oe(C){var B={"=":"=0",":":"=2"};return"$"+C.replace(/[=:]/g,function(H){return B[H]})}var ye=/\/+/g;function ee(C,B){return typeof C=="object"&&C!==null&&C.key!=null?oe(""+C.key):B.toString(36)}function $(C){switch(C.status){case"fulfilled":return C.value;case"rejected":throw C.reason;default:switch(typeof C.status=="string"?C.then(X,X):(C.status="pending",C.then(function(B){C.status==="pending"&&(C.status="fulfilled",C.value=B)},function(B){C.status==="pending"&&(C.status="rejected",C.reason=B)})),C.status){case"fulfilled":return C.value;case"rejected":throw C.reason}}throw C}function _(C,B,H,G,W){var ae=typeof C;(ae==="undefined"||ae==="boolean")&&(C=null);var he=!1;if(C===null)he=!0;else switch(ae){case"bigint":case"string":case"number":he=!0;break;case"object":switch(C.$$typeof){case a:case s:he=!0;break;case S:return he=C._init,_(he(C._payload),B,H,G,W)}}if(he)return W=W(C),he=G===""?"."+ee(C,0):G,Y(W)?(H="",he!=null&&(H=he.replace(ye,"$&/")+"/"),_(W,B,H,"",function(rn){return rn})):W!=null&&(se(W)&&(W=ne(W,H+(W.key==null||C&&C.key===W.key?"":(""+W.key).replace(ye,"$&/")+"/")+he)),B.push(W)),1;he=0;var Ce=G===""?".":G+":";if(Y(C))for(var fe=0;fe>>1,de=_[le];if(0>>1;lef(H,P))Gf(W,H)?(_[le]=W,_[G]=P,le=G):(_[le]=H,_[B]=P,le=B);else if(Gf(W,P))_[le]=W,_[G]=P,le=G;else break e}}return U}function f(_,U){var P=_.sortIndex-U.sortIndex;return P!==0?P:_.id-U.id}if(a.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;a.unstable_now=function(){return d.now()}}else{var p=Date,m=p.now();a.unstable_now=function(){return p.now()-m}}var y=[],v=[],S=1,b=null,M=3,N=!1,j=!1,T=!1,A=!1,E=typeof setTimeout=="function"?setTimeout:null,w=typeof clearTimeout=="function"?clearTimeout:null,O=typeof setImmediate<"u"?setImmediate:null;function F(_){for(var U=i(v);U!==null;){if(U.callback===null)r(v);else if(U.startTime<=_)r(v),U.sortIndex=U.expirationTime,s(y,U);else break;U=i(v)}}function Y(_){if(T=!1,F(_),!j)if(i(y)!==null)j=!0,X||(X=!0,oe());else{var U=i(v);U!==null&&$(Y,U.startTime-_)}}var X=!1,K=-1,te=5,I=-1;function ne(){return A?!0:!(a.unstable_now()-I_&&ne());){var le=b.callback;if(typeof le=="function"){b.callback=null,M=b.priorityLevel;var de=le(b.expirationTime<=_);if(_=a.unstable_now(),typeof de=="function"){b.callback=de,F(_),U=!0;break t}b===i(y)&&r(y),F(_)}else r(y);b=i(y)}if(b!==null)U=!0;else{var C=i(v);C!==null&&$(Y,C.startTime-_),U=!1}}break e}finally{b=null,M=P,N=!1}U=void 0}}finally{U?oe():X=!1}}}var oe;if(typeof O=="function")oe=function(){O(se)};else if(typeof MessageChannel<"u"){var ye=new MessageChannel,ee=ye.port2;ye.port1.onmessage=se,oe=function(){ee.postMessage(null)}}else oe=function(){E(se,0)};function $(_,U){K=E(function(){_(a.unstable_now())},U)}a.unstable_IdlePriority=5,a.unstable_ImmediatePriority=1,a.unstable_LowPriority=4,a.unstable_NormalPriority=3,a.unstable_Profiling=null,a.unstable_UserBlockingPriority=2,a.unstable_cancelCallback=function(_){_.callback=null},a.unstable_forceFrameRate=function(_){0>_||125<_?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):te=0<_?Math.floor(1e3/_):5},a.unstable_getCurrentPriorityLevel=function(){return M},a.unstable_next=function(_){switch(M){case 1:case 2:case 3:var U=3;break;default:U=M}var P=M;M=U;try{return _()}finally{M=P}},a.unstable_requestPaint=function(){A=!0},a.unstable_runWithPriority=function(_,U){switch(_){case 1:case 2:case 3:case 4:case 5:break;default:_=3}var P=M;M=_;try{return U()}finally{M=P}},a.unstable_scheduleCallback=function(_,U,P){var le=a.unstable_now();switch(typeof P=="object"&&P!==null?(P=P.delay,P=typeof P=="number"&&0le?(_.sortIndex=P,s(v,_),i(y)===null&&_===i(v)&&(T?(w(K),K=-1):T=!0,$(Y,P-le))):(_.sortIndex=de,s(y,_),j||N||(j=!0,X||(X=!0,oe()))),_},a.unstable_shouldYield=ne,a.unstable_wrapCallback=function(_){var U=M;return function(){var P=M;M=U;try{return _.apply(this,arguments)}finally{M=P}}}})(Xc)),Xc}var pp;function $v(){return pp||(pp=1,Qc.exports=Xv()),Qc.exports}var $c={exports:{}},ut={};var gp;function Kv(){if(gp)return ut;gp=1;var a=wu();function s(y){var v="https://react.dev/errors/"+y;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(s){console.error(s)}}return a(),$c.exports=Kv(),$c.exports}var vp;function Jv(){if(vp)return ys;vp=1;var a=$v(),s=wu(),i=Zv();function r(e){var t="https://react.dev/errors/"+e;if(1de||(e.current=le[de],le[de]=null,de--)}function H(e,t){de++,le[de]=e.current,e.current=t}var G=C(null),W=C(null),ae=C(null),he=C(null);function Ce(e,t){switch(H(ae,t),H(W,e),H(G,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?km(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=km(t),e=Om(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}B(G),H(G,e)}function fe(){B(G),B(W),B(ae)}function rn(e){e.memoizedState!==null&&H(he,e);var t=G.current,n=Om(t,e.type);t!==n&&(H(W,e),H(G,n))}function kn(e){W.current===e&&(B(G),B(W)),he.current===e&&(B(he),ds._currentValue=P)}var Yt,oa;function Gt(e){if(Yt===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);Yt=t&&t[1]||"",oa=-1)":-1o||q[l]!==z[o]){var Q=` -`+q[l].replace(" at new "," at ");return e.displayName&&Q.includes("")&&(Q=Q.replace("",e.displayName)),Q}while(1<=l&&0<=o);break}}}finally{dt=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?Gt(n):""}function on(e,t){switch(e.tag){case 26:case 27:case 5:return Gt(e.type);case 16:return Gt("Lazy");case 13:return e.child!==t&&t!==null?Gt("Suspense Fallback"):Gt("Suspense");case 19:return Gt("SuspenseList");case 0:case 15:return Qt(e.type,!1);case 11:return Qt(e.type.render,!1);case 1:return Qt(e.type,!0);case 31:return Gt("Activity");default:return""}}function bl(e){try{var t="",n=null;do t+=on(e,n),n=e,e=e.return;while(e);return t}catch(l){return` -Error generating stack: `+l.message+` -`+l.stack}}var Sl=Object.prototype.hasOwnProperty,Al=a.unstable_scheduleCallback,jl=a.unstable_cancelCallback,zs=a.unstable_shouldYield,Ne=a.unstable_requestPaint,ze=a.unstable_now,ht=a.unstable_getCurrentPriorityLevel,Le=a.unstable_ImmediatePriority,Xe=a.unstable_UserBlockingPriority,Me=a.unstable_NormalPriority,wr=a.unstable_LowPriority,hf=a.unstable_IdlePriority,jg=a.log,Ng=a.unstable_setDisableYieldValue,Nl=null,At=null;function On(e){if(typeof jg=="function"&&Ng(e),At&&typeof At.setStrictMode=="function")try{At.setStrictMode(Nl,e)}catch{}}var jt=Math.clz32?Math.clz32:wg,qg=Math.log,Eg=Math.LN2;function wg(e){return e>>>=0,e===0?32:31-(qg(e)/Eg|0)|0}var Bs=256,Ls=262144,Us=4194304;function ca(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 Hs(e,t,n){var l=e.pendingLanes;if(l===0)return 0;var o=0,u=e.suspendedLanes,h=e.pingedLanes;e=e.warmLanes;var x=l&134217727;return x!==0?(l=x&~u,l!==0?o=ca(l):(h&=x,h!==0?o=ca(h):n||(n=x&~e,n!==0&&(o=ca(n))))):(x=l&~u,x!==0?o=ca(x):h!==0?o=ca(h):n||(n=l&~e,n!==0&&(o=ca(n)))),o===0?0:t!==0&&t!==o&&(t&u)===0&&(u=o&-o,n=t&-t,u>=n||u===32&&(n&4194048)!==0)?t:o}function ql(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Cg(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 mf(){var e=Us;return Us<<=1,(Us&62914560)===0&&(Us=4194304),e}function Cr(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function El(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Tg(e,t,n,l,o,u){var h=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var x=e.entanglements,q=e.expirationTimes,z=e.hiddenUpdates;for(n=h&~n;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var Dg=/[\n"\\]/g;function _t(e){return e.replace(Dg,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Or(e,t,n,l,o,u,h,x){e.name="",h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"?e.type=h:e.removeAttribute("type"),t!=null?h==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Mt(t)):e.value!==""+Mt(t)&&(e.value=""+Mt(t)):h!=="submit"&&h!=="reset"||e.removeAttribute("value"),t!=null?Dr(e,h,Mt(t)):n!=null?Dr(e,h,Mt(n)):l!=null&&e.removeAttribute("value"),o==null&&u!=null&&(e.defaultChecked=!!u),o!=null&&(e.checked=o&&typeof o!="function"&&typeof o!="symbol"),x!=null&&typeof x!="function"&&typeof x!="symbol"&&typeof x!="boolean"?e.name=""+Mt(x):e.removeAttribute("name")}function wf(e,t,n,l,o,u,h,x){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(e.type=u),t!=null||n!=null){if(!(u!=="submit"&&u!=="reset"||t!=null)){kr(e);return}n=n!=null?""+Mt(n):"",t=t!=null?""+Mt(t):n,x||t===e.value||(e.value=t),e.defaultValue=t}l=l??o,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=x?e.checked:!!l,e.defaultChecked=!!l,h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"&&(e.name=h),kr(e)}function Dr(e,t,n){t==="number"&&Gs(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function Da(e,t,n,l){if(e=e.options,t){t={};for(var o=0;o"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Hr=!1;if(fn)try{var Rl={};Object.defineProperty(Rl,"passive",{get:function(){Hr=!0}}),window.addEventListener("test",Rl,Rl),window.removeEventListener("test",Rl,Rl)}catch{Hr=!1}var zn=null,Vr=null,Xs=null;function Of(){if(Xs)return Xs;var e,t=Vr,n=t.length,l,o="value"in zn?zn.value:zn.textContent,u=o.length;for(e=0;e=kl),Hf=" ",Vf=!1;function Yf(e,t){switch(e){case"keyup":return cy.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Gf(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Ua=!1;function fy(e,t){switch(e){case"compositionend":return Gf(t);case"keypress":return t.which!==32?null:(Vf=!0,Hf);case"textInput":return e=t.data,e===Hf&&Vf?null:e;default:return null}}function dy(e,t){if(Ua)return e==="compositionend"||!$r&&Yf(e,t)?(e=Of(),Xs=Vr=zn=null,Ua=!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=l}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Wf(n)}}function Pf(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Pf(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function ed(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Gs(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Gs(e.document)}return t}function Jr(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 by=fn&&"documentMode"in document&&11>=document.documentMode,Ha=null,Fr=null,Bl=null,Wr=!1;function td(e,t,n){var l=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Wr||Ha==null||Ha!==Gs(l)||(l=Ha,"selectionStart"in l&&Jr(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),Bl&&zl(Bl,l)||(Bl=l,l=Li(Fr,"onSelect"),0>=h,o-=h,It=1<<32-jt(t)+o|n<ge?(Se=re,re=null):Se=re.sibling;var Ee=L(k,re,D[ge],Z);if(Ee===null){re===null&&(re=Se);break}e&&re&&Ee.alternate===null&&t(k,re),R=u(Ee,R,ge),qe===null?ce=Ee:qe.sibling=Ee,qe=Ee,re=Se}if(ge===D.length)return n(k,re),Ae&&hn(k,ge),ce;if(re===null){for(;gege?(Se=re,re=null):Se=re.sibling;var la=L(k,re,Ee.value,Z);if(la===null){re===null&&(re=Se);break}e&&re&&la.alternate===null&&t(k,re),R=u(la,R,ge),qe===null?ce=la:qe.sibling=la,qe=la,re=Se}if(Ee.done)return n(k,re),Ae&&hn(k,ge),ce;if(re===null){for(;!Ee.done;ge++,Ee=D.next())Ee=J(k,Ee.value,Z),Ee!==null&&(R=u(Ee,R,ge),qe===null?ce=Ee:qe.sibling=Ee,qe=Ee);return Ae&&hn(k,ge),ce}for(re=l(re);!Ee.done;ge++,Ee=D.next())Ee=V(re,k,ge,Ee.value,Z),Ee!==null&&(e&&Ee.alternate!==null&&re.delete(Ee.key===null?ge:Ee.key),R=u(Ee,R,ge),qe===null?ce=Ee:qe.sibling=Ee,qe=Ee);return e&&re.forEach(function(Hv){return t(k,Hv)}),Ae&&hn(k,ge),ce}function Oe(k,R,D,Z){if(typeof D=="object"&&D!==null&&D.type===T&&D.key===null&&(D=D.props.children),typeof D=="object"&&D!==null){switch(D.$$typeof){case N:e:{for(var ce=D.key;R!==null;){if(R.key===ce){if(ce=D.type,ce===T){if(R.tag===7){n(k,R.sibling),Z=o(R,D.props.children),Z.return=k,k=Z;break e}}else if(R.elementType===ce||typeof ce=="object"&&ce!==null&&ce.$$typeof===te&&ba(ce)===R.type){n(k,R.sibling),Z=o(R,D.props),Gl(Z,D),Z.return=k,k=Z;break e}n(k,R);break}else t(k,R);R=R.sibling}D.type===T?(Z=pa(D.props.children,k.mode,Z,D.key),Z.return=k,k=Z):(Z=ti(D.type,D.key,D.props,null,k.mode,Z),Gl(Z,D),Z.return=k,k=Z)}return h(k);case j:e:{for(ce=D.key;R!==null;){if(R.key===ce)if(R.tag===4&&R.stateNode.containerInfo===D.containerInfo&&R.stateNode.implementation===D.implementation){n(k,R.sibling),Z=o(R,D.children||[]),Z.return=k,k=Z;break e}else{n(k,R);break}else t(k,R);R=R.sibling}Z=lo(D,k.mode,Z),Z.return=k,k=Z}return h(k);case te:return D=ba(D),Oe(k,R,D,Z)}if($(D))return ie(k,R,D,Z);if(oe(D)){if(ce=oe(D),typeof ce!="function")throw Error(r(150));return D=ce.call(D),ue(k,R,D,Z)}if(typeof D.then=="function")return Oe(k,R,oi(D),Z);if(D.$$typeof===O)return Oe(k,R,li(k,D),Z);ci(k,D)}return typeof D=="string"&&D!==""||typeof D=="number"||typeof D=="bigint"?(D=""+D,R!==null&&R.tag===6?(n(k,R.sibling),Z=o(R,D),Z.return=k,k=Z):(n(k,R),Z=ao(D,k.mode,Z),Z.return=k,k=Z),h(k)):n(k,R)}return function(k,R,D,Z){try{Yl=0;var ce=Oe(k,R,D,Z);return Wa=null,ce}catch(re){if(re===Fa||re===ii)throw re;var qe=qt(29,re,null,k.mode);return qe.lanes=Z,qe.return=k,qe}finally{}}}var Aa=Nd(!0),qd=Nd(!1),Vn=!1;function yo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function vo(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 Yn(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Gn(e,t,n){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(we&2)!==0){var o=l.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),l.pending=t,t=ei(e),od(e,null,n),t}return Ps(e,l,t,n),ei(e)}function Ql(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194048)!==0)){var l=t.lanes;l&=e.pendingLanes,n|=l,t.lanes=n,gf(e,n)}}function xo(e,t){var n=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,n===l)){var o=null,u=null;if(n=n.firstBaseUpdate,n!==null){do{var h={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};u===null?o=u=h:u=u.next=h,n=n.next}while(n!==null);u===null?o=u=t:u=u.next=t}else o=u=t;n={baseState:l.baseState,firstBaseUpdate:o,lastBaseUpdate:u,shared:l.shared,callbacks:l.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var bo=!1;function Xl(){if(bo){var e=Ja;if(e!==null)throw e}}function $l(e,t,n,l){bo=!1;var o=e.updateQueue;Vn=!1;var u=o.firstBaseUpdate,h=o.lastBaseUpdate,x=o.shared.pending;if(x!==null){o.shared.pending=null;var q=x,z=q.next;q.next=null,h===null?u=z:h.next=z,h=q;var Q=e.alternate;Q!==null&&(Q=Q.updateQueue,x=Q.lastBaseUpdate,x!==h&&(x===null?Q.firstBaseUpdate=z:x.next=z,Q.lastBaseUpdate=q))}if(u!==null){var J=o.baseState;h=0,Q=z=q=null,x=u;do{var L=x.lane&-536870913,V=L!==x.lane;if(V?(be&L)===L:(l&L)===L){L!==0&&L===Za&&(bo=!0),Q!==null&&(Q=Q.next={lane:0,tag:x.tag,payload:x.payload,callback:null,next:null});e:{var ie=e,ue=x;L=t;var Oe=n;switch(ue.tag){case 1:if(ie=ue.payload,typeof ie=="function"){J=ie.call(Oe,J,L);break e}J=ie;break e;case 3:ie.flags=ie.flags&-65537|128;case 0:if(ie=ue.payload,L=typeof ie=="function"?ie.call(Oe,J,L):ie,L==null)break e;J=b({},J,L);break e;case 2:Vn=!0}}L=x.callback,L!==null&&(e.flags|=64,V&&(e.flags|=8192),V=o.callbacks,V===null?o.callbacks=[L]:V.push(L))}else V={lane:L,tag:x.tag,payload:x.payload,callback:x.callback,next:null},Q===null?(z=Q=V,q=J):Q=Q.next=V,h|=L;if(x=x.next,x===null){if(x=o.shared.pending,x===null)break;V=x,x=V.next,V.next=null,o.lastBaseUpdate=V,o.shared.pending=null}}while(!0);Q===null&&(q=J),o.baseState=q,o.firstBaseUpdate=z,o.lastBaseUpdate=Q,u===null&&(o.shared.lanes=0),Zn|=h,e.lanes=h,e.memoizedState=J}}function Ed(e,t){if(typeof e!="function")throw Error(r(191,e));e.call(t)}function wd(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;eu?u:8;var h=_.T,x={};_.T=x,Uo(e,!1,t,n);try{var q=o(),z=_.S;if(z!==null&&z(x,q),q!==null&&typeof q=="object"&&typeof q.then=="function"){var Q=Ty(q,l);Jl(e,t,Q,Rt(e))}else Jl(e,t,l,Rt(e))}catch(J){Jl(e,t,{then:function(){},status:"rejected",reason:J},Rt())}finally{U.p=u,h!==null&&x.types!==null&&(h.types=x.types),_.T=h}}function Dy(){}function Bo(e,t,n,l){if(e.tag!==5)throw Error(r(476));var o=sh(e).queue;lh(e,o,t,P,n===null?Dy:function(){return ih(e),n(l)})}function sh(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:P,baseState:P,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:yn,lastRenderedState:P},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:yn,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ih(e){var t=sh(e);t.next===null&&(t=e.alternate.memoizedState),Jl(e,t.next.queue,{},Rt())}function Lo(){return st(ds)}function rh(){return Ke().memoizedState}function oh(){return Ke().memoizedState}function zy(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=Rt();e=Yn(n);var l=Gn(t,e,n);l!==null&&(bt(l,t,n),Ql(l,t,n)),t={cache:ho()},e.payload=t;return}t=t.return}}function By(e,t,n){var l=Rt();n={lane:l,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},xi(e)?uh(t,n):(n=to(e,t,n,l),n!==null&&(bt(n,e,l),fh(n,t,l)))}function ch(e,t,n){var l=Rt();Jl(e,t,n,l)}function Jl(e,t,n,l){var o={lane:l,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(xi(e))uh(t,o);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var h=t.lastRenderedState,x=u(h,n);if(o.hasEagerState=!0,o.eagerState=x,Nt(x,h))return Ps(e,t,o,0),Be===null&&Is(),!1}catch{}finally{}if(n=to(e,t,o,l),n!==null)return bt(n,e,l),fh(n,t,l),!0}return!1}function Uo(e,t,n,l){if(l={lane:2,revertLane:yc(),gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},xi(e)){if(t)throw Error(r(479))}else t=to(e,n,l,2),t!==null&&bt(t,e,2)}function xi(e){var t=e.alternate;return e===pe||t!==null&&t===pe}function uh(e,t){Pa=di=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function fh(e,t,n){if((n&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,n|=l,t.lanes=n,gf(e,n)}}var Fl={readContext:st,use:pi,useCallback:Ge,useContext:Ge,useEffect:Ge,useImperativeHandle:Ge,useLayoutEffect:Ge,useInsertionEffect:Ge,useMemo:Ge,useReducer:Ge,useRef:Ge,useState:Ge,useDebugValue:Ge,useDeferredValue:Ge,useTransition:Ge,useSyncExternalStore:Ge,useId:Ge,useHostTransitionStatus:Ge,useFormState:Ge,useActionState:Ge,useOptimistic:Ge,useMemoCache:Ge,useCacheRefresh:Ge};Fl.useEffectEvent=Ge;var dh={readContext:st,use:pi,useCallback:function(e,t){return ft().memoizedState=[e,t===void 0?null:t],e},useContext:st,useEffect:Jd,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,yi(4194308,4,Pd.bind(null,t,e),n)},useLayoutEffect:function(e,t){return yi(4194308,4,e,t)},useInsertionEffect:function(e,t){yi(4,2,e,t)},useMemo:function(e,t){var n=ft();t=t===void 0?null:t;var l=e();if(ja){On(!0);try{e()}finally{On(!1)}}return n.memoizedState=[l,t],l},useReducer:function(e,t,n){var l=ft();if(n!==void 0){var o=n(t);if(ja){On(!0);try{n(t)}finally{On(!1)}}}else o=t;return l.memoizedState=l.baseState=o,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:o},l.queue=e,e=e.dispatch=By.bind(null,pe,e),[l.memoizedState,e]},useRef:function(e){var t=ft();return e={current:e},t.memoizedState=e},useState:function(e){e=_o(e);var t=e.queue,n=ch.bind(null,pe,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Do,useDeferredValue:function(e,t){var n=ft();return zo(n,e,t)},useTransition:function(){var e=_o(!1);return e=lh.bind(null,pe,e.queue,!0,!1),ft().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var l=pe,o=ft();if(Ae){if(n===void 0)throw Error(r(407));n=n()}else{if(n=t(),Be===null)throw Error(r(349));(be&127)!==0||kd(l,t,n)}o.memoizedState=n;var u={value:n,getSnapshot:t};return o.queue=u,Jd(Dd.bind(null,l,u,e),[e]),l.flags|=2048,tl(9,{destroy:void 0},Od.bind(null,l,u,n,t),null),n},useId:function(){var e=ft(),t=Be.identifierPrefix;if(Ae){var n=Pt,l=It;n=(l&~(1<<32-jt(l)-1)).toString(32)+n,t="_"+t+"R_"+n,n=hi++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof l.is=="string"?h.createElement("select",{is:l.is}):h.createElement("select"),l.multiple?u.multiple=!0:l.size&&(u.size=l.size);break;default:u=typeof l.is=="string"?h.createElement(o,{is:l.is}):h.createElement(o)}}u[at]=t,u[mt]=l;e:for(h=t.child;h!==null;){if(h.tag===5||h.tag===6)u.appendChild(h.stateNode);else if(h.tag!==4&&h.tag!==27&&h.child!==null){h.child.return=h,h=h.child;continue}if(h===t)break e;for(;h.sibling===null;){if(h.return===null||h.return===t)break e;h=h.return}h.sibling.return=h.return,h=h.sibling}t.stateNode=u;e:switch(rt(u,o,l),o){case"button":case"input":case"select":case"textarea":l=!!l.autoFocus;break e;case"img":l=!0;break e;default:l=!1}l&&xn(t)}}return He(t),Po(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==l&&xn(t);else{if(typeof l!="string"&&t.stateNode===null)throw Error(r(166));if(e=ae.current,$a(t)){if(e=t.stateNode,n=t.memoizedProps,l=null,o=lt,o!==null)switch(o.tag){case 27:case 5:l=o.memoizedProps}e[at]=t,e=!!(e.nodeValue===n||l!==null&&l.suppressHydrationWarning===!0||Mm(e.nodeValue,n)),e||Un(t,!0)}else e=Ui(e).createTextNode(l),e[at]=t,t.stateNode=e}return He(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(l=$a(t),n!==null){if(e===null){if(!l)throw Error(r(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(557));e[at]=t}else ga(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;He(t),e=!1}else n=oo(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(wt(t),t):(wt(t),null);if((t.flags&128)!==0)throw Error(r(558))}return He(t),null;case 13:if(l=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(o=$a(t),l!==null&&l.dehydrated!==null){if(e===null){if(!o)throw Error(r(318));if(o=t.memoizedState,o=o!==null?o.dehydrated:null,!o)throw Error(r(317));o[at]=t}else ga(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;He(t),o=!1}else o=oo(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=o),o=!0;if(!o)return t.flags&256?(wt(t),t):(wt(t),null)}return wt(t),(t.flags&128)!==0?(t.lanes=n,t):(n=l!==null,e=e!==null&&e.memoizedState!==null,n&&(l=t.child,o=null,l.alternate!==null&&l.alternate.memoizedState!==null&&l.alternate.memoizedState.cachePool!==null&&(o=l.alternate.memoizedState.cachePool.pool),u=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(u=l.memoizedState.cachePool.pool),u!==o&&(l.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Ni(t,t.updateQueue),He(t),null);case 4:return fe(),e===null&&Sc(t.stateNode.containerInfo),He(t),null;case 10:return pn(t.type),He(t),null;case 19:if(B($e),l=t.memoizedState,l===null)return He(t),null;if(o=(t.flags&128)!==0,u=l.rendering,u===null)if(o)Il(l,!1);else{if(Qe!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(u=fi(e),u!==null){for(t.flags|=128,Il(l,!1),e=u.updateQueue,t.updateQueue=e,Ni(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)cd(n,e),n=n.sibling;return H($e,$e.current&1|2),Ae&&hn(t,l.treeForkCount),t.child}e=e.sibling}l.tail!==null&&ze()>Ti&&(t.flags|=128,o=!0,Il(l,!1),t.lanes=4194304)}else{if(!o)if(e=fi(u),e!==null){if(t.flags|=128,o=!0,e=e.updateQueue,t.updateQueue=e,Ni(t,e),Il(l,!0),l.tail===null&&l.tailMode==="hidden"&&!u.alternate&&!Ae)return He(t),null}else 2*ze()-l.renderingStartTime>Ti&&n!==536870912&&(t.flags|=128,o=!0,Il(l,!1),t.lanes=4194304);l.isBackwards?(u.sibling=t.child,t.child=u):(e=l.last,e!==null?e.sibling=u:t.child=u,l.last=u)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=ze(),e.sibling=null,n=$e.current,H($e,o?n&1|2:n&1),Ae&&hn(t,l.treeForkCount),e):(He(t),null);case 22:case 23:return wt(t),Ao(),l=t.memoizedState!==null,e!==null?e.memoizedState!==null!==l&&(t.flags|=8192):l&&(t.flags|=8192),l?(n&536870912)!==0&&(t.flags&128)===0&&(He(t),t.subtreeFlags&6&&(t.flags|=8192)):He(t),n=t.updateQueue,n!==null&&Ni(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),l=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),l!==n&&(t.flags|=2048),e!==null&&B(xa),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),pn(Ze),He(t),null;case 25:return null;case 30:return null}throw Error(r(156,t.tag))}function Yy(e,t){switch(io(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return pn(Ze),fe(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return kn(t),null;case 31:if(t.memoizedState!==null){if(wt(t),t.alternate===null)throw Error(r(340));ga()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(wt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));ga()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return B($e),null;case 4:return fe(),null;case 10:return pn(t.type),null;case 22:case 23:return wt(t),Ao(),e!==null&&B(xa),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return pn(Ze),null;case 25:return null;default:return null}}function zh(e,t){switch(io(t),t.tag){case 3:pn(Ze),fe();break;case 26:case 27:case 5:kn(t);break;case 4:fe();break;case 31:t.memoizedState!==null&&wt(t);break;case 13:wt(t);break;case 19:B($e);break;case 10:pn(t.type);break;case 22:case 23:wt(t),Ao(),e!==null&&B(xa);break;case 24:pn(Ze)}}function Pl(e,t){try{var n=t.updateQueue,l=n!==null?n.lastEffect:null;if(l!==null){var o=l.next;n=o;do{if((n.tag&e)===e){l=void 0;var u=n.create,h=n.inst;l=u(),h.destroy=l}n=n.next}while(n!==o)}}catch(x){Re(t,t.return,x)}}function $n(e,t,n){try{var l=t.updateQueue,o=l!==null?l.lastEffect:null;if(o!==null){var u=o.next;l=u;do{if((l.tag&e)===e){var h=l.inst,x=h.destroy;if(x!==void 0){h.destroy=void 0,o=t;var q=n,z=x;try{z()}catch(Q){Re(o,q,Q)}}}l=l.next}while(l!==u)}}catch(Q){Re(t,t.return,Q)}}function Bh(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{wd(t,n)}catch(l){Re(e,e.return,l)}}}function Lh(e,t,n){n.props=Na(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(l){Re(e,t,l)}}function es(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var l=e.stateNode;break;case 30:l=e.stateNode;break;default:l=e.stateNode}typeof n=="function"?e.refCleanup=n(l):n.current=l}}catch(o){Re(e,t,o)}}function en(e,t){var n=e.ref,l=e.refCleanup;if(n!==null)if(typeof l=="function")try{l()}catch(o){Re(e,t,o)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n=="function")try{n(null)}catch(o){Re(e,t,o)}else n.current=null}function Uh(e){var t=e.type,n=e.memoizedProps,l=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":n.autoFocus&&l.focus();break e;case"img":n.src?l.src=n.src:n.srcSet&&(l.srcset=n.srcSet)}}catch(o){Re(e,e.return,o)}}function ec(e,t,n){try{var l=e.stateNode;uv(l,e.type,n,t),l[mt]=t}catch(o){Re(e,e.return,o)}}function Hh(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Pn(e.type)||e.tag===4}function tc(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Hh(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&&Pn(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 nc(e,t,n){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=un));else if(l!==4&&(l===27&&Pn(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(nc(e,t,n),e=e.sibling;e!==null;)nc(e,t,n),e=e.sibling}function qi(e,t,n){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(l!==4&&(l===27&&Pn(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(qi(e,t,n),e=e.sibling;e!==null;)qi(e,t,n),e=e.sibling}function Vh(e){var t=e.stateNode,n=e.memoizedProps;try{for(var l=e.type,o=t.attributes;o.length;)t.removeAttributeNode(o[0]);rt(t,l,n),t[at]=e,t[mt]=n}catch(u){Re(e,e.return,u)}}var bn=!1,We=!1,ac=!1,Yh=typeof WeakSet=="function"?WeakSet:Set,nt=null;function Gy(e,t){if(e=e.containerInfo,Nc=$i,e=ed(e),Jr(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var l=n.getSelection&&n.getSelection();if(l&&l.rangeCount!==0){n=l.anchorNode;var o=l.anchorOffset,u=l.focusNode;l=l.focusOffset;try{n.nodeType,u.nodeType}catch{n=null;break e}var h=0,x=-1,q=-1,z=0,Q=0,J=e,L=null;t:for(;;){for(var V;J!==n||o!==0&&J.nodeType!==3||(x=h+o),J!==u||l!==0&&J.nodeType!==3||(q=h+l),J.nodeType===3&&(h+=J.nodeValue.length),(V=J.firstChild)!==null;)L=J,J=V;for(;;){if(J===e)break t;if(L===n&&++z===o&&(x=h),L===u&&++Q===l&&(q=h),(V=J.nextSibling)!==null)break;J=L,L=J.parentNode}J=V}n=x===-1||q===-1?null:{start:x,end:q}}else n=null}n=n||{start:0,end:0}}else n=null;for(qc={focusedElem:e,selectionRange:n},$i=!1,nt=t;nt!==null;)if(t=nt,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,nt=e;else for(;nt!==null;){switch(t=nt,u=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(n=0;n title"))),rt(u,l,n),u[at]=e,tt(u),l=u;break e;case"link":var h=Zm("link","href",o).get(l+(n.href||""));if(h){for(var x=0;xOe&&(h=Oe,Oe=ue,ue=h);var k=If(x,ue),R=If(x,Oe);if(k&&R&&(V.rangeCount!==1||V.anchorNode!==k.node||V.anchorOffset!==k.offset||V.focusNode!==R.node||V.focusOffset!==R.offset)){var D=J.createRange();D.setStart(k.node,k.offset),V.removeAllRanges(),ue>Oe?(V.addRange(D),V.extend(R.node,R.offset)):(D.setEnd(R.node,R.offset),V.addRange(D))}}}}for(J=[],V=x;V=V.parentNode;)V.nodeType===1&&J.push({element:V,left:V.scrollLeft,top:V.scrollTop});for(typeof x.focus=="function"&&x.focus(),x=0;xn?32:n,_.T=null,n=uc,uc=null;var u=Fn,h=qn;if(et=0,il=Fn=null,qn=0,(we&6)!==0)throw Error(r(331));var x=we;if(we|=4,Ph(u.current),Fh(u,u.current,h,n),we=x,is(0,!1),At&&typeof At.onPostCommitFiberRoot=="function")try{At.onPostCommitFiberRoot(Nl,u)}catch{}return!0}finally{U.p=o,_.T=l,ym(e,t)}}function xm(e,t,n){t=Ot(n,t),t=Go(e.stateNode,t,2),e=Gn(e,t,2),e!==null&&(El(e,2),tn(e))}function Re(e,t,n){if(e.tag===3)xm(e,e,n);else for(;t!==null;){if(t.tag===3){xm(t,e,n);break}else if(t.tag===1){var l=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof l.componentDidCatch=="function"&&(Jn===null||!Jn.has(l))){e=Ot(n,e),n=bh(2),l=Gn(t,n,2),l!==null&&(Sh(n,l,t,e),El(l,2),tn(l));break}}t=t.return}}function mc(e,t,n){var l=e.pingCache;if(l===null){l=e.pingCache=new $y;var o=new Set;l.set(t,o)}else o=l.get(t),o===void 0&&(o=new Set,l.set(t,o));o.has(n)||(ic=!0,o.add(n),e=Wy.bind(null,e,t,n),t.then(e,e))}function Wy(e,t,n){var l=e.pingCache;l!==null&&l.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,Be===e&&(be&n)===n&&(Qe===4||Qe===3&&(be&62914560)===be&&300>ze()-Ci?(we&2)===0&&rl(e,0):rc|=n,sl===be&&(sl=0)),tn(e)}function bm(e,t){t===0&&(t=mf()),e=ma(e,t),e!==null&&(El(e,t),tn(e))}function Iy(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),bm(e,n)}function Py(e,t){var n=0;switch(e.tag){case 31:case 13:var l=e.stateNode,o=e.memoizedState;o!==null&&(n=o.retryLane);break;case 19:l=e.stateNode;break;case 22:l=e.stateNode._retryCache;break;default:throw Error(r(314))}l!==null&&l.delete(t),bm(e,n)}function ev(e,t){return Al(e,t)}var Di=null,cl=null,pc=!1,zi=!1,gc=!1,In=0;function tn(e){e!==cl&&e.next===null&&(cl===null?Di=cl=e:cl=cl.next=e),zi=!0,pc||(pc=!0,nv())}function is(e,t){if(!gc&&zi){gc=!0;do for(var n=!1,l=Di;l!==null;){if(e!==0){var o=l.pendingLanes;if(o===0)var u=0;else{var h=l.suspendedLanes,x=l.pingedLanes;u=(1<<31-jt(42|e)+1)-1,u&=o&~(h&~x),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(n=!0,Nm(l,u))}else u=be,u=Hs(l,l===Be?u:0,l.cancelPendingCommit!==null||l.timeoutHandle!==-1),(u&3)===0||ql(l,u)||(n=!0,Nm(l,u));l=l.next}while(n);gc=!1}}function tv(){Sm()}function Sm(){zi=pc=!1;var e=0;In!==0&&dv()&&(e=In);for(var t=ze(),n=null,l=Di;l!==null;){var o=l.next,u=Am(l,t);u===0?(l.next=null,n===null?Di=o:n.next=o,o===null&&(cl=n)):(n=l,(e!==0||(u&3)!==0)&&(zi=!0)),l=o}et!==0&&et!==5||is(e),In!==0&&(In=0)}function Am(e,t){for(var n=e.suspendedLanes,l=e.pingedLanes,o=e.expirationTimes,u=e.pendingLanes&-62914561;0x)break;var Q=q.transferSize,J=q.initiatorType;Q&&_m(J)&&(q=q.responseEnd,h+=Q*(q"u"?null:document;function Qm(e,t,n){var l=ul;if(l&&typeof t=="string"&&t){var o=_t(t);o='link[rel="'+e+'"][href="'+o+'"]',typeof n=="string"&&(o+='[crossorigin="'+n+'"]'),Gm.has(o)||(Gm.add(o),e={rel:e,crossOrigin:n,href:t},l.querySelector(o)===null&&(t=l.createElement("link"),rt(t,"link",e),tt(t),l.head.appendChild(t)))}}function Sv(e){En.D(e),Qm("dns-prefetch",e,null)}function Av(e,t){En.C(e,t),Qm("preconnect",e,t)}function jv(e,t,n){En.L(e,t,n);var l=ul;if(l&&e&&t){var o='link[rel="preload"][as="'+_t(t)+'"]';t==="image"&&n&&n.imageSrcSet?(o+='[imagesrcset="'+_t(n.imageSrcSet)+'"]',typeof n.imageSizes=="string"&&(o+='[imagesizes="'+_t(n.imageSizes)+'"]')):o+='[href="'+_t(e)+'"]';var u=o;switch(t){case"style":u=fl(e);break;case"script":u=dl(e)}Ht.has(u)||(e=b({rel:"preload",href:t==="image"&&n&&n.imageSrcSet?void 0:e,as:t},n),Ht.set(u,e),l.querySelector(o)!==null||t==="style"&&l.querySelector(us(u))||t==="script"&&l.querySelector(fs(u))||(t=l.createElement("link"),rt(t,"link",e),tt(t),l.head.appendChild(t)))}}function Nv(e,t){En.m(e,t);var n=ul;if(n&&e){var l=t&&typeof t.as=="string"?t.as:"script",o='link[rel="modulepreload"][as="'+_t(l)+'"][href="'+_t(e)+'"]',u=o;switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=dl(e)}if(!Ht.has(u)&&(e=b({rel:"modulepreload",href:e},t),Ht.set(u,e),n.querySelector(o)===null)){switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(fs(u)))return}l=n.createElement("link"),rt(l,"link",e),tt(l),n.head.appendChild(l)}}}function qv(e,t,n){En.S(e,t,n);var l=ul;if(l&&e){var o=ka(l).hoistableStyles,u=fl(e);t=t||"default";var h=o.get(u);if(!h){var x={loading:0,preload:null};if(h=l.querySelector(us(u)))x.loading=5;else{e=b({rel:"stylesheet",href:e,"data-precedence":t},n),(n=Ht.get(u))&&_c(e,n);var q=h=l.createElement("link");tt(q),rt(q,"link",e),q._p=new Promise(function(z,Q){q.onload=z,q.onerror=Q}),q.addEventListener("load",function(){x.loading|=1}),q.addEventListener("error",function(){x.loading|=2}),x.loading|=4,Vi(h,t,l)}h={type:"stylesheet",instance:h,count:1,state:x},o.set(u,h)}}}function Ev(e,t){En.X(e,t);var n=ul;if(n&&e){var l=ka(n).hoistableScripts,o=dl(e),u=l.get(o);u||(u=n.querySelector(fs(o)),u||(e=b({src:e,async:!0},t),(t=Ht.get(o))&&kc(e,t),u=n.createElement("script"),tt(u),rt(u,"link",e),n.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},l.set(o,u))}}function wv(e,t){En.M(e,t);var n=ul;if(n&&e){var l=ka(n).hoistableScripts,o=dl(e),u=l.get(o);u||(u=n.querySelector(fs(o)),u||(e=b({src:e,async:!0,type:"module"},t),(t=Ht.get(o))&&kc(e,t),u=n.createElement("script"),tt(u),rt(u,"link",e),n.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},l.set(o,u))}}function Xm(e,t,n,l){var o=(o=ae.current)?Hi(o):null;if(!o)throw Error(r(446));switch(e){case"meta":case"title":return null;case"style":return typeof n.precedence=="string"&&typeof n.href=="string"?(t=fl(n.href),n=ka(o).hoistableStyles,l=n.get(t),l||(l={type:"style",instance:null,count:0,state:null},n.set(t,l)),l):{type:"void",instance:null,count:0,state:null};case"link":if(n.rel==="stylesheet"&&typeof n.href=="string"&&typeof n.precedence=="string"){e=fl(n.href);var u=ka(o).hoistableStyles,h=u.get(e);if(h||(o=o.ownerDocument||o,h={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,h),(u=o.querySelector(us(e)))&&!u._p&&(h.instance=u,h.state.loading=5),Ht.has(e)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},Ht.set(e,n),u||Cv(o,e,n,h.state))),t&&l===null)throw Error(r(528,""));return h}if(t&&l!==null)throw Error(r(529,""));return null;case"script":return t=n.async,n=n.src,typeof n=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=dl(n),n=ka(o).hoistableScripts,l=n.get(t),l||(l={type:"script",instance:null,count:0,state:null},n.set(t,l)),l):{type:"void",instance:null,count:0,state:null};default:throw Error(r(444,e))}}function fl(e){return'href="'+_t(e)+'"'}function us(e){return'link[rel="stylesheet"]['+e+"]"}function $m(e){return b({},e,{"data-precedence":e.precedence,precedence:null})}function Cv(e,t,n,l){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?l.loading=1:(t=e.createElement("link"),l.preload=t,t.addEventListener("load",function(){return l.loading|=1}),t.addEventListener("error",function(){return l.loading|=2}),rt(t,"link",n),tt(t),e.head.appendChild(t))}function dl(e){return'[src="'+_t(e)+'"]'}function fs(e){return"script[async]"+e}function Km(e,t,n){if(t.count++,t.instance===null)switch(t.type){case"style":var l=e.querySelector('style[data-href~="'+_t(n.href)+'"]');if(l)return t.instance=l,tt(l),l;var o=b({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return l=(e.ownerDocument||e).createElement("style"),tt(l),rt(l,"style",o),Vi(l,n.precedence,e),t.instance=l;case"stylesheet":o=fl(n.href);var u=e.querySelector(us(o));if(u)return t.state.loading|=4,t.instance=u,tt(u),u;l=$m(n),(o=Ht.get(o))&&_c(l,o),u=(e.ownerDocument||e).createElement("link"),tt(u);var h=u;return h._p=new Promise(function(x,q){h.onload=x,h.onerror=q}),rt(u,"link",l),t.state.loading|=4,Vi(u,n.precedence,e),t.instance=u;case"script":return u=dl(n.src),(o=e.querySelector(fs(u)))?(t.instance=o,tt(o),o):(l=n,(o=Ht.get(u))&&(l=b({},n),kc(l,o)),e=e.ownerDocument||e,o=e.createElement("script"),tt(o),rt(o,"link",l),e.head.appendChild(o),t.instance=o);case"void":return null;default:throw Error(r(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(l=t.instance,t.state.loading|=4,Vi(l,n.precedence,e));return t.instance}function Vi(e,t,n){for(var l=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),o=l.length?l[l.length-1]:null,u=o,h=0;h title"):null)}function Tv(e,t,n){if(n===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 Fm(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function Rv(e,t,n,l){if(n.type==="stylesheet"&&(typeof l.media!="string"||matchMedia(l.media).matches!==!1)&&(n.state.loading&4)===0){if(n.instance===null){var o=fl(l.href),u=t.querySelector(us(o));if(u){t=u._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Gi.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=u,tt(u);return}u=t.ownerDocument||t,l=$m(l),(o=Ht.get(o))&&_c(l,o),u=u.createElement("link"),tt(u);var h=u;h._p=new Promise(function(x,q){h.onload=x,h.onerror=q}),rt(u,"link",l),n.instance=u}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&(n.state.loading&3)===0&&(e.count++,n=Gi.bind(e),t.addEventListener("load",n),t.addEventListener("error",n))}}var Oc=0;function Mv(e,t){return e.stylesheets&&e.count===0&&Xi(e,e.stylesheets),0Oc?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(l),clearTimeout(o)}}:null}function Gi(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xi(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Qi=null;function Xi(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Qi=new Map,t.forEach(_v,e),Qi=null,Gi.call(e))}function _v(e,t){if(!(t.state.loading&4)){var n=Qi.get(e);if(n)var l=n.get(null);else{n=new Map,Qi.set(e,n);for(var o=e.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(s){console.error(s)}}return a(),Gc.exports=Jv(),Gc.exports}var Wv=Fv();var bp="popstate";function Iv(a={}){function s(r,f){let{pathname:d,search:p,hash:m}=r.location;return du("",{pathname:d,search:p,hash:m},f.state&&f.state.usr||null,f.state&&f.state.key||"default")}function i(r,f){return typeof f=="string"?f:qs(f)}return ex(s,i,null,a)}function Ye(a,s){if(a===!1||a===null||typeof a>"u")throw new Error(s)}function Wt(a,s){if(!a){typeof console<"u"&&console.warn(s);try{throw new Error(s)}catch{}}}function Pv(){return Math.random().toString(36).substring(2,10)}function Sp(a,s){return{usr:a.state,key:a.key,idx:s}}function du(a,s,i=null,r){return{pathname:typeof a=="string"?a:a.pathname,search:"",hash:"",...typeof s=="string"?yl(s):s,state:i,key:s&&s.key||r||Pv()}}function qs({pathname:a="/",search:s="",hash:i=""}){return s&&s!=="?"&&(a+=s.charAt(0)==="?"?s:"?"+s),i&&i!=="#"&&(a+=i.charAt(0)==="#"?i:"#"+i),a}function yl(a){let s={};if(a){let i=a.indexOf("#");i>=0&&(s.hash=a.substring(i),a=a.substring(0,i));let r=a.indexOf("?");r>=0&&(s.search=a.substring(r),a=a.substring(0,r)),a&&(s.pathname=a)}return s}function ex(a,s,i,r={}){let{window:f=document.defaultView,v5Compat:d=!1}=r,p=f.history,m="POP",y=null,v=S();v==null&&(v=0,p.replaceState({...p.state,idx:v},""));function S(){return(p.state||{idx:null}).idx}function b(){m="POP";let A=S(),E=A==null?null:A-v;v=A,y&&y({action:m,location:T.location,delta:E})}function M(A,E){m="PUSH";let w=du(T.location,A,E);v=S()+1;let O=Sp(w,v),F=T.createHref(w);try{p.pushState(O,"",F)}catch(Y){if(Y instanceof DOMException&&Y.name==="DataCloneError")throw Y;f.location.assign(F)}d&&y&&y({action:m,location:T.location,delta:1})}function N(A,E){m="REPLACE";let w=du(T.location,A,E);v=S();let O=Sp(w,v),F=T.createHref(w);p.replaceState(O,"",F),d&&y&&y({action:m,location:T.location,delta:0})}function j(A){return tx(A)}let T={get action(){return m},get location(){return a(f,p)},listen(A){if(y)throw new Error("A history only accepts one active listener");return f.addEventListener(bp,b),y=A,()=>{f.removeEventListener(bp,b),y=null}},createHref(A){return s(f,A)},createURL:j,encodeLocation(A){let E=j(A);return{pathname:E.pathname,search:E.search,hash:E.hash}},push:M,replace:N,go(A){return p.go(A)}};return T}function tx(a,s=!1){let i="http://localhost";typeof window<"u"&&(i=window.location.origin!=="null"?window.location.origin:window.location.href),Ye(i,"No window.location.(origin|href) available to create URL");let r=typeof a=="string"?a:qs(a);return r=r.replace(/ $/,"%20"),!s&&r.startsWith("//")&&(r=i+r),new URL(r,i)}function o0(a,s,i="/"){return nx(a,s,i,!1)}function nx(a,s,i,r){let f=typeof s=="string"?yl(s):s,d=Mn(f.pathname||"/",i);if(d==null)return null;let p=c0(a);ax(p);let m=null;for(let y=0;m==null&&y{let S={relativePath:v===void 0?p.path||"":v,caseSensitive:p.caseSensitive===!0,childrenIndex:m,route:p};if(S.relativePath.startsWith("/")){if(!S.relativePath.startsWith(r)&&y)return;Ye(S.relativePath.startsWith(r),`Absolute route path "${S.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),S.relativePath=S.relativePath.slice(r.length)}let b=Tn([r,S.relativePath]),M=i.concat(S);p.children&&p.children.length>0&&(Ye(p.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${b}".`),c0(p.children,s,M,b,y)),!(p.path==null&&!p.index)&&s.push({path:b,score:ux(b,p.index),routesMeta:M})};return a.forEach((p,m)=>{if(p.path===""||!p.path?.includes("?"))d(p,m);else for(let y of u0(p.path))d(p,m,!0,y)}),s}function u0(a){let s=a.split("/");if(s.length===0)return[];let[i,...r]=s,f=i.endsWith("?"),d=i.replace(/\?$/,"");if(r.length===0)return f?[d,""]:[d];let p=u0(r.join("/")),m=[];return m.push(...p.map(y=>y===""?d:[d,y].join("/"))),f&&m.push(...p),m.map(y=>a.startsWith("/")&&y===""?"/":y)}function ax(a){a.sort((s,i)=>s.score!==i.score?i.score-s.score:fx(s.routesMeta.map(r=>r.childrenIndex),i.routesMeta.map(r=>r.childrenIndex)))}var lx=/^:[\w-]+$/,sx=3,ix=2,rx=1,ox=10,cx=-2,Ap=a=>a==="*";function ux(a,s){let i=a.split("/"),r=i.length;return i.some(Ap)&&(r+=cx),s&&(r+=ix),i.filter(f=>!Ap(f)).reduce((f,d)=>f+(lx.test(d)?sx:d===""?rx:ox),r)}function fx(a,s){return a.length===s.length&&a.slice(0,-1).every((r,f)=>r===s[f])?a[a.length-1]-s[s.length-1]:0}function dx(a,s,i=!1){let{routesMeta:r}=a,f={},d="/",p=[];for(let m=0;m{if(S==="*"){let j=m[M]||"";p=d.slice(0,d.length-j.length).replace(/(.)\/+$/,"$1")}const N=m[M];return b&&!N?v[S]=void 0:v[S]=(N||"").replace(/%2F/g,"/"),v},{}),pathname:d,pathnameBase:p,pattern:a}}function hx(a,s=!1,i=!0){Wt(a==="*"||!a.endsWith("*")||a.endsWith("/*"),`Route path "${a}" will be treated as if it were "${a.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${a.replace(/\*$/,"/*")}".`);let r=[],f="^"+a.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(p,m,y)=>(r.push({paramName:m,isOptional:y!=null}),y?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return a.endsWith("*")?(r.push({paramName:"*"}),f+=a==="*"||a==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):i?f+="\\/*$":a!==""&&a!=="/"&&(f+="(?:(?=\\/|$))"),[new RegExp(f,s?void 0:"i"),r]}function mx(a){try{return a.split("/").map(s=>decodeURIComponent(s).replace(/\//g,"%2F")).join("/")}catch(s){return Wt(!1,`The URL path "${a}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${s}).`),a}}function Mn(a,s){if(s==="/")return a;if(!a.toLowerCase().startsWith(s.toLowerCase()))return null;let i=s.endsWith("/")?s.length-1:s.length,r=a.charAt(i);return r&&r!=="/"?null:a.slice(i)||"/"}var px=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,gx=a=>px.test(a);function yx(a,s="/"){let{pathname:i,search:r="",hash:f=""}=typeof a=="string"?yl(a):a,d;if(i)if(gx(i))d=i;else{if(i.includes("//")){let p=i;i=i.replace(/\/\/+/g,"/"),Wt(!1,`Pathnames cannot have embedded double slashes - normalizing ${p} -> ${i}`)}i.startsWith("/")?d=jp(i.substring(1),"/"):d=jp(i,s)}else d=s;return{pathname:d,search:bx(r),hash:Sx(f)}}function jp(a,s){let i=s.replace(/\/+$/,"").split("/");return a.split("/").forEach(f=>{f===".."?i.length>1&&i.pop():f!=="."&&i.push(f)}),i.length>1?i.join("/"):"/"}function Kc(a,s,i,r){return`Cannot include a '${a}' character in a manually specified \`to.${s}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${i}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function vx(a){return a.filter((s,i)=>i===0||s.route.path&&s.route.path.length>0)}function f0(a){let s=vx(a);return s.map((i,r)=>r===s.length-1?i.pathname:i.pathnameBase)}function d0(a,s,i,r=!1){let f;typeof a=="string"?f=yl(a):(f={...a},Ye(!f.pathname||!f.pathname.includes("?"),Kc("?","pathname","search",f)),Ye(!f.pathname||!f.pathname.includes("#"),Kc("#","pathname","hash",f)),Ye(!f.search||!f.search.includes("#"),Kc("#","search","hash",f)));let d=a===""||f.pathname==="",p=d?"/":f.pathname,m;if(p==null)m=i;else{let b=s.length-1;if(!r&&p.startsWith("..")){let M=p.split("/");for(;M[0]==="..";)M.shift(),b-=1;f.pathname=M.join("/")}m=b>=0?s[b]:"/"}let y=yx(f,m),v=p&&p!=="/"&&p.endsWith("/"),S=(d||p===".")&&i.endsWith("/");return!y.pathname.endsWith("/")&&(v||S)&&(y.pathname+="/"),y}var Tn=a=>a.join("/").replace(/\/\/+/g,"/"),xx=a=>a.replace(/\/+$/,"").replace(/^\/*/,"/"),bx=a=>!a||a==="?"?"":a.startsWith("?")?a:"?"+a,Sx=a=>!a||a==="#"?"":a.startsWith("#")?a:"#"+a;function Ax(a){return a!=null&&typeof a.status=="number"&&typeof a.statusText=="string"&&typeof a.internal=="boolean"&&"data"in a}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var h0=["POST","PUT","PATCH","DELETE"];new Set(h0);var jx=["GET",...h0];new Set(jx);var vl=g.createContext(null);vl.displayName="DataRouter";var br=g.createContext(null);br.displayName="DataRouterState";g.createContext(!1);var m0=g.createContext({isTransitioning:!1});m0.displayName="ViewTransition";var Nx=g.createContext(new Map);Nx.displayName="Fetchers";var qx=g.createContext(null);qx.displayName="Await";var ln=g.createContext(null);ln.displayName="Navigation";var Rs=g.createContext(null);Rs.displayName="Location";var _n=g.createContext({outlet:null,matches:[],isDataRoute:!1});_n.displayName="Route";var Cu=g.createContext(null);Cu.displayName="RouteError";function Ex(a,{relative:s}={}){Ye(Ms(),"useHref() may be used only in the context of a component.");let{basename:i,navigator:r}=g.useContext(ln),{hash:f,pathname:d,search:p}=_s(a,{relative:s}),m=d;return i!=="/"&&(m=d==="/"?i:Tn([i,d])),r.createHref({pathname:m,search:p,hash:f})}function Ms(){return g.useContext(Rs)!=null}function Ta(){return Ye(Ms(),"useLocation() may be used only in the context of a component."),g.useContext(Rs).location}var p0="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function g0(a){g.useContext(ln).static||g.useLayoutEffect(a)}function wx(){let{isDataRoute:a}=g.useContext(_n);return a?Hx():Cx()}function Cx(){Ye(Ms(),"useNavigate() may be used only in the context of a component.");let a=g.useContext(vl),{basename:s,navigator:i}=g.useContext(ln),{matches:r}=g.useContext(_n),{pathname:f}=Ta(),d=JSON.stringify(f0(r)),p=g.useRef(!1);return g0(()=>{p.current=!0}),g.useCallback((y,v={})=>{if(Wt(p.current,p0),!p.current)return;if(typeof y=="number"){i.go(y);return}let S=d0(y,JSON.parse(d),f,v.relative==="path");a==null&&s!=="/"&&(S.pathname=S.pathname==="/"?s:Tn([s,S.pathname])),(v.replace?i.replace:i.push)(S,v.state,v)},[s,i,d,f,a])}g.createContext(null);function _s(a,{relative:s}={}){let{matches:i}=g.useContext(_n),{pathname:r}=Ta(),f=JSON.stringify(f0(i));return g.useMemo(()=>d0(a,JSON.parse(f),r,s==="path"),[a,f,r,s])}function Tx(a,s){return y0(a,s)}function y0(a,s,i,r,f){Ye(Ms(),"useRoutes() may be used only in the context of a component.");let{navigator:d}=g.useContext(ln),{matches:p}=g.useContext(_n),m=p[p.length-1],y=m?m.params:{},v=m?m.pathname:"/",S=m?m.pathnameBase:"/",b=m&&m.route;{let w=b&&b.path||"";v0(v,!b||w.endsWith("*")||w.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${v}" (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 M=Ta(),N;if(s){let w=typeof s=="string"?yl(s):s;Ye(S==="/"||w.pathname?.startsWith(S),`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 "${S}" but pathname "${w.pathname}" was given in the \`location\` prop.`),N=w}else N=M;let j=N.pathname||"/",T=j;if(S!=="/"){let w=S.replace(/^\//,"").split("/");T="/"+j.replace(/^\//,"").split("/").slice(w.length).join("/")}let A=o0(a,{pathname:T});Wt(b||A!=null,`No routes matched location "${N.pathname}${N.search}${N.hash}" `),Wt(A==null||A[A.length-1].route.element!==void 0||A[A.length-1].route.Component!==void 0||A[A.length-1].route.lazy!==void 0,`Matched leaf route at location "${N.pathname}${N.search}${N.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 E=Ox(A&&A.map(w=>Object.assign({},w,{params:Object.assign({},y,w.params),pathname:Tn([S,d.encodeLocation?d.encodeLocation(w.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:w.pathname]),pathnameBase:w.pathnameBase==="/"?S:Tn([S,d.encodeLocation?d.encodeLocation(w.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:w.pathnameBase])})),p,i,r,f);return s&&E?g.createElement(Rs.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...N},navigationType:"POP"}},E):E}function Rx(){let a=Ux(),s=Ax(a)?`${a.status} ${a.statusText}`:a instanceof Error?a.message:JSON.stringify(a),i=a instanceof Error?a.stack:null,r="rgba(200,200,200, 0.5)",f={padding:"0.5rem",backgroundColor:r},d={padding:"2px 4px",backgroundColor:r},p=null;return console.error("Error handled by React Router default ErrorBoundary:",a),p=g.createElement(g.Fragment,null,g.createElement("p",null,"💿 Hey developer 👋"),g.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",g.createElement("code",{style:d},"ErrorBoundary")," or"," ",g.createElement("code",{style:d},"errorElement")," prop on your route.")),g.createElement(g.Fragment,null,g.createElement("h2",null,"Unexpected Application Error!"),g.createElement("h3",{style:{fontStyle:"italic"}},s),i?g.createElement("pre",{style:f},i):null,p)}var Mx=g.createElement(Rx,null),_x=class extends g.Component{constructor(a){super(a),this.state={location:a.location,revalidation:a.revalidation,error:a.error}}static getDerivedStateFromError(a){return{error:a}}static getDerivedStateFromProps(a,s){return s.location!==a.location||s.revalidation!=="idle"&&a.revalidation==="idle"?{error:a.error,location:a.location,revalidation:a.revalidation}:{error:a.error!==void 0?a.error:s.error,location:s.location,revalidation:a.revalidation||s.revalidation}}componentDidCatch(a,s){this.props.onError?this.props.onError(a,s):console.error("React Router caught the following error during render",a)}render(){return this.state.error!==void 0?g.createElement(_n.Provider,{value:this.props.routeContext},g.createElement(Cu.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function kx({routeContext:a,match:s,children:i}){let r=g.useContext(vl);return r&&r.static&&r.staticContext&&(s.route.errorElement||s.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=s.route.id),g.createElement(_n.Provider,{value:a},i)}function Ox(a,s=[],i=null,r=null,f=null){if(a==null){if(!i)return null;if(i.errors)a=i.matches;else if(s.length===0&&!i.initialized&&i.matches.length>0)a=i.matches;else return null}let d=a,p=i?.errors;if(p!=null){let S=d.findIndex(b=>b.route.id&&p?.[b.route.id]!==void 0);Ye(S>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(p).join(",")}`),d=d.slice(0,Math.min(d.length,S+1))}let m=!1,y=-1;if(i)for(let S=0;S=0?d=d.slice(0,y+1):d=[d[0]];break}}}let v=i&&r?(S,b)=>{r(S,{location:i.location,params:i.matches?.[0]?.params??{},errorInfo:b})}:void 0;return d.reduceRight((S,b,M)=>{let N,j=!1,T=null,A=null;i&&(N=p&&b.route.id?p[b.route.id]:void 0,T=b.route.errorElement||Mx,m&&(y<0&&M===0?(v0("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),j=!0,A=null):y===M&&(j=!0,A=b.route.hydrateFallbackElement||null)));let E=s.concat(d.slice(0,M+1)),w=()=>{let O;return N?O=T:j?O=A:b.route.Component?O=g.createElement(b.route.Component,null):b.route.element?O=b.route.element:O=S,g.createElement(kx,{match:b,routeContext:{outlet:S,matches:E,isDataRoute:i!=null},children:O})};return i&&(b.route.ErrorBoundary||b.route.errorElement||M===0)?g.createElement(_x,{location:i.location,revalidation:i.revalidation,component:T,error:N,children:w(),routeContext:{outlet:null,matches:E,isDataRoute:!0},onError:v}):w()},null)}function Tu(a){return`${a} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function Dx(a){let s=g.useContext(vl);return Ye(s,Tu(a)),s}function zx(a){let s=g.useContext(br);return Ye(s,Tu(a)),s}function Bx(a){let s=g.useContext(_n);return Ye(s,Tu(a)),s}function Ru(a){let s=Bx(a),i=s.matches[s.matches.length-1];return Ye(i.route.id,`${a} can only be used on routes that contain a unique "id"`),i.route.id}function Lx(){return Ru("useRouteId")}function Ux(){let a=g.useContext(Cu),s=zx("useRouteError"),i=Ru("useRouteError");return a!==void 0?a:s.errors?.[i]}function Hx(){let{router:a}=Dx("useNavigate"),s=Ru("useNavigate"),i=g.useRef(!1);return g0(()=>{i.current=!0}),g.useCallback(async(f,d={})=>{Wt(i.current,p0),i.current&&(typeof f=="number"?a.navigate(f):await a.navigate(f,{fromRouteId:s,...d}))},[a,s])}var Np={};function v0(a,s,i){!s&&!Np[a]&&(Np[a]=!0,Wt(!1,i))}g.memo(Vx);function Vx({routes:a,future:s,state:i,unstable_onError:r}){return y0(a,void 0,i,r,s)}function rr(a){Ye(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function Yx({basename:a="/",children:s=null,location:i,navigationType:r="POP",navigator:f,static:d=!1}){Ye(!Ms(),"You cannot render a inside another . You should never have more than one in your app.");let p=a.replace(/^\/*/,"/"),m=g.useMemo(()=>({basename:p,navigator:f,static:d,future:{}}),[p,f,d]);typeof i=="string"&&(i=yl(i));let{pathname:y="/",search:v="",hash:S="",state:b=null,key:M="default"}=i,N=g.useMemo(()=>{let j=Mn(y,p);return j==null?null:{location:{pathname:j,search:v,hash:S,state:b,key:M},navigationType:r}},[p,y,v,S,b,M,r]);return Wt(N!=null,` is not able to match the URL "${y}${v}${S}" because it does not start with the basename, so the won't render anything.`),N==null?null:g.createElement(ln.Provider,{value:m},g.createElement(Rs.Provider,{children:s,value:N}))}function Gx({children:a,location:s}){return Tx(hu(a),s)}function hu(a,s=[]){let i=[];return g.Children.forEach(a,(r,f)=>{if(!g.isValidElement(r))return;let d=[...s,f];if(r.type===g.Fragment){i.push.apply(i,hu(r.props.children,d));return}Ye(r.type===rr,`[${typeof r.type=="string"?r.type:r.type.name}] is not a component. All component children of must be a or `),Ye(!r.props.index||!r.props.children,"An index route cannot have child routes.");let p={id:r.props.id||d.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,middleware:r.props.middleware,loader:r.props.loader,action:r.props.action,hydrateFallbackElement:r.props.hydrateFallbackElement,HydrateFallback:r.props.HydrateFallback,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.hasErrorBoundary===!0||r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(p.children=hu(r.props.children,d)),i.push(p)}),i}var or="get",cr="application/x-www-form-urlencoded";function Sr(a){return a!=null&&typeof a.tagName=="string"}function Qx(a){return Sr(a)&&a.tagName.toLowerCase()==="button"}function Xx(a){return Sr(a)&&a.tagName.toLowerCase()==="form"}function $x(a){return Sr(a)&&a.tagName.toLowerCase()==="input"}function Kx(a){return!!(a.metaKey||a.altKey||a.ctrlKey||a.shiftKey)}function Zx(a,s){return a.button===0&&(!s||s==="_self")&&!Kx(a)}var Pi=null;function Jx(){if(Pi===null)try{new FormData(document.createElement("form"),0),Pi=!1}catch{Pi=!0}return Pi}var Fx=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Zc(a){return a!=null&&!Fx.has(a)?(Wt(!1,`"${a}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${cr}"`),null):a}function Wx(a,s){let i,r,f,d,p;if(Xx(a)){let m=a.getAttribute("action");r=m?Mn(m,s):null,i=a.getAttribute("method")||or,f=Zc(a.getAttribute("enctype"))||cr,d=new FormData(a)}else if(Qx(a)||$x(a)&&(a.type==="submit"||a.type==="image")){let m=a.form;if(m==null)throw new Error('Cannot submit a diff --git a/webui/src/components/ControlSummary.jsx b/webui/src/components/ControlSummary.jsx index 51fd8c00..6353ebb1 100644 --- a/webui/src/components/ControlSummary.jsx +++ b/webui/src/components/ControlSummary.jsx @@ -56,13 +56,13 @@ export default function ControlSummary() { return (
-
+
-
+
@@ -134,12 +134,12 @@ export function InlineCameraTilt({ keymap }) { onTouchEnd={commitSlider} onPointerUp={commitSlider} /> -
- +
+ {downLabel ? : null} {formatDegrees(min)} - + {formatDegrees(max)} {upLabel ? : null} diff --git a/webui/src/components/DiscordInviteButton.jsx b/webui/src/components/DiscordInviteButton.jsx index 11c2874d..49cb67c9 100644 --- a/webui/src/components/DiscordInviteButton.jsx +++ b/webui/src/components/DiscordInviteButton.jsx @@ -12,12 +12,12 @@ export default function DiscordInviteButton({ text = "Join our Discord!", classN href={discordInvite} target="_blank" rel="noopener noreferrer" - className={`inline-flex items-center w-full px-0.5 py-0.5 text-sm font-medium text-white rainbow-animate-bg transition justify-center ${className}`} + className={`inline-flex items-center w-full px-0.5 py-0.5 text-sm font-medium text-white rainbow-animate-bg transition justify-center gap-1 ${className}`} // animated rainbow backgound // className="inline-flex items-center px-3 py-2 bg-gradient-to-r from-indigo-500 via-purple-500 to-pink-500 text-white rounded hover:from-indigo-600 hover:via-purple-600 hover:to-pink-600 transition" > - + {text} ); -} +} \ No newline at end of file diff --git a/webui/src/components/DriveDockAction.jsx b/webui/src/components/DriveDockAction.jsx index 99da84d6..f3ec2807 100644 --- a/webui/src/components/DriveDockAction.jsx +++ b/webui/src/components/DriveDockAction.jsx @@ -58,7 +58,7 @@ function DockModal({ instructions, onConfirm, onCancel, pending }) { return (
-
+

Dock Rover

{instructions.summary}

@@ -186,7 +186,7 @@ export default function DriveDockAction({ layout = 'desktop', expand = false, dr disabled={driveDisabled} className={`${baseCardClasses} ${filledHeight} ${ctaTextAndLayout} ${ctaSize} ${emeraldCta}`} > -
+
Start Driving {!isMobile && driveKeyLabel ? : null} @@ -217,7 +217,7 @@ export default function DriveDockAction({ layout = 'desktop', expand = false, dr onClick={handleReturnToDrive} className={`${baseCardClasses} ${filledHeight} ${ctaTextAndLayout} ${ctaSize} ${amberCta}`} > -
+
Docking in Progress {!isMobile ? : null} @@ -299,10 +299,10 @@ function StepList({ steps, tone = 'emerald' }) { {steps.map((step, idx) => (
- {idx + 1}. + {idx + 1}. {step}
- {idx < steps.length - 1 ?
: null} + {idx < steps.length - 1 ?
: null}
))}
diff --git a/webui/src/components/DrivePanel.jsx b/webui/src/components/DrivePanel.jsx index 828b8175..28b8c5fe 100644 --- a/webui/src/components/DrivePanel.jsx +++ b/webui/src/components/DrivePanel.jsx @@ -75,7 +75,7 @@ function ActionCard({ title, description, statuses, tone, onClick, disabled, foo

{title}

{description}

{/* center statuses in button */} -
+
{statuses.map((status) => ( ))}
- {footnote &&

{footnote}

} + {footnote &&

{footnote}

} ); } diff --git a/webui/src/components/DriverVideoPanel.jsx b/webui/src/components/DriverVideoPanel.jsx index 713d85f5..db32868b 100644 --- a/webui/src/components/DriverVideoPanel.jsx +++ b/webui/src/components/DriverVideoPanel.jsx @@ -134,7 +134,7 @@ export default function DriverVideoPanel({layoutFormat = 'desktop'}) {

You are not assigned to a rover.

{/* colored button to visit the spectator page */} -

+

Click here to visit the spectator page. diff --git a/webui/src/components/FullscreenPrompt.jsx b/webui/src/components/FullscreenPrompt.jsx index a87fba1a..ca8071c7 100644 --- a/webui/src/components/FullscreenPrompt.jsx +++ b/webui/src/components/FullscreenPrompt.jsx @@ -5,7 +5,7 @@ export default function FullscreenPrompt({ visible, mode, onEnterFullscreen, onD return (

-
+

Better in fullscreen

{isIOSMode ? (

@@ -18,7 +18,7 @@ export default function FullscreenPrompt({ visible, mode, onEnterFullscreen, onD via the system back or home gesture.

)} -
+
diff --git a/webui/src/components/GamepadMappingSettings.jsx b/webui/src/components/GamepadMappingSettings.jsx index 6dd7981b..152f5327 100644 --- a/webui/src/components/GamepadMappingSettings.jsx +++ b/webui/src/components/GamepadMappingSettings.jsx @@ -55,7 +55,7 @@ function SliderField({ label, description, min, max, step, value, onChange }) { step={step} value={value} onChange={(event) => onChange(Number(event.target.value))} - className="mt-0.5 w-full accent-emerald-400" + className="mt-0 w-full accent-emerald-400" /> ); @@ -187,7 +187,7 @@ export default function GamepadMappingSettings() { : 'Connect a controller to configure.'}

{capture && ( -

Capturing {capture.label}…

+

Capturing {capture.label}…

)}
diff --git a/webui/src/components/RawUserPilePanel.jsx b/webui/src/components/RawUserPilePanel.jsx new file mode 100644 index 00000000..c743dffd --- /dev/null +++ b/webui/src/components/RawUserPilePanel.jsx @@ -0,0 +1,135 @@ +import { useEffect, useMemo, useRef } from 'react'; +import { useSession } from '../context/SessionContext.jsx'; +import { useSettingsNamespace } from '../settings/index.js'; +import { useSocket } from '../context/SocketContext.jsx'; +import NicknameForm from './NicknameForm.jsx'; +import DiscordInviteButton from './DiscordInviteButton.jsx'; +import KoFiButton from './KoFiButton.jsx'; + +function roleColors(role) { + switch (role) { + case 'admin': + case 'lockdown': + case 'lockdown-admin': + return 'text-amber-300'; + case 'spectator': + return 'text-slate-400'; + default: + return 'text-sky-300'; + } +} + +function formatLabel(user, selfId) { + if (!user) return ''; + const base = user.nickname || user.socketId?.slice(0, 6) || 'unknown'; + if (user.socketId && user.socketId === selfId) { + return `${base} (you)`; + } + return base; +} + +export default function RawUserPilePanel({ + hideNicknameForm = false, + hideHeader = false, + className = '', + fillHeight = false, + compact = false, +}) { + const { session, setNickname } = useSession(); + const { value } = useSettingsNamespace('profile', { nickname: '' }); + const lastSyncedSocketRef = useRef(null); + const socket = useSocket(); + const canSetNickname = session?.role !== 'spectator'; + const users = session?.users ?? []; + const selfId = session?.socketId || null; + + useEffect(() => { + if (!canSetNickname) return; + if (!session?.socketId) return; + const nicknameInput = value.nickname || ''; + if (!nicknameInput) return; + if (session.socketId === lastSyncedSocketRef.current) return; + const currentId = session.socketId; + setNickname(nicknameInput).then(() => { + lastSyncedSocketRef.current = currentId; + }).catch(() => {}); + }, [canSetNickname, session?.socketId, setNickname, value.nickname]); + + useEffect(() => { + if (!socket) return undefined; + const handleConnect = () => { + if (!canSetNickname) return; + const nick = (value.nickname || '').trim(); + if (!nick) return; + setNickname(nick).then(() => { + lastSyncedSocketRef.current = session?.socketId || null; + }).catch(() => {}); + }; + socket.on('connect', handleConnect); + return () => socket.off('connect', handleConnect); + }, [canSetNickname, setNickname, socket, value.nickname, session?.socketId]); + + const sorted = useMemo( + () => + [...users].sort((a, b) => { + if (a.socketId === selfId) return -1; + if (b.socketId === selfId) return 1; + return (a.nickname || '').localeCompare(b.nickname || ''); + }), + [selfId, users], + ); + + const baseListClass = fillHeight + ? 'flex-1 min-h-0 overflow-y-auto' + : compact + ? 'h-28 overflow-y-auto' + : 'h-48 overflow-y-auto'; + + return ( +
+ {!hideNicknameForm && ( +
+
+
+
+ +
+
+
+ + +
+
+ {!canSetNickname &&

Spectators cannot set nicknames.

} +
+ )} + +
+ {!hideHeader && ( +
+ Users + {sorted.length} +
+ )} +
+ {sorted.length === 0 ? ( +

Waiting for users…

+ ) : ( + sorted.map((user) => ( + + {formatLabel(user, selfId)} + + )) + )} +
+
+
+ ); +} diff --git a/webui/src/components/ReplaySourcesPanel.jsx b/webui/src/components/ReplaySourcesPanel.jsx index e5b43768..4aeac1a5 100644 --- a/webui/src/components/ReplaySourcesPanel.jsx +++ b/webui/src/components/ReplaySourcesPanel.jsx @@ -113,7 +113,7 @@ export default function ReplaySourcesPanel({ panelId = 'replay-sources', fillHei
-
+
+ ) : null} + + ); + })} + + )} +
+ ); +} diff --git a/webui/src/components/RoverRoster.jsx b/webui/src/components/RoverRoster.jsx index ac7733ec..930536f2 100644 --- a/webui/src/components/RoverRoster.jsx +++ b/webui/src/components/RoverRoster.jsx @@ -38,7 +38,7 @@ export default function RoverRoster({ >

{rover.name}

-

+

{rover.locked ? 'locked' : 'free'} {rover.lockReason && {rover.lockReason}} diff --git a/webui/src/components/Tabs.jsx b/webui/src/components/Tabs.jsx index 1dabfdd7..5052de7d 100644 --- a/webui/src/components/Tabs.jsx +++ b/webui/src/components/Tabs.jsx @@ -118,7 +118,7 @@ export function Tab({ id, children, className = '', disabled = false }) { } export function TabPanels({ children, className = '' }) { - return

{children}
; + return
{children}
; } export function TabPanel({ id, children, keepMounted = false }) { diff --git a/webui/src/components/TelemetryPanel.jsx b/webui/src/components/TelemetryPanel.jsx index 73bd99ae..aa8d4049 100644 --- a/webui/src/components/TelemetryPanel.jsx +++ b/webui/src/components/TelemetryPanel.jsx @@ -173,7 +173,7 @@ function DetailCard({ title, children }) { function ValueRow({ label, value }) { return ( -
+
{label} {value}
@@ -212,16 +212,16 @@ function DockMiniStatus({ sensors }) { ); return ( -
-
+
+
L {badge(left)}
-
+
O {badge(omni)}
-
+
R {badge(right)}
diff --git a/webui/src/components/UserListPanel.jsx b/webui/src/components/UserListPanel.jsx index 99025265..20a9334c 100644 --- a/webui/src/components/UserListPanel.jsx +++ b/webui/src/components/UserListPanel.jsx @@ -9,7 +9,7 @@ import KoFiButton from './KoFiButton.jsx'; export function NicknameEntryPanel({ compact = false }) { return (
-
+
@@ -155,7 +155,7 @@ export default function UserListPanel({ return (

{formatLabel(user, selfId)}

{user.roverId ? ( @@ -181,7 +181,7 @@ export default function UserListPanel({
-
+
@@ -230,7 +230,7 @@ export default function UserListPanel({
)} {showQueuesSection ? ( -
+
{Object.keys(turnQueues || {}).length === 0 ? (

No turn queues yet.

) : ( @@ -247,8 +247,8 @@ export default function UserListPanel({ : queue[0] : null; return ( -
-
+
+

{rosterName(roverId)}

{remaining != null && ( @@ -259,7 +259,7 @@ export default function UserListPanel({ {queue.length === 0 ? (

No drivers queued.

) : ( -
+
{queue.map((socketId, idx) => { const user = lookupUser(socketId); const isCurrent = socketId === currentId; @@ -297,18 +297,18 @@ export default function UserListPanel({ ) : null} {showUsersSection ? ( -
+
{renderUserList()}
) : null} {showUsersSecondary ? ( -
+
Users {sorted.length}
-
{renderUserList()}
+
{renderUserList()}
) : null}
diff --git a/webui/src/components/VideoTile.jsx b/webui/src/components/VideoTile.jsx index 56697751..ea1fc149 100644 --- a/webui/src/components/VideoTile.jsx +++ b/webui/src/components/VideoTile.jsx @@ -433,7 +433,7 @@ export default function VideoTile({ }`} >
{qualityNotice}
-
+
@@ -441,7 +441,7 @@ export default function VideoTile({ ) : null}
{!showVerticalBattery && ( -
+
@@ -484,7 +484,7 @@ function BatteryBarVertical({ visual }) { style={{ height: `${visual.percentDisplay}%` }} />
- {percentText} + {percentText}
); } @@ -510,7 +510,7 @@ function LightBumpBars({ sensors }) { const barHeight = 12; return ( -
+
{values.map((v, idx) => { const t = eased(v); const dir = idx < segments / 2 ? -1 : 1; // left bars fill left, right bars fill right @@ -600,15 +600,15 @@ function HudOverlay({ return (
-
+
Status: {status} {audioStatus ? Audio: {audioStatus} : null}
-
+
Telemetry @@ -639,7 +639,7 @@ function HudOverlay({
{label || 'Unnamed Rover'} {driverLabel ? • {driverLabel} : null} @@ -652,7 +652,7 @@ function HudOverlay({ return (
-
+
Status: {status} {audioStatus ? Audio: {audioStatus} : null}
@@ -700,7 +700,7 @@ function TurnCueOverlay({ const showCountdown = isActiveDriver && typeof idleSkipSeconds === 'number'; return (
-
+
IT IS YOUR TURN!
Start driving!
{showCountdown ? ( @@ -732,7 +732,7 @@ function OvercurrentOverlay({ motors, compact = false }) { >
OVERCURRENT
-
{labels.join(', ')}
+
{labels.join(', ')}
); @@ -796,7 +796,7 @@ function HudChatInput({ compact = false }) { return { speak: true, engine, voice }; }, [ttsSettings?.engine, ttsSettings?.pitch, ttsSettings?.voice, ttsSupported]); const containerClass = compact - ? 'pointer-events-auto absolute bottom-0.5 right-0.5 flex w-[9rem] max-w-[70vw] items-center gap-0.25 rounded bg-black/70 px-0.4 py-0.2' + ? 'pointer-events-auto absolute bottom-0.5 right-0.5 flex w-[9rem] max-w-[70vw] items-center gap-0.5 rounded bg-black/70 px-0.4 py-0.2' : 'pointer-events-auto absolute bottom-1 right-1 flex w-[12rem] max-w-[70vw] items-center gap-0.5 rounded bg-black/70 px-0.5 py-0.25'; const inputClass = compact ? 'min-w-0 flex-1 bg-transparent text-[0.55rem] text-slate-100 placeholder:text-slate-400 focus:outline-none' diff --git a/webui/src/components/controls/DriveModeToggle.jsx b/webui/src/components/controls/DriveModeToggle.jsx index b945fd8b..42eff718 100644 --- a/webui/src/components/controls/DriveModeToggle.jsx +++ b/webui/src/components/controls/DriveModeToggle.jsx @@ -46,7 +46,7 @@ export default function DriveModeToggle({ size = 'default' }) { {currentLabel}
-
+