feat(ui): integrate official shadcn/ui + Radix primitives + cmdk + cva in src/components/ui
This commit is contained in:
1 parent
cbc47336d6
commit
07d2050c5f
21 files changed
+1590
-455
No files matched your search
-154
@@ -1,154 +0,0 @@
|
||||
(function(){const O=document.createElement("link").relList;if(O&&O.supports&&O.supports("modulepreload"))return;for(const E of document.querySelectorAll('link[rel="modulepreload"]'))d(E);new MutationObserver(E=>{for(const H of E)if(H.type==="childList")for(const J of H.addedNodes)J.tagName==="LINK"&&J.rel==="modulepreload"&&d(J)}).observe(document,{childList:!0,subtree:!0});function T(E){const H={};return E.integrity&&(H.integrity=E.integrity),E.referrerPolicy&&(H.referrerPolicy=E.referrerPolicy),E.crossOrigin==="use-credentials"?H.credentials="include":E.crossOrigin==="anonymous"?H.credentials="omit":H.credentials="same-origin",H}function d(E){if(E.ep)return;E.ep=!0;const H=T(E);fetch(E.href,H)}})();function g0(x){return x&&x.__esModule&&Object.prototype.hasOwnProperty.call(x,"default")?x.default:x}var Ts={exports:{}},nn={};/**
|
||||
* @license React
|
||||
* react-jsx-runtime.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var u0;function pv(){if(u0)return nn;u0=1;var x=Symbol.for("react.transitional.element"),O=Symbol.for("react.fragment");function T(d,E,H){var J=null;if(H!==void 0&&(J=""+H),E.key!==void 0&&(J=""+E.key),"key"in E){H={};for(var K in E)K!=="key"&&(H[K]=E[K])}else H=E;return E=H.ref,{$$typeof:x,type:d,key:J,ref:E!==void 0?E:null,props:H}}return nn.Fragment=O,nn.jsx=T,nn.jsxs=T,nn}var n0;function Nv(){return n0||(n0=1,Ts.exports=pv()),Ts.exports}var f=Nv(),_s={exports:{}},V={};/**
|
||||
* @license React
|
||||
* react.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var c0;function Tv(){if(c0)return V;c0=1;var x=Symbol.for("react.transitional.element"),O=Symbol.for("react.portal"),T=Symbol.for("react.fragment"),d=Symbol.for("react.strict_mode"),E=Symbol.for("react.profiler"),H=Symbol.for("react.consumer"),J=Symbol.for("react.context"),K=Symbol.for("react.forward_ref"),Q=Symbol.for("react.suspense"),W=Symbol.for("react.memo"),A=Symbol.for("react.lazy"),S=Symbol.for("react.activity"),D=Symbol.for("react.view_transition"),w=Symbol.iterator;function U(r){return r===null||typeof r!="object"?null:(r=w&&r[w]||r["@@iterator"],typeof r=="function"?r:null)}var vl={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},P=Object.assign,jl={};function Bl(r,_,B){this.props=r,this.context=_,this.refs=jl,this.updater=B||vl}Bl.prototype.isReactComponent={},Bl.prototype.setState=function(r,_){if(typeof r!="object"&&typeof r!="function"&&r!=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,r,_,"setState")},Bl.prototype.forceUpdate=function(r){this.updater.enqueueForceUpdate(this,r,"forceUpdate")};function I(){}I.prototype=Bl.prototype;function il(r,_,B){this.props=r,this.context=_,this.refs=jl,this.updater=B||vl}var Il=il.prototype=new I;Il.constructor=il,P(Il,Bl.prototype),Il.isPureReactComponent=!0;var Pl=Array.isArray;function ll(){}var ol={H:null,A:null,T:null,S:null},Qt=Object.prototype.hasOwnProperty;function Tt(r,_,B){var q=B.ref;return{$$typeof:x,type:r,key:_,ref:q!==void 0?q:null,props:B}}function _t(r,_){return Tt(r.type,_,r.props)}function rt(r){return typeof r=="object"&&r!==null&&r.$$typeof===x}function be(r){var _={"=":"=0",":":"=2"};return"$"+r.replace(/[=:]/g,function(B){return _[B]})}var $e=/\/+/g;function ql(r,_){return typeof r=="object"&&r!==null&&r.key!=null?be(""+r.key):_.toString(36)}function j(r){switch(r.status){case"fulfilled":return r.value;case"rejected":throw r.reason;default:switch(typeof r.status=="string"?r.then(ll,ll):(r.status="pending",r.then(function(_){r.status==="pending"&&(r.status="fulfilled",r.value=_)},function(_){r.status==="pending"&&(r.status="rejected",r.reason=_)})),r.status){case"fulfilled":return r.value;case"rejected":throw r.reason}}throw r}function X(r,_,B,q,cl){var fl=typeof r;(fl==="undefined"||fl==="boolean")&&(r=null);var rl=!1;if(r===null)rl=!0;else switch(fl){case"bigint":case"string":case"number":rl=!0;break;case"object":switch(r.$$typeof){case x:case O:rl=!0;break;case A:return rl=r._init,X(rl(r._payload),_,B,q,cl)}}if(rl)return cl=cl(r),rl=q===""?"."+ql(r,0):q,Pl(cl)?(B="",rl!=null&&(B=rl.replace($e,"$&/")+"/"),X(cl,_,B,"",function(ee){return ee})):cl!=null&&(rt(cl)&&(cl=_t(cl,B+(cl.key==null||r&&r.key===cl.key?"":(""+cl.key).replace($e,"$&/")+"/")+rl)),_.push(cl)),1;rl=0;var R=q===""?".":q+":";if(Pl(r))for(var Z=0;Z<r.length;Z++)q=r[Z],fl=R+ql(q,Z),rl+=X(q,_,B,fl,cl);else if(Z=U(r),typeof Z=="function")for(r=Z.call(r),Z=0;!(q=r.next()).done;)q=q.value,fl=R+ql(q,Z++),rl+=X(q,_,B,fl,cl);else if(fl==="object"){if(typeof r.then=="function")return X(j(r),_,B,q,cl);throw _=String(r),Error("Objects are not valid as a React child (found: "+(_==="[object Object]"?"object with keys {"+Object.keys(r).join(", ")+"}":_)+"). If you meant to render a collection of children, use an array instead.")}return rl}function L(r,_,B){if(r==null)return r;var q=[],cl=0;return X(r,q,"","",function(fl){return _.call(B,fl,cl++)}),q}function pl(r){if(r._status===-1){var _=r._result,B=_();B.then(function(q){(r._status===0||r._status===-1)&&(r._status=1,r._result=q,B.status===void 0&&(B.status="fulfilled",B.value=q))},function(q){(r._status===0||r._status===-1)&&(r._status=2,r._result=q,B.status===void 0&&(B.status="rejected",B.reason=q))}),r._status===-1&&(r._status=0,r._result=B)}if(r._status===1)return r._result.default;throw r._result}var ml=typeof reportError=="function"?reportError:function(r){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var _=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof r=="object"&&r!==null&&typeof r.message=="string"?String(r.message):String(r),error:r});if(!window.dispatchEvent(_))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",r);return}console.error(r)};function Rt(r){var _=ol.T,B={};B.types=_!==null?_.types:null,ol.T=B;try{var q=r(),cl=ol.S;cl!==null&&cl(B,q),typeof q=="object"&&q!==null&&typeof q.then=="function"&&q.then(ll,ml)}catch(fl){ml(fl)}finally{_!==null&&B.types!==null&&(_.types=B.types),ol.T=_}}function te(r){var _=ol.T;if(_!==null){var B=_.types;B===null?_.types=[r]:B.indexOf(r)===-1&&B.push(r)}else Rt(te.bind(null,r))}var We={map:L,forEach:function(r,_,B){L(r,function(){_.apply(this,arguments)},B)},count:function(r){var _=0;return L(r,function(){_++}),_},toArray:function(r){return L(r,function(_){return _})||[]},only:function(r){if(!rLine truncated
|
||||
* @license React
|
||||
* scheduler.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var f0;function _v(){return f0||(f0=1,(function(x){function O(j,X){var L=j.length;j.push(X);l:for(;0<L;){var pl=L-1>>>1,ml=j[pl];if(0<E(ml,X))j[pl]=X,j[L]=ml,L=pl;else break l}}function T(j){return j.length===0?null:j[0]}function d(j){if(j.length===0)return null;var X=j[0],L=j.pop();if(L!==X){j[0]=L;l:for(var pl=0,ml=j.length,Rt=ml>>>1;pl<Rt;){var te=2*(pl+1)-1,We=j[te],r=te+1,_=j[r];if(0>E(We,L))r<ml&&0>E(_,We)?(j[pl]=_,j[r]=L,pl=r):(j[pl]=We,j[te]=L,pl=te);else if(r<ml&&0>E(_,L))j[pl]=_,j[r]=L,pl=r;else break l}}return X}function E(j,X){var L=j.sortIndex-X.sortIndex;return L!==0?L:j.id-X.id}if(x.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var H=performance;x.unstable_now=function(){return H.now()}}else{var J=Date,K=J.now();x.unstable_now=function(){return J.now()-K}}var Q=[],W=[],A=1,S=null,D=3,w=!1,U=!1,vl=!1,P=!1,jl=typeof setTimeout=="function"?setTimeout:null,Bl=typeof clearTimeout=="function"?clearTimeout:null,I=typeof setImmediate<"u"?setImmediate:null;function il(j){for(var X=T(W);X!==null;){if(X.callback===null)d(W);else if(X.startTime<=j)d(W),X.sortIndex=X.expirationTime,O(Q,X);else break;X=T(W)}}function Il(j){if(vl=!1,il(j),!U)if(T(Q)!==null)U=!0,Pl||(Pl=!0,rt());else{var X=T(W);X!==null&&ql(Il,X.startTime-j)}}var Pl=!1,ll=-1,ol=5,Qt=-1;function Tt(){return P?!0:!(x.unstable_now()-Qt<ol)}function _t(){if(P=!1,Pl){var j=x.unstable_now();Qt=j;var X=!0;try{l:{U=!1,vl&&(vl=!1,Bl(ll),ll=-1),w=!0;var L=D;try{t:{for(il(j),S=T(Q);S!==null&&!(S.expirationTime>j&&Tt());){var pl=S.callback;if(typeof pl=="function"){S.callback=null,D=S.priorityLevel;var ml=pl(S.expirationTime<=j);if(j=x.unstable_now(),typeof ml=="function"){S.callback=ml,il(j),X=!0;break t}S===T(Q)&&d(Q),il(j)}else d(Q);S=T(Q)}if(S!==null)X=!0;else{var Rt=T(W);Rt!==null&&ql(Il,Rt.startTime-j),X=!1}}break l}finally{S=null,D=L,w=!1}X=void 0}}finally{X?rt():Pl=!1}}}var rt;if(typeof I=="function")rt=function(){I(_t)};else if(typeof MessageChannel<"u"){var be=new MessageChannel,$e=be.port2;be.port1.onmessage=_t,rt=function(){$e.postMessage(null)}}else rt=function(){jl(_t,0)};function ql(j,X){ll=jl(function(){j(x.unstable_now())},X)}x.unstable_IdlePriority=5,x.unstable_ImmediatePriority=1,x.unstable_LowPriority=4,x.unstable_NormalPriority=3,x.unstable_Profiling=null,x.unstable_UserBlockingPriority=2,x.unstable_cancelCallback=function(j){j.callback=null},x.unstable_forceFrameRate=function(j){0>j||125<j?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):ol=0<j?Math.floor(1e3/j):5},x.unstable_getCurrentPriorityLevel=function(){return D},x.unstable_next=function(j){switch(D){case 1:case 2:case 3:var X=3;break;default:X=D}var L=D;D=X;try{return j()}finally{D=L}},x.unstable_requestPaint=function(){P=!0},x.unstable_runWithPriority=function(j,X){switch(j){case 1:case 2:case 3:case 4:case 5:break;default:j=3}var L=D;D=j;try{return X()}finally{D=L}},x.unstable_scheduleCallback=function(j,X,L){var pl=x.unstable_now();switch(typeof L=="object"&&L!==null?(L=L.delay,L=typeof L=="number"&&0<L?pl+L:pl):L=pl,j){case 1:var ml=-1;break;case 2:ml=250;break;case 5:ml=1073741823;break;case 4:ml=1e4;break;default:ml=5e3}return ml=L+ml,j={id:A++,callback:X,priorityLevel:j,startTime:L,expirationTime:ml,sortIndex:-1},L>pl?(j.sortIndex=L,O(W,j),T(Q)===null&&j===T(W)&&(vl?(Bl(ll),ll=-1):vl=!0,ql(Il,L-pl))):(j.sortIndex=ml,O(Q,j),U||w||(U=!0,Pl||(Pl=!0,rt()))),j},x.unstable_shouldYield=Tt,x.unstable_wrapCallback=function(j){var X=D;return function(){var L=D;D=X;try{return j.apply(this,arguments)}finally{D=L}}}})(Os)),Os}var s0;function Ev(){return s0||(s0=1,zs.exports=_v()),zs.exports}var js={exports:{}},Wl={};/**
|
||||
* @license React
|
||||
* react-dom.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var o0;function zv(){if(o0)return Wl;o0=1;var x=As();function O(A){var S="https://react.dev/errors/"+A;if(1<arguments.length){S+="?args[]="+encodeURIComponent(arguments[1]);for(var D=2;D<arguments.length;D++)S+="&args[]="+encodeURIComponent(arguments[D])}return"Minified React error #"+A+"; visit "+S+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function T(){}var d={d:{f:T,r:function(){throw Error(O(522))},D:T,C:T,L:T,m:T,X:T,S:T,M:T},p:0,findDOMNode:null},E=Symbol.for("react.portal"),H=Symbol.for("react.recoverable"),J=Symbol.for("react.optimistic_key");function K(A,S,D){var w=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:E,key:w==null?null:w===J?J:""+w,children:A,containerInfo:S,implementation:D}}var Q=x.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function W(A,S){if(A==="font")return"";if(typeof S=="string")return S==="use-credentials"?S:""}return Wl.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=d,Wl.browser=function(A){return{$$typeof:H,_reason:A}},Wl.createPortal=function(A,S){var D=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!S||S.nodeType!==1&&S.nodeType!==9&&S.nodeType!==11)throw Error(O(299));return K(A,S,null,D)},Wl.flushSync=function(A){var S=Q.T,D=d.p;try{if(Q.T=null,d.p=2,A)return A()}finally{Q.T=S,d.p=D,d.d.f()}},Wl.preconnect=function(A,S){typeof A=="string"&&(S?(S=S.crossOrigin,S=typeof S=="string"?S==="use-credentials"?S:"":void 0):S=null,d.d.C(A,S))},Wl.prefetchDNS=function(A){typeof A=="string"&&d.d.D(A)},Wl.preinit=function(A,S){if(typeof A=="string"&&S&&typeof S.as=="string"){var D=S.as,w=W(D,S.crossOrigin),U=typeof S.integrity=="string"?S.integrity:void 0,vl=typeof S.fetchPriority=="string"?S.fetchPriority:void 0;D==="style"?d.d.S(A,typeof S.precedence=="string"?S.precedence:void 0,{crossOrigin:w,integrity:U,fetchPriority:vl}):D==="script"&&d.d.X(A,{crossOrigin:w,integrity:U,fetchPriority:vl,nonce:typeof S.nonce=="string"?S.nonce:void 0})}},Wl.preinitModule=function(A,S){if(typeof A=="string")if(typeof S=="object"&&S!==null){if(S.as==null||S.as==="script"){var D=W(S.as,S.crossOrigin);d.d.M(A,{crossOrigin:D,integrity:typeof S.integrity=="string"?S.integrity:void 0,nonce:typeof S.nonce=="string"?S.nonce:void 0,fetchPriority:typeof S.fetchPriority=="string"?S.fetchPriority:void 0})}}else S==null&&d.d.M(A)},Wl.preload=function(A,S){if(typeof A=="string"&&typeof S=="object"&&S!==null&&typeof S.as=="string"){var D=S.as,w=W(D,S.crossOrigin);d.d.L(A,D,{crossOrigin:w,integrity:typeof S.integrity=="string"?S.integrity:void 0,nonce:typeof S.nonce=="string"?S.nonce:void 0,type:typeof S.type=="string"?S.type:void 0,fetchPriority:typeof S.fetchPriority=="string"?S.fetchPriority:void 0,referrerPolicy:typeof S.referrerPolicy=="string"?S.referrerPolicy:void 0,imageSrcSet:typeof S.imageSrcSet=="string"?S.imageSrcSet:void 0,imageSizes:typeof S.imageSizes=="string"?S.imageSizes:void 0,media:typeof S.media=="string"?S.media:void 0})}},Wl.preloadModule=function(A,S){if(typeof A=="string")if(S){var D=W(S.as,S.crossOrigin);d.d.m(A,{as:typeof S.as=="string"&&S.as!=="script"?S.as:void 0,crossOrigin:D,integrity:typeof S.integrity=="string"?S.integrity:void 0,nonce:typeof S.nonce=="string"?S.nonce:void 0,fetchPriority:typeof S.fetchPriority=="string"?S.fetchPriority:void 0})}else d.d.m(A)},Wl.requestFormReset=function(A){d.d.r(A)},Wl.unstable_batchedUpdates=function(A,S){return A(S)},Wl.useFormState=function(A,S,D){return Q.H.useFormState(A,S,D)},Wl.useFormStatus=function(){return Q.H.useHostTransitionStatus()},Wl.version="19.3.1",Wl}var r0;function Ov(){if(r0)return js.exports;r0=1;function x(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(x)}catch(O){console.error(O)}}return x(),js.exports=zv(),js.exports}/**
|
||||
* @license React
|
||||
* react-dom-client.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var d0;function jv(){if(d0)return cn;d0=1;var x=Ev(),O=As(),T=Ov();function d(l){var t="https://react.dev/errors/"+l;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var e=2;e<arguments.length;e++)t+="&args[]="+encodeURIComponent(arguments[e])}return"Minified React error #"+l+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function E(l){return!(!l||l.nodeType!==1&&l.nodeType!==9&&l.nodeType!==11)}function H(l){for(var t=l,e=t;e&&!e.alternate;)t=e,(t.flags&4098)!==0&&(l=t.return),e=t.return;for(;t.return;)t=t.return;return t.tag===3?l:null}function J(l){if(l.tag===13){var t=l.memoizedState;if(t===null&&(l=l.alternate,l!==null&&(t=l.memoizedState)),t!==null)return t.dehydrated}return null}function K(l){if(l.tag===31){var t=l.memoizedState;if(t===null&&(l=l.alternate,l!==null&&(t=l.memoizedState)),t!==null)return t.dehydrated}return null}function Q(l){if(H(l)!==l)throw Error(d(188))}function W(l){var t=l.alternate;if(!t){if(t=H(l),t===null)throw Error(d(188));return t!==l?null:l}for(var e=l,a=t;;){var u=e.return;if(u===null)break;var n=u.alternate;if(n===null){if(a=u.return,a!==null){e=a;continue}break}if(u.child===n.child){for(n=u.child;n;){if(n===e)return Q(u),l;if(n===a)return Q(u),t;n=n.sibling}throw Error(d(188))}if(e.return!==a.return)e=u,a=n;else{for(var c=!1,i=u.child;i;){if(i===e){c=!0,e=u,a=n;break}if(i===a){c=!0,a=u,e=n;break}i=i.sibling}if(!c){for(i=n.child;i;){if(i===e){c=!0,e=n,a=u;break}if(i===a){c=!0,a=n,e=u;break}i=i.sibling}if(!c)throw Error(d(189))}}if(e.alternate!==a)throw Error(d(190))}if(e.tag!==3)throw Error(d(188));return e.stateNode.current===e?l:t}function A(l){var t=l.tag;if(t===5||t===26||t===27||t===6)return l;for(l=l.child;l!==null;){if(t=A(l),t!==null)return t;l=l.sibling}return null}function S(l,t,e,a,u,n){for(;l!==null;){if((l.tag===5||l.tag===27||l.tag===6)&&e(l,a,u,n)||(l.tag!==22||l.memoizedState===null)&&(t||l.tag!==5&&l.tag!==27)&&S(l.child,t,e,a,u,n))return!0;l=l.sibling}return!1}function D(l){for(l=l.return;l!==null;){if(l.tag===3||l.tag===5||l.tag===27)return l;l=l.return}return null}function w(l){var t=!1;for(l=l.return;l!==null&&(l.tag===4&&(t=!0),!(l.tag===3||l.tag===5||l.tag===27));)l=l.return;return t}function U(l){var t=[null,null],e=D(l);return e===null||vl(t,l,e.child,{foundSelf:!1}),t}function vl(l,t,e,a){for(;e!==null;){if(e===t)a.foundSelf=!0;else if(e.tag===5||e.tag===27||e.tag===6){if(a.foundSelf)return l[1]=e,!0;l[0]=e}else if((e.tag!==22||e.memoizedState===null)&&vl(l,t,e.child,a))return!0;e=e.sibling}return!1}function P(l){switch(l.tag){case 5:case 27:case 6:return l.stateNode;case 3:return l.stateNode.containerInfo;default:throw Error(d(559))}}var jl=null,Bl=null;function I(l,t,e){return l===e?!0:l===t?(jl=l,!0):!1}function il(l,t,e){return l===e?(Bl=l,!1):l===t?(Bl!==null&&(jl=l),!0):!1}function Il(l){if(l===null)return null;do l=l===null?null:l.return;while(l&&l.tag!==5&&l.tag!==27&&l.tag!==3);return l||null}function Pl(l,t,e){for(var a=0,u=l;u;u=e(u))a++;u=0;for(var n=t;n;n=e(n))u++;for(;0<a-u;)l=e(l),a--;for(;0<u-a;)t=e(t),u--;for(;a--;){if(l===t||t!==null&&l===t.alternate)return l;l=e(l),t=e(t)}return null}var ll=Object.assign,ol=Symbol.for("react.element"),Qt=Symbol.for("react.transitional.element"),Tt=Symbol.for("react.portal"),_t=Symbol.for("react.fragment"),rt=Symbol.for("react.strict_mode"),be=Symbol.for("react.profiler"),$e=Symbol.for("react.consumer"),ql=Symbol.for("react.context"),j=Symbol.for("react.forward_ref"),X=Symbol.for("react.suspense"),L=Symbol.for("react.suspense_list"),pl=Symbol.for("react.memo"),ml=Symbol.for("react.lazy"),Rt=Symbol.for("react.activity"),te=Symbol.for("react.legacy_hidden"),We=Symbol.for("react.memo_cache_sentinel"),r=Symbol.for("react.view_transition"),_=Symbol.for("react.recoverable"),B=Symbol.iterator;function q(l){return l===null||typeof l!="object"?null:(l=B&&l[B]||l["@@iterator"],typeof l=="function"?l:null)}var cl=Symbol.for("react.client.reference");function fl(l){if(l==null)return null;if(typeof l=="function")return l.$$typeof===cl?null:l.displayName||l.name||null;if(typeof l=="string")return l;switch(l){case _t:return"Fragment";case be:return"Profiler";case rt:return"StrictMode";case X:return"Suspense";case L:return"SuspenseList";case Rt:return"Activity";case r:return"ViewTransition"}if(typeof l=="object")switch(l.$$typeof){case Tt:return"Portal";case ql:return l.displayName||"Context";case $e:return(l._context.displayName||"Context")+".Consumer";case j:var t=l.render;return l=l.displayName,l||(l=t.displayName||t.name||"",l=l!==""?"ForwardRef("+l+")":"ForwardRef"),l;case pl:return t=l.displayName||null,t!==null?t:fl(l.type)||"Memo";case ml:t=l._payload,l=l._init;try{return fl(l(t))}catch{}}return null}var rl=Array.isArray,R=O.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Z=T.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,ee={pending:!1,data:null,method:null,action:nLine truncated
|
||||
at`)?" (<anonymous>)":-1<e.stack.indexOf("@")?"@unknown:0:0":""}return`
|
||||
`+Lc+l+Us}var Zc=!1;function Vc(l,t){if(!l||Zc)return"";Zc=!0;var e=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var a={DetermineComponentFrameRoot:function(){try{if(t){var N=function(){throw Error()};if(Object.defineProperty(N.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(N,[])}catch(z){var m=z}Reflect.construct(l,[],N)}else{try{N.call()}catch(z){m=z}N=!1;try{var g=Object.getOwnPropertyDescriptor(l.prototype,"props");Object.defineProperty(l.prototype,"props",{configurable:!0,set:function(){throw Error()}}),N=!0,new l}finally{N&&(g!==void 0?Object.defineProperty(l.prototype,"props",g):delete l.prototype.props)}}}else{try{throw Error()}catch(z){m=z}(N=l())&&typeof N.catch=="function"&&N.catch(function(){})}}catch(z){if(z&&m&&typeof z.stack=="string")return[z.stack,m.stack]}return[null,null]}};a.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var u=Object.getOwnPropertyDescriptor(a.DetermineComponentFrameRoot,"name");u&&u.configurable&&Object.defineProperty(a.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var n=a.DetermineComponentFrameRoot(),c=n[0],i=n[1];if(c&&i){var s=c.split(`
|
||||
`),v=i.split(`
|
||||
`);for(u=a=0;a<s.length&&!s[a].includes("DetermineComponentFrameRoot");)a++;for(;u<v.length&&!v[u].includes("DetermineComponentFrameRoot");)u++;if(a===s.length||u===v.length)for(a=s.length-1,u=v.length-1;1<=a&&0<=u&&s[a]!==v[u];)u--;for(;1<=a&&0<=u;a--,u--)if(s[a]!==v[u]){if(a!==1||u!==1)do if(a--,u--,0>u||s[a]!==v[u]){var b=`
|
||||
`+s[a].replace(" at new "," at ");return l.displayName&&b.includes("<anonymous>")&&(b=b.replace("<anonymous>",l.displayName)),b}while(1<=a&&0<=u);break}}}finally{Zc=!1,Error.prepareStackTrace=e}return(e=l?l.displayName||l.name:"")?Se(e):""}function E0(l,t){switch(l.tag){case 26:case 27:case 5:return Se(l.type);case 16:return Se("Lazy");case 13:return l.child!==t&&t!==null?Se("Suspense Fallback"):Se("Suspense");case 19:return Se("SuspenseList");case 0:case 15:return Vc(l.type,!1);case 11:return Vc(l.type.render,!1);case 1:return Vc(l.type,!0);case 31:return Se("Activity");case 30:return Se("ViewTransition");default:return""}}function Rs(l){try{var t="",e=null;do t+=E0(l,e),e=l,l=l.return;while(l);return t}catch(a){return`
|
||||
Error generating stack: `+a.message+`
|
||||
`+a.stack}}var Kc=Object.prototype.hasOwnProperty,Jc=x.unstable_scheduleCallback,kc=x.unstable_cancelCallback,z0=x.unstable_shouldYield,O0=x.unstable_requestPaint,dt=x.unstable_now,j0=x.unstable_getCurrentPriorityLevel,Hs=x.unstable_ImmediatePriority,Ys=x.unstable_UserBlockingPriority,rn=x.unstable_NormalPriority,A0=x.unstable_LowPriority,Bs=x.unstable_IdlePriority,C0=x.log,M0=x.unstable_setDisableYieldValue,du=null,mt=null;function pe(l){if(typeof C0=="function"&&M0(l),mt&&typeof mt.setStrictMode=="function")try{mt.setStrictMode(du,l)}catch{}}var ht=Math.clz32?Math.clz32:R0,D0=Math.log,U0=Math.LN2;function R0(l){return l>>>=0,l===0?32:31-(D0(l)/U0|0)|0}var dn=256,mn=262144,hn=4194304;function Fe(l){var t=l&42;if(t!==0)return t;switch(l&-l){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 l&-l;case 262144:case 524288:case 1048576:case 2097152:return l&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return l&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return l}}function vn(l,t,e){var a=l.pendingLanes;if(a===0)return 0;var u=0,n=l.suspendedLanes,c=l.pingedLanes;l=l.warmLanes;var i=a&134217727;return i!==0?(a=i&~n,a!==0?u=Fe(a):(c&=i,c!==0?u=Fe(c):e||(e=i&~l,e!==0&&(u=Fe(e))))):(i=a&~n,i!==0?u=Fe(i):c!==0?u=Fe(c):e||(e=a&~l,e!==0&&(u=Fe(e)))),u===0?0:t!==0&&t!==u&&(t&n)===0&&(n=u&-u,e=t&-t,n>=e||n===32&&(e&4194048)!==0)?t:u}function mu(l,t){return(l.pendingLanes&~(l.suspendedLanes&~l.pingedLanes)&t)===0}function qs(l,t){(t&8)!==0&&(t|=t&32);var e=l.entangledLanes;if(e!==0)for(l=l.entanglements,e&=t;0<e;){var a=31-ht(e),u=1<<a;t|=l[a],e&=~u}return t}function H0(l,t){switch(l){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 ws(){var l=hn;return hn<<=1,(hn&62914560)===0&&(hn=4194304),l}function $c(l){for(var t=[],e=0;31>e;e++)t.push(l);return t}function hu(l,t){l.pendingLanes|=t,t!==268435456&&(l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0)}function Y0(l,t,e,a,u,n){var c=l.pendingLanes;l.pendingLanes=e,l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0,l.expiredLanes&=e,l.entangledLanes&=e,l.errorRecoveryDisabledLanes&=e,l.shellSuspendCounter=0;var i=l.entanglements,s=l.expirationTimes,v=l.hiddenUpdates;for(e=c&~e;0<e;){var b=31-ht(e),N=1<<b;i[b]=0,s[b]=-1;var m=v[b];if(m!==null)for(v[b]=null,b=0;b<m.length;b++){var g=m[b];g!==null&&(g.lane&=-536870913)}e&=~N}a!==0&&Gs(l,a,0),n!==0&&u===0&&l.tag!==0&&(l.suspendedLanes|=n&~(c&~t))}function Gs(l,t,e){l.pendingLanes|=t,l.suspendedLanes&=~t;var a=31-ht(t);l.entangledLanes|=t,l.entanglements[a]=l.entanglements[a]|1073741824|e&261930}function Qs(l,t){var e=l.entangledLanes|=t;for(l=l.entanglements;e;){var a=31-ht(e),u=1<<a;u&t|l[a]&t&&(l[a]|=t),e&=~u}}function Xs(l,t){var e=t&-t;return e=(e&42)!==0?1:Wc(e),(e&(l.suspendedLanes|t))!==0?0:e}function Wc(l){switch(l){case 2:l=1;break;case 8:l=4;break;case 32:l=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:l=128;break;case 268435456:l=134217728;break;default:l=0}return l}function Fc(l){return l&=-l,2<l?8<l?(l&134217727)!==0?32:268435456:8:2}function Ls(){var l=Z.p;return l!==0?l:(l=window.event,l===void 0?32:Fm(l.type))}function Zs(l,t){var e=Z.p;try{return Z.p=l,t()}finally{Z.p=e}}var ae=Math.random().toString(36).slice(2),Zl="__reactFiber$"+ae,nt="__reactProps$"+ae,Na="__reactContainer$"+ae,Vs="__reactEvents$"+ae,B0="__reactListeners$"+ae,q0="__reactHandles$"+ae,Ks="__reactResources$"+ae,vu="__reactMarker$"+ae,yn="__reactLoad$"+ae;function gn(l){delete l[Zl],delete l[nt],delete l[B0],delete l[q0]}function Ie(l){var t;if(t=l[Zl])return t;for(var e=l.parentNode;e;){if(t=e[Na]||e[Zl]){if(e=t.alternate,t.child!==null||e!==null&&e.child!==null)for(l=Mm(l);l!==null;){if(e=l[Zl])return e;l=Mm(l)}return t}l=e,e=l.parentNode}return null}function Ta(l){if(l=l[Zl]||l[Na]){var t=l.tag;if(t===5||t===6||t===13||t===31||t===26||t===27||t===3)return l}return null}function yu(l){var t=l.tag;if(t===5||t===26||t===27||t===6)return l.stateNode;throw Error(d(33))}function _a(l){var t=l[Ks];return t||(t=l[Ks]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function wl(l){l[vu]=!0}function Js(l){l[yn]=void 0}var ks=new Set,$s={};function Pe(l,t){Ea(l,t),Ea(l+"Capture",t)}function
Line truncated
|
||||
`).replace(E1,"")}function rm(l,t){return t=om(t),om(l)===t}function bl(l,t,e,a,u,n){switch(e){case"children":if(typeof a=="string")t==="body"||t==="textarea"&&a===""||Oa(l,a);else if(typeof a=="number"||typeof a=="bigint")t!=="body"&&Oa(l,""+a);else return;break;case"className":xn(l,"class",a);break;case"tabIndex":xn(l,"tabindex",a);break;case"dir":case"role":case"viewBox":case"width":case"height":xn(l,e,a);break;case"style":no(l,a,n);return;case"data":if(t!=="object"){xn(l,"data",a);break}case"src":case"href":if(a===""&&(t!=="a"||e!=="href")){l.removeAttribute(e);break}if(a==null||typeof a=="function"||typeof a=="symbol"||typeof a=="boolean"){l.removeAttribute(e);break}a=Sn(a),l.setAttribute(e,a);break;case"action":case"formAction":if(typeof a=="function"){l.setAttribute(e,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}else typeof n=="function"&&(e==="formAction"?(t!=="input"&&bl(l,t,"name",u.name,u,null),bl(l,t,"formEncType",u.formEncType,u,null),bl(l,t,"formMethod",u.formMethod,u,null),bl(l,t,"formTarget",u.formTarget,u,null)):(bl(l,t,"encType",u.encType,u,null),bl(l,t,"method",u.method,u,null),bl(l,t,"target",u.target,u,null)));if(a==null||typeof a=="symbol"||typeof a=="boolean"){l.removeAttribute(e);break}a=Sn(a),l.setAttribute(e,a);break;case"onClick":a!=null&&(l.onclick=Zt);return;case"onScroll":a!=null&&el("scroll",l);return;case"onScrollEnd":a!=null&&el("scrollend",l);return;case"dangerouslySetInnerHTML":if(a!=null){if(typeof a!="object"||!("__html"in a))throw Error(d(61));if(e=a.__html,e!=null){if(u.children!=null)throw Error(d(60));(n!=null?n.__html:void 0)!==e&&(l.innerHTML=e)}}break;case"multiple":l.multiple=a&&typeof a!="function"&&typeof a!="symbol";break;case"muted":l.muted=a&&typeof a!="function"&&typeof a!="symbol";break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":break;case"autoFocus":break;case"xlinkHref":if(a==null||typeof a=="function"||typeof a=="boolean"||typeof a=="symbol"){l.removeAttribute("xlink:href");break}e=Sn(a),l.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",e);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":a!=null&&typeof a!="function"&&typeof a!="symbol"?l.setAttribute(e,a):l.removeAttribute(e);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"credentialless":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":a&&typeof a!="function"&&typeof a!="symbol"?l.setAttribute(e,""):l.removeAttribute(e);break;case"capture":case"download":a===!0?l.setAttribute(e,""):a!==!1&&a!=null&&typeof a!="function"&&typeof a!="symbol"?l.setAttribute(e,a):l.removeAttribute(e);break;case"cols":case"rows":case"size":case"span":a!=null&&typeof a!="function"&&typeof a!="symbol"&&!isNaN(a)&&1<=a?l.setAttribute(e,a):l.removeAttribute(e);break;case"rowSpan":case"start":a==null||typeof a=="function"||typeof a=="symbol"||isNaN(a)?l.removeAttribute(e):l.setAttribute(e,a);break;case"popover":el("beforetoggle",l),el("toggle",l),bn(l,"popover",a);break;case"xlinkActuate":ue(l,"http://www.w3.org/1999/xlink","xlink:actuate",a);break;case"xlinkArcrole":ue(l,"http://www.w3.org/1999/xlink","xlink:arcrole",a);break;case"xlinkRole":ue(l,"http://www.w3.org/1999/xlink","xlink:role",a);break;case"xlinkShow":ue(l,"http://www.w3.org/1999/xlink","xlink:show",a);break;case"xlinkTitle":ue(l,"http://www.w3.org/1999/xlink","xlink:title",a);break;case"xlinkType":ue(l,"http://www.w3.org/1999/xlink","xlink:type",a);break;case"xmlBase":ue(l,"http://www.w3.org/XML/1998/namespace","xml:base",a);break;case"xmlLang":ue(l,"http://www.w3.org/XML/1998/namespace","xml:lang",a);break;case"xmlSpace":ue(l,"http://www.w3.org/XML/1998/namespace","xml:space",a);break;case"is":bn(l,"is",a);break;case"innerText":case"textContent":return;default:if(!(2<e.length)||e[0]!=="o"&&e[0]!=="O"||e[1]!=="n"&&e[1]!=="N")e=Z0.get(e)||e,bn(l,e,a);else return}sl=!0}function ls(l,t,e,a,u,n){switch(e){case"style":no(l,a,n);return;case"dangerouslySetInnerHTML":if(a!=null){if(typeof a!="object"||!("__html"in a))throw Error(d(61));if(e=a.__html,e!=null){if(u.children!=null)throw Error(d(60));(n!=null?n.__html:void 0)!==e&&(l.innerHTML=e)}}break;case"children":if(typeof a=="string")Oa(l,a);else if(typeof a=="number"||typeof a=="bigint")Oa(l,""+a);else return;break;case"onScroll":a!=null&&el("scroll",l);return;case"onScrollEnd":a!=null&&el("scro
Line truncated
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Qv=x=>x.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),S0=(...x)=>x.filter((O,T,d)=>!!O&&O.trim()!==""&&d.indexOf(O)===T).join(" ").trim();/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/var Xv={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Lv=xl.forwardRef(({color:x="currentColor",size:O=24,strokeWidth:T=2,absoluteStrokeWidth:d,className:E="",children:H,iconNode:J,...K},Q)=>xl.createElement("svg",{ref:Q,...Xv,width:O,height:O,stroke:x,strokeWidth:d?Number(T)*24/Number(O):T,className:S0("lucide",E),...K},[...J.map(([W,A])=>xl.createElement(W,A)),...Array.isArray(H)?H:[H]]));/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Fl=(x,O)=>{const T=xl.forwardRef(({className:d,...E},H)=>xl.createElement(Lv,{ref:H,iconNode:O,className:S0(`lucide-${Qv(x)}`,d),...E}));return T.displayName=`${x}`,T};/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Zv=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],p0=Fl("BookOpen",Zv);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Vv=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],N0=Fl("Check",Vv);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Kv=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],Jv=Fl("EyeOff",Kv);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const kv=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],$v=Fl("Eye",kv);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Wv=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],y0=Fl("KeyRound",Wv);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Fv=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],Iv=Fl("Layers",Fv);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Pv=[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]],ly=Fl("LayoutGrid",Pv);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const ty=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]],ey=Fl("Lock",ty);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const ay=[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]],uy=Fl("Moon",ay);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const ny=[["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z",key:"12rzf8"}]],cy=Fl("Palette",ny);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const iy=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M9 21V9",key:"1oto5p"}]],fy=Fl("PanelsTopLeft",iy);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const sy=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]],Cs=Fl("Search",sy);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const oy=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],ry=Fl("ShieldCheck",oy);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const dy=[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]],my=Fl("Sparkles",dy);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const hy=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],vy=Fl("Sun",hy);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const yy=[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]],Ms=Fl("Terminal",yy);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const gy=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]],by=Fl("User",gy),xy=[{id:"auto",label:"智能路由"},{id:"edge443",label:"443 免端口"},{id:"home10443",label:"10443 家宽"},{id:"lan",label:"LAN 局域网"}],Sy=()=>{const{theme:x,resolvedTheme:O,routeMode:T,viewMode:d,telemetry:E,setTheme:H,toggleTheme:J,setRouteMode:K,setViewMode:Q,setShowAgyModal:W,setShowCmdPalette:A}=ke();return f.jsxs(f.Fragment,{children:[f.jsx("header",{className:"border-b hl-border sticky top-0 z-30 backdrop-blur-md",style:{backgroundColor:"color-mix(in srgb, var(--bg-card) 88%, transparent)"},children:f.jsxs("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-14 flex items-center justify-between gap-4",children:[f.jsxs("div",{className:"flex items-center gap-4 shrink-0",children:[f.jsxs("div",{onClick:()=>Q("dashboard"),className:"flex items-center gap-2.5 cursor-pointer",children:[f.jsx("img",{src:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/apple.png",alt:"Mac mini",className:"w-6 h-6 rounded"}),f.jsx("span",{className:"font-semibold text-sm tracking-tight",children:"HomeLab"}),f.jsx("span",{className:"w-2 h-2 rounded-full",style:{backgroundColor:"var(--success)"},title:"全屋 4 节点在线"})]}),f.jsx("div",{className:"h-4 w-[1px] hl-muted"}),f.jsxs("nav",{className:"flex items-center gap-1 text-xs",children:[f.jsxs("button",{onClick:()=>Q("dashboard"),className:"px-2.5 py-1.5 rounded-md font-medium flex items-center gap-1.5 transition-all cursor-pointer",style:d==="dashboard"?{backgroundColor:"var(--bg-muted)",color:"var(--text-main)"}:{color:"var(--text-muted)"},children:[f.jsx(ly,{className:"w-3.5 h-3.5"}),f.jsx("span",{children:"中控台"})]}),f.jsxs("button",{onClick:()=>Q("storybook"),className:"px-2.5 py-1.5 rounded-md font-medium flex items-center gap-1.5 transition-all cursor-pointer",style:d==="storybook"?{backgroundColor:"var(--bg-muted)",color:"var(--text-main)"}:{color:"var(--text-muted)"},children:[f.jsx(p0,{className:"w-3.5 h-3.5"}),f.jsx("span",{children:"Storybook 设计规范"})]})]})]}),f.jsxs("div",{className:"flex items-center gap-2.5 shrink-0 ml-auto",children:[f.jsxs("button",{onClick:()=>A(!0),className:"hl-btn-outline px-3 py-1.5 text-xs flex items-center gap-3 cursor-pointer",title:"按 Cmd+K 唤起全局命令面板",children:[f.jsxs("span",{className:"flex items-center gap-1.5",style:{color:"var(--text-muted)"},children:[f.jsx(Cs,{className:"w-3.5 h-3.5"}),f.jsx("span",{className:"hidden sm:inline",children:"搜索服务或指令..."})]}),f.jsx("kbd",{className:"px-1.5 py-0.5 text-[10px] font-mono-num rounded hl-muted",style:{color:"var(--text-muted)"},children:"⌘K"})]}),f.jsxs("button",{onClick:()=>W(!0),className:"hl-btn-primary px-3 py-1.5 text-xs flex items-center gap-1.5 cursor-pointer",children:[f.jsx(Ms,{className:"w-3.5 h-3.5"}),f.jsx("span",{children:"AGY 终端"})]}),f.jsxs("div",{className:"flex items-center p-0.5 rounded-lg hl-muted border hl-border text-xs",children:[f.jsx("button",{onClick:J,className:"px-2.5 py-1 rounded-md font-medium transition-all flex items-center gap-1.5 cursor-pointer",style:{backgroundColor:"var(--bg-card)",color:"var(--text-main)",boxShadow:"0 1px 2px rgba(0,0,0,0.08)"},title:"点击切换深色 / 浅色主题(默认跟随系统)",children:O==="dark"?f.jsxs(f.Fragment,{children:[f.jsx(uy,{className:"w-3.5 h-3.5"}),f.jsx("span",{children:"深色"})]}):f.jsxs(f.Fragment,{children:[f.jsx(vy,{className:"w-3.5 h-3.5"}),f.jsx("span",{children:"浅色"})]})}),x!=="system"&&f.jsx("button",{onClick:()=>H("system"),className:"px-2 py-1 rounded-md text-[11px] transition-all cursor-pointer",style:{color:"var(--text-muted)"},title:"恢复跟随设备系统深浅色自动切换",children:"自动"})]})]})]})}),d==="dashboard"&&f.jsx("div",{className:"border-b hl-border",style:{backgroundColor:"var(--bg-card)"},children:f.jsxs("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-2.5 flex flex-wrap items-center justify-between gap-3",children:[f.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs font-mono-num",children:[f.jsxs("div",{className:"hl-pill px-2.5 py-1 flex items-center gap-2",children:[f.jsx("span",{style:{color:"var(--text-muted)"},children:"M6 CPU"}),f.jsx("div",{className:"w-12 h-1.5 rounded-full hl-muted overflow-hidden",children:f.jsx("div",{className:"h-full hl-bar-fill",style:{width:`${Math.max(5,E.mini.cpu_pct)}%`}})}),f.jsxs("span",{className:"font-medium",children:[E.mini.cpu_pct,"%"]})]}),f.jsxs("div",{className:"hl-pill px-2.5 py-1 flex items-center gap-2",children:[f.jsx("span",{style:{color:"var(--text-muted)"},children:"RAM"}),f.jsx("div",{className:"w-12 h-1.5 rounded-full hl-muted overflow-hidden",children:f.jsx("div",{className:"h-full hl-bar-fill",style:{width:`${Math.max(5,E.mini.mem_pct)}%`}})}),f.jsxs("span",{className:"font-medium",children:[E.mini.mem_used_gb,"G"]})]}),f.jsxs("div",{className:"hl-pill px-2.Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
/*! tailwindcss v4.3.5 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--blur-sm:8px;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@suppoLine truncated
|
||||
+194
@@ -0,0 +1,194 @@
|
||||
var Ry=i=>{throw TypeError(i)};var jy=(i,c,r)=>c.has(i)||Ry("Cannot "+r);var pt=(i,c,r)=>(jy(i,c,"read from private field"),r?r.call(i):c.get(i)),Dy=(i,c,r)=>c.has(i)?Ry("Cannot add the same private member more than once"):c instanceof WeakSet?c.add(i):c.set(i,r),Is=(i,c,r,o)=>(jy(i,c,"write to private field"),o?o.call(i,r):c.set(i,r),r);function Nx(i,c){for(var r=0;r<c.length;r++){const o=c[r];if(typeof o!="string"&&!Array.isArray(o)){for(const f in o)if(f!=="default"&&!(f in i)){const m=Object.getOwnPropertyDescriptor(o,f);m&&Object.defineProperty(i,f,m.get?m:{enumerable:!0,get:()=>o[f]})}}}return Object.freeze(Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}))}(function(){const c=document.createElement("link").relList;if(c&&c.supports&&c.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))o(f);new MutationObserver(f=>{for(const m of f)if(m.type==="childList")for(const v of m.addedNodes)v.tagName==="LINK"&&v.rel==="modulepreload"&&o(v)}).observe(document,{childList:!0,subtree:!0});function r(f){const m={};return f.integrity&&(m.integrity=f.integrity),f.referrerPolicy&&(m.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?m.credentials="include":f.crossOrigin==="anonymous"?m.credentials="omit":m.credentials="same-origin",m}function o(f){if(f.ep)return;f.ep=!0;const m=r(f);fetch(f.href,m)}})();function pg(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var Fs={exports:{}},ii={};/**
|
||||
* @license React
|
||||
* react-jsx-runtime.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var My;function Cx(){if(My)return ii;My=1;var i=Symbol.for("react.transitional.element"),c=Symbol.for("react.fragment");function r(o,f,m){var v=null;if(m!==void 0&&(v=""+m),f.key!==void 0&&(v=""+f.key),"key"in f){m={};for(var p in f)p!=="key"&&(m[p]=f[p])}else m=f;return f=m.ref,{$$typeof:i,type:o,key:v,ref:f!==void 0?f:null,props:m}}return ii.Fragment=c,ii.jsx=r,ii.jsxs=r,ii}var Uy;function Tx(){return Uy||(Uy=1,Fs.exports=Cx()),Fs.exports}var d=Tx(),$s={exports:{}},ve={};/**
|
||||
* @license React
|
||||
* react.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var Hy;function _x(){if(Hy)return ve;Hy=1;var i=Symbol.for("react.transitional.element"),c=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),m=Symbol.for("react.consumer"),v=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),E=Symbol.for("react.suspense"),b=Symbol.for("react.memo"),N=Symbol.for("react.lazy"),y=Symbol.for("react.activity"),T=Symbol.for("react.view_transition"),B=Symbol.iterator;function D(S){return S===null||typeof S!="object"?null:(S=B&&S[B]||S["@@iterator"],typeof S=="function"?S:null)}var M={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},H=Object.assign,Z={};function Q(S,z,J){this.props=S,this.context=z,this.refs=Z,this.updater=J||M}Q.prototype.isReactComponent={},Q.prototype.setState=function(S,z){if(typeof S!="object"&&typeof S!="function"&&S!=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,S,z,"setState")},Q.prototype.forceUpdate=function(S){this.updater.enqueueForceUpdate(this,S,"forceUpdate")};function V(){}V.prototype=Q.prototype;function P(S,z,J){this.props=S,this.context=z,this.refs=Z,this.updater=J||M}var F=P.prototype=new V;F.constructor=P,H(F,Q.prototype),F.isPureReactComponent=!0;var G=Array.isArray;function U(){}var k={H:null,A:null,T:null,S:null},ce=Object.prototype.hasOwnProperty;function xe(S,z,J){var I=J.ref;return{$$typeof:i,type:S,key:z,ref:I!==void 0?I:null,props:J}}function he(S,z){return xe(S.type,z,S.props)}function se(S){return typeof S=="object"&&S!==null&&S.$$typeof===i}function je(S){var z={"=":"=0",":":"=2"};return"$"+S.replace(/[=:]/g,function(J){return z[J]})}var ze=/\/+/g;function ye(S,z){return typeof S=="object"&&S!==null&&S.key!=null?je(""+S.key):z.toString(36)}function K(S){switch(S.status){case"fulfilled":return S.value;case"rejected":throw S.reason;default:switch(typeof S.status=="string"?S.then(U,U):(S.status="pending",S.then(function(z){S.status==="pending"&&(S.status="fulfilled",S.value=z)},function(z){S.status==="pending"&&(S.status="rejected",S.reason=z)})),S.status){case"fulfilled":return S.value;case"rejected":throw S.reason}}throw S}function W(S,z,J,I,de){var te=typeof S;(te==="undefined"||te==="boolean")&&(S=null);var Se=!1;if(S===null)Se=!0;else switch(te){case"bigint":case"string":case"number":Se=!0;break;case"object":switch(S.$$typeof){case i:case c:Se=!0;break;case N:return Se=S._init,W(Se(S._payload),z,J,I,de)}}if(Se)return de=de(S),Se=I===""?"."+ye(S,0):I,G(de)?(J="",Se!=null&&(J=Se.replace(ze,"$&/")+"/"),W(de,z,J,"",function(Mt){return Mt})):de!=null&&(se(de)&&(de=he(de,J+(de.key==null||S&&S.key===de.key?"":(""+de.key).replace(ze,"$&/")+"/")+Se)),z.push(de)),1;Se=0;var ae=I===""?".":I+":";if(G(S))for(var fe=0;fe<S.length;fe++)I=S[fe],te=ae+ye(I,fe),Se+=W(I,z,J,te,de);else if(fe=D(S),typeof fe=="function")for(S=fe.call(S),fe=0;!(I=S.next()).done;)I=I.value,te=ae+ye(I,fe++),Se+=W(I,z,J,te,de);else if(te==="object"){if(typeof S.then=="function")return W(K(S),z,J,I,de);throw z=String(S),Error("Objects are not valid as a React child (found: "+(z==="[object Object]"?"object with keys {"+Object.keys(S).join(", ")+"}":z)+"). If you meant to render a collection of children, use an array instead.")}return Se}function ie(S,z,J){if(S==null)return S;var I=[],de=0;return W(S,I,"","",function(te){return z.call(J,te,de++)}),I}function ge(S){if(S._status===-1){var z=S._result,J=z();J.then(function(I){(S._status===0||S._status===-1)&&(S._status=1,S._result=I,J.status===void 0&&(J.status="fulfilled",J.value=I))},function(I){(S._status===0||S._status===-1)&&(S._status=2,S._result=I,J.status===void 0&&(J.status="rejected",J.reason=I))}),S._status===-1&&(S._status=0,S._result=J)}if(S._status===1)return S._result.default;throw S._result}var q=typeof reportError=="function"?reportError:function(S){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var z=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof S=="object"&&S!==null&&typeof S.message=="string"?String(S.message):String(S),error:S});if(!window.dispatchEvent(z))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",S);return}console.error(S)};function Ce(S){var z=k.T,J={};J.types=z!==null?z.types:null,k.T=J;try{var I=S(),de=k.S;de!==null&&de(J,I),typeof I=="object"&&I!==null&&typeof I.then=="function"&&I.then(U,q)}catch(te){q(te)}finally{z!==null&&J.types!==null&&(z.types=J.types),k.T=z}}function X(S){var z=k.T;if(z!==null){var J=z.types;J===null?z.types=[S]:J.indexOf(S)===-1&&J.push(S)}else Ce(X.bind(null,S))}var re={map:ie,forEach:function(S,z,J){ie(S,function(){z.apply(this,arguments)},J)},count:function(S){var z=0;return ie(S,function(){z++}),z},toArray:function(S){return ie(S,function(z){return z})||[]},only:function(S){if(!se(S))throw Error("Line truncated
|
||||
* @license React
|
||||
* scheduler.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var ky;function wx(){return ky||(ky=1,(function(i){function c(K,W){var ie=K.length;K.push(W);e:for(;0<ie;){var ge=ie-1>>>1,q=K[ge];if(0<f(q,W))K[ge]=W,K[ie]=q,ie=ge;else break e}}function r(K){return K.length===0?null:K[0]}function o(K){if(K.length===0)return null;var W=K[0],ie=K.pop();if(ie!==W){K[0]=ie;e:for(var ge=0,q=K.length,Ce=q>>>1;ge<Ce;){var X=2*(ge+1)-1,re=K[X],S=X+1,z=K[S];if(0>f(re,ie))S<q&&0>f(z,re)?(K[ge]=z,K[S]=ie,ge=S):(K[ge]=re,K[X]=ie,ge=X);else if(S<q&&0>f(z,ie))K[ge]=z,K[S]=ie,ge=S;else break e}}return W}function f(K,W){var ie=K.sortIndex-W.sortIndex;return ie!==0?ie:K.id-W.id}if(i.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var m=performance;i.unstable_now=function(){return m.now()}}else{var v=Date,p=v.now();i.unstable_now=function(){return v.now()-p}}var E=[],b=[],N=1,y=null,T=3,B=!1,D=!1,M=!1,H=!1,Z=typeof setTimeout=="function"?setTimeout:null,Q=typeof clearTimeout=="function"?clearTimeout:null,V=typeof setImmediate<"u"?setImmediate:null;function P(K){for(var W=r(b);W!==null;){if(W.callback===null)o(b);else if(W.startTime<=K)o(b),W.sortIndex=W.expirationTime,c(E,W);else break;W=r(b)}}function F(K){if(M=!1,P(K),!D)if(r(E)!==null)D=!0,G||(G=!0,se());else{var W=r(b);W!==null&&ye(F,W.startTime-K)}}var G=!1,U=-1,k=5,ce=-1;function xe(){return H?!0:!(i.unstable_now()-ce<k)}function he(){if(H=!1,G){var K=i.unstable_now();ce=K;var W=!0;try{e:{D=!1,M&&(M=!1,Q(U),U=-1),B=!0;var ie=T;try{t:{for(P(K),y=r(E);y!==null&&!(y.expirationTime>K&&xe());){var ge=y.callback;if(typeof ge=="function"){y.callback=null,T=y.priorityLevel;var q=ge(y.expirationTime<=K);if(K=i.unstable_now(),typeof q=="function"){y.callback=q,P(K),W=!0;break t}y===r(E)&&o(E),P(K)}else o(E);y=r(E)}if(y!==null)W=!0;else{var Ce=r(b);Ce!==null&&ye(F,Ce.startTime-K),W=!1}}break e}finally{y=null,T=ie,B=!1}W=void 0}}finally{W?se():G=!1}}}var se;if(typeof V=="function")se=function(){V(he)};else if(typeof MessageChannel<"u"){var je=new MessageChannel,ze=je.port2;je.port1.onmessage=he,se=function(){ze.postMessage(null)}}else se=function(){Z(he,0)};function ye(K,W){U=Z(function(){K(i.unstable_now())},W)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(K){K.callback=null},i.unstable_forceFrameRate=function(K){0>K||125<K?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):k=0<K?Math.floor(1e3/K):5},i.unstable_getCurrentPriorityLevel=function(){return T},i.unstable_next=function(K){switch(T){case 1:case 2:case 3:var W=3;break;default:W=T}var ie=T;T=W;try{return K()}finally{T=ie}},i.unstable_requestPaint=function(){H=!0},i.unstable_runWithPriority=function(K,W){switch(K){case 1:case 2:case 3:case 4:case 5:break;default:K=3}var ie=T;T=K;try{return W()}finally{T=ie}},i.unstable_scheduleCallback=function(K,W,ie){var ge=i.unstable_now();switch(typeof ie=="object"&&ie!==null?(ie=ie.delay,ie=typeof ie=="number"&&0<ie?ge+ie:ge):ie=ge,K){case 1:var q=-1;break;case 2:q=250;break;case 5:q=1073741823;break;case 4:q=1e4;break;default:q=5e3}return q=ie+q,K={id:N++,callback:W,priorityLevel:K,startTime:ie,expirationTime:q,sortIndex:-1},ie>ge?(K.sortIndex=ie,c(b,K),r(E)===null&&K===r(b)&&(M?(Q(U),U=-1):M=!0,ye(F,ie-ge))):(K.sortIndex=q,c(E,K),D||B||(D=!0,G||(G=!0,se()))),K},i.unstable_shouldYield=xe,i.unstable_wrapCallback=function(K){var W=T;return function(){var ie=T;T=W;try{return K.apply(this,arguments)}finally{T=ie}}}})(ef)),ef}var Ly;function Ox(){return Ly||(Ly=1,Ws.exports=wx()),Ws.exports}var tf={exports:{}},bt={};/**
|
||||
* @license React
|
||||
* react-dom.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var Gy;function Ax(){if(Gy)return bt;Gy=1;var i=zf();function c(N){var y="https://react.dev/errors/"+N;if(1<arguments.length){y+="?args[]="+encodeURIComponent(arguments[1]);for(var T=2;T<arguments.length;T++)y+="&args[]="+encodeURIComponent(arguments[T])}return"Minified React error #"+N+"; visit "+y+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function r(){}var o={d:{f:r,r:function(){throw Error(c(522))},D:r,C:r,L:r,m:r,X:r,S:r,M:r},p:0,findDOMNode:null},f=Symbol.for("react.portal"),m=Symbol.for("react.recoverable"),v=Symbol.for("react.optimistic_key");function p(N,y,T){var B=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:f,key:B==null?null:B===v?v:""+B,children:N,containerInfo:y,implementation:T}}var E=i.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function b(N,y){if(N==="font")return"";if(typeof y=="string")return y==="use-credentials"?y:""}return bt.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=o,bt.browser=function(N){return{$$typeof:m,_reason:N}},bt.createPortal=function(N,y){var T=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!y||y.nodeType!==1&&y.nodeType!==9&&y.nodeType!==11)throw Error(c(299));return p(N,y,null,T)},bt.flushSync=function(N){var y=E.T,T=o.p;try{if(E.T=null,o.p=2,N)return N()}finally{E.T=y,o.p=T,o.d.f()}},bt.preconnect=function(N,y){typeof N=="string"&&(y?(y=y.crossOrigin,y=typeof y=="string"?y==="use-credentials"?y:"":void 0):y=null,o.d.C(N,y))},bt.prefetchDNS=function(N){typeof N=="string"&&o.d.D(N)},bt.preinit=function(N,y){if(typeof N=="string"&&y&&typeof y.as=="string"){var T=y.as,B=b(T,y.crossOrigin),D=typeof y.integrity=="string"?y.integrity:void 0,M=typeof y.fetchPriority=="string"?y.fetchPriority:void 0;T==="style"?o.d.S(N,typeof y.precedence=="string"?y.precedence:void 0,{crossOrigin:B,integrity:D,fetchPriority:M}):T==="script"&&o.d.X(N,{crossOrigin:B,integrity:D,fetchPriority:M,nonce:typeof y.nonce=="string"?y.nonce:void 0})}},bt.preinitModule=function(N,y){if(typeof N=="string")if(typeof y=="object"&&y!==null){if(y.as==null||y.as==="script"){var T=b(y.as,y.crossOrigin);o.d.M(N,{crossOrigin:T,integrity:typeof y.integrity=="string"?y.integrity:void 0,nonce:typeof y.nonce=="string"?y.nonce:void 0,fetchPriority:typeof y.fetchPriority=="string"?y.fetchPriority:void 0})}}else y==null&&o.d.M(N)},bt.preload=function(N,y){if(typeof N=="string"&&typeof y=="object"&&y!==null&&typeof y.as=="string"){var T=y.as,B=b(T,y.crossOrigin);o.d.L(N,T,{crossOrigin:B,integrity:typeof y.integrity=="string"?y.integrity:void 0,nonce:typeof y.nonce=="string"?y.nonce:void 0,type:typeof y.type=="string"?y.type:void 0,fetchPriority:typeof y.fetchPriority=="string"?y.fetchPriority:void 0,referrerPolicy:typeof y.referrerPolicy=="string"?y.referrerPolicy:void 0,imageSrcSet:typeof y.imageSrcSet=="string"?y.imageSrcSet:void 0,imageSizes:typeof y.imageSizes=="string"?y.imageSizes:void 0,media:typeof y.media=="string"?y.media:void 0})}},bt.preloadModule=function(N,y){if(typeof N=="string")if(y){var T=b(y.as,y.crossOrigin);o.d.m(N,{as:typeof y.as=="string"&&y.as!=="script"?y.as:void 0,crossOrigin:T,integrity:typeof y.integrity=="string"?y.integrity:void 0,nonce:typeof y.nonce=="string"?y.nonce:void 0,fetchPriority:typeof y.fetchPriority=="string"?y.fetchPriority:void 0})}else o.d.m(N)},bt.requestFormReset=function(N){o.d.r(N)},bt.unstable_batchedUpdates=function(N,y){return N(y)},bt.useFormState=function(N,y,T){return E.H.useFormState(N,y,T)},bt.useFormStatus=function(){return E.H.useHostTransitionStatus()},bt.version="19.3.1",bt}var Yy;function bg(){if(Yy)return tf.exports;Yy=1;function i(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(c){console.error(c)}}return i(),tf.exports=Ax(),tf.exports}/**
|
||||
* @license React
|
||||
* react-dom-client.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var qy;function zx(){if(qy)return ci;qy=1;var i=Ox(),c=zf(),r=bg();function o(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var l=2;l<arguments.length;l++)t+="&args[]="+encodeURIComponent(arguments[l])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function f(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function m(e){for(var t=e,l=t;l&&!l.alternate;)t=l,(t.flags&4098)!==0&&(e=t.return),l=t.return;for(;t.return;)t=t.return;return t.tag===3?e:null}function v(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function p(e){if(e.tag===31){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function E(e){if(m(e)!==e)throw Error(o(188))}function b(e){var t=e.alternate;if(!t){if(t=m(e),t===null)throw Error(o(188));return t!==e?null:e}for(var l=e,n=t;;){var a=l.return;if(a===null)break;var u=a.alternate;if(u===null){if(n=a.return,n!==null){l=n;continue}break}if(a.child===u.child){for(u=a.child;u;){if(u===l)return E(a),e;if(u===n)return E(a),t;u=u.sibling}throw Error(o(188))}if(l.return!==n.return)l=a,n=u;else{for(var s=!1,h=a.child;h;){if(h===l){s=!0,l=a,n=u;break}if(h===n){s=!0,n=a,l=u;break}h=h.sibling}if(!s){for(h=u.child;h;){if(h===l){s=!0,l=u,n=a;break}if(h===n){s=!0,n=u,l=a;break}h=h.sibling}if(!s)throw Error(o(189))}}if(l.alternate!==n)throw Error(o(190))}if(l.tag!==3)throw Error(o(188));return l.stateNode.current===l?e:t}function N(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=N(e),t!==null)return t;e=e.sibling}return null}function y(e,t,l,n,a,u){for(;e!==null;){if((e.tag===5||e.tag===27||e.tag===6)&&l(e,n,a,u)||(e.tag!==22||e.memoizedState===null)&&(t||e.tag!==5&&e.tag!==27)&&y(e.child,t,l,n,a,u))return!0;e=e.sibling}return!1}function T(e){for(e=e.return;e!==null;){if(e.tag===3||e.tag===5||e.tag===27)return e;e=e.return}return null}function B(e){var t=!1;for(e=e.return;e!==null&&(e.tag===4&&(t=!0),!(e.tag===3||e.tag===5||e.tag===27));)e=e.return;return t}function D(e){var t=[null,null],l=T(e);return l===null||M(t,e,l.child,{foundSelf:!1}),t}function M(e,t,l,n){for(;l!==null;){if(l===t)n.foundSelf=!0;else if(l.tag===5||l.tag===27||l.tag===6){if(n.foundSelf)return e[1]=l,!0;e[0]=l}else if((l.tag!==22||l.memoizedState===null)&&M(e,t,l.child,n))return!0;l=l.sibling}return!1}function H(e){switch(e.tag){case 5:case 27:case 6:return e.stateNode;case 3:return e.stateNode.containerInfo;default:throw Error(o(559))}}var Z=null,Q=null;function V(e,t,l){return e===l?!0:e===t?(Z=e,!0):!1}function P(e,t,l){return e===l?(Q=e,!1):e===t?(Q!==null&&(Z=e),!0):!1}function F(e){if(e===null)return null;do e=e===null?null:e.return;while(e&&e.tag!==5&&e.tag!==27&&e.tag!==3);return e||null}function G(e,t,l){for(var n=0,a=e;a;a=l(a))n++;a=0;for(var u=t;u;u=l(u))a++;for(;0<n-a;)e=l(e),n--;for(;0<a-n;)t=l(t),a--;for(;n--;){if(e===t||t!==null&&e===t.alternate)return e;e=l(e),t=l(t)}return null}var U=Object.assign,k=Symbol.for("react.element"),ce=Symbol.for("react.transitional.element"),xe=Symbol.for("react.portal"),he=Symbol.for("react.fragment"),se=Symbol.for("react.strict_mode"),je=Symbol.for("react.profiler"),ze=Symbol.for("react.consumer"),ye=Symbol.for("react.context"),K=Symbol.for("react.forward_ref"),W=Symbol.for("react.suspense"),ie=Symbol.for("react.suspense_list"),ge=Symbol.for("react.memo"),q=Symbol.for("react.lazy"),Ce=Symbol.for("react.activity"),X=Symbol.for("react.legacy_hidden"),re=Symbol.for("react.memo_cache_sentinel"),S=Symbol.for("react.view_transition"),z=Symbol.for("react.recoverable"),J=Symbol.iterator;function I(e){return e===null||typeof e!="object"?null:(e=J&&e[J]||e["@@iterator"],typeof e=="function"?e:null)}var de=Symbol.for("react.client.reference");function te(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===de?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case he:return"Fragment";case je:return"Profiler";case se:return"StrictMode";case W:return"Suspense";case ie:return"SuspenseList";case Ce:return"Activity";case S:return"ViewTransition"}if(typeof e=="object")switch(e.$$typeof){case xe:return"Portal";case ye:return e.displayName||"Context";case ze:return(e._context.displayName||"Context")+".Consumer";case K:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ge:return t=e.displayName||null,t!==null?t:te(e.type)||"Memo";case q:t=e._payload,e=e._init;try{return te(e(t))}catch{}}return null}var Se=Array.isArray,ae=c.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,fe=r.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Mt={pending:!1,data:null,method:null,action:null},Il=[],daLine truncated
|
||||
at`)?" (<anonymous>)":-1<l.stack.indexOf("@")?"@unknown:0:0":""}return`
|
||||
`+vr+e+cd}var yr=!1;function gr(e,t){if(!e||yr)return"";yr=!0;var l=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var n={DetermineComponentFrameRoot:function(){try{if(t){var Y=function(){throw Error()};if(Object.defineProperty(Y.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(Y,[])}catch($){var _=$}Reflect.construct(e,[],Y)}else{try{Y.call()}catch($){_=$}Y=!1;try{var R=Object.getOwnPropertyDescriptor(e.prototype,"props");Object.defineProperty(e.prototype,"props",{configurable:!0,set:function(){throw Error()}}),Y=!0,new e}finally{Y&&(R!==void 0?Object.defineProperty(e.prototype,"props",R):delete e.prototype.props)}}}else{try{throw Error()}catch($){_=$}(Y=e())&&typeof Y.catch=="function"&&Y.catch(function(){})}}catch($){if($&&_&&typeof $.stack=="string")return[$.stack,_.stack]}return[null,null]}};n.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var a=Object.getOwnPropertyDescriptor(n.DetermineComponentFrameRoot,"name");a&&a.configurable&&Object.defineProperty(n.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var u=n.DetermineComponentFrameRoot(),s=u[0],h=u[1];if(s&&h){var x=s.split(`
|
||||
`),O=h.split(`
|
||||
`);for(a=n=0;n<x.length&&!x[n].includes("DetermineComponentFrameRoot");)n++;for(;a<O.length&&!O[a].includes("DetermineComponentFrameRoot");)a++;if(n===x.length||a===O.length)for(n=x.length-1,a=O.length-1;1<=n&&0<=a&&x[n]!==O[a];)a--;for(;1<=n&&0<=a;n--,a--)if(x[n]!==O[a]){if(n!==1||a!==1)do if(n--,a--,0>a||x[n]!==O[a]){var j=`
|
||||
`+x[n].replace(" at new "," at ");return e.displayName&&j.includes("<anonymous>")&&(j=j.replace("<anonymous>",e.displayName)),j}while(1<=n&&0<=a);break}}}finally{yr=!1,Error.prepareStackTrace=l}return(l=e?e.displayName||e.name:"")?$l(l):""}function w0(e,t){switch(e.tag){case 26:case 27:case 5:return $l(e.type);case 16:return $l("Lazy");case 13:return e.child!==t&&t!==null?$l("Suspense Fallback"):$l("Suspense");case 19:return $l("SuspenseList");case 0:case 15:return gr(e.type,!1);case 11:return gr(e.type.render,!1);case 1:return gr(e.type,!0);case 31:return $l("Activity");case 30:return $l("ViewTransition");default:return""}}function rd(e){try{var t="",l=null;do t+=w0(e,l),l=e,e=e.return;while(e);return t}catch(n){return`
|
||||
Error generating stack: `+n.message+`
|
||||
`+n.stack}}var pr=Object.prototype.hasOwnProperty,br=i.unstable_scheduleCallback,xr=i.unstable_cancelCallback,O0=i.unstable_shouldYield,A0=i.unstable_requestPaint,Ut=i.unstable_now,z0=i.unstable_getCurrentPriorityLevel,od=i.unstable_ImmediatePriority,sd=i.unstable_UserBlockingPriority,pi=i.unstable_NormalPriority,R0=i.unstable_LowPriority,fd=i.unstable_IdlePriority,j0=i.log,D0=i.unstable_setDisableYieldValue,mu=null,Ht=null;function Pl(e){if(typeof j0=="function"&&D0(e),Ht&&typeof Ht.setStrictMode=="function")try{Ht.setStrictMode(mu,e)}catch{}}var Bt=Math.clz32?Math.clz32:H0,M0=Math.log,U0=Math.LN2;function H0(e){return e>>>=0,e===0?32:31-(M0(e)/U0|0)|0}var bi=256,xi=262144,Si=4194304;function Mn(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&-e;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 Ei(e,t,l){var n=e.pendingLanes;if(n===0)return 0;var a=0,u=e.suspendedLanes,s=e.pingedLanes;e=e.warmLanes;var h=n&134217727;return h!==0?(n=h&~u,n!==0?a=Mn(n):(s&=h,s!==0?a=Mn(s):l||(l=h&~e,l!==0&&(a=Mn(l))))):(h=n&~u,h!==0?a=Mn(h):s!==0?a=Mn(s):l||(l=n&~e,l!==0&&(a=Mn(l)))),a===0?0:t!==0&&t!==a&&(t&u)===0&&(u=a&-a,l=t&-t,u>=l||u===32&&(l&4194048)!==0)?t:a}function hu(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function dd(e,t){(t&8)!==0&&(t|=t&32);var l=e.entangledLanes;if(l!==0)for(e=e.entanglements,l&=t;0<l;){var n=31-Bt(l),a=1<<n;t|=e[n],l&=~a}return t}function B0(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 md(){var e=Si;return Si<<=1,(Si&62914560)===0&&(Si=4194304),e}function Sr(e){for(var t=[],l=0;31>l;l++)t.push(e);return t}function vu(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function k0(e,t,l,n,a,u){var s=e.pendingLanes;e.pendingLanes=l,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=l,e.entangledLanes&=l,e.errorRecoveryDisabledLanes&=l,e.shellSuspendCounter=0;var h=e.entanglements,x=e.expirationTimes,O=e.hiddenUpdates;for(l=s&~l;0<l;){var j=31-Bt(l),Y=1<<j;h[j]=0,x[j]=-1;var _=O[j];if(_!==null)for(O[j]=null,j=0;j<_.length;j++){var R=_[j];R!==null&&(R.lane&=-536870913)}l&=~Y}n!==0&&hd(e,n,0),u!==0&&a===0&&e.tag!==0&&(e.suspendedLanes|=u&~(s&~t))}function hd(e,t,l){e.pendingLanes|=t,e.suspendedLanes&=~t;var n=31-Bt(t);e.entangledLanes|=t,e.entanglements[n]=e.entanglements[n]|1073741824|l&261930}function vd(e,t){var l=e.entangledLanes|=t;for(e=e.entanglements;l;){var n=31-Bt(l),a=1<<n;a&t|e[n]&t&&(e[n]|=t),l&=~a}}function yd(e,t){var l=t&-t;return l=(l&42)!==0?1:Er(l),(l&(e.suspendedLanes|t))!==0?0:l}function Er(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:e=128;break;case 268435456:e=134217728;break;default:e=0}return e}function Nr(e){return e&=-e,2<e?8<e?(e&134217727)!==0?32:268435456:8:2}function gd(){var e=fe.p;return e!==0?e:(e=window.event,e===void 0?32:Cy(e.type))}function pd(e,t){var l=fe.p;try{return fe.p=e,t()}finally{fe.p=l}}var zl=Math.random().toString(36).slice(2),dt="__reactFiber$"+zl,_t="__reactProps$"+zl,ha="__reactContainer$"+zl,bd="__reactEvents$"+zl,L0="__reactListeners$"+zl,G0="__reactHandles$"+zl,xd="__reactResources$"+zl,yu="__reactMarker$"+zl,Ni="__reactLoad$"+zl;function Ci(e){delete e[dt],delete e[_t],delete e[L0],delete e[G0]}function Un(e){var t;if(t=e[dt])return t;for(var l=e.parentNode;l;){if(t=l[ha]||l[dt]){if(l=t.alternate,t.child!==null||l!==null&&l.child!==null)for(e=ay(e);e!==null;){if(l=e[dt])return l;e=ay(e)}return t}e=l,l=e.parentNode}return null}function va(e){if(e=e[dt]||e[ha]){var t=e.tag;if(t===5||t===6||t===13||t===31||t===26||t===27||t===3)return e}return null}function gu(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e.stateNode;throw Error(o(33))}function ya(e){var t=e[xd];return t||(t=e[xd]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function ut(e){e[yu]=!0}function Sd(e){e[Ni]=void 0}var Ed=new Set,Nd={};function Hn(e,t){ga(e,t),ga(e+"Capture",t)}funct
Line truncated
|
||||
`).replace(w1,"")}function kv(e,t){return t=Bv(t),Bv(e)===t}function Be(e,t,l,n,a,u){switch(l){case"children":if(typeof n=="string")t==="body"||t==="textarea"&&n===""||ba(e,n);else if(typeof n=="number"||typeof n=="bigint")t!=="body"&&ba(e,""+n);else return;break;case"className":_i(e,"class",n);break;case"tabIndex":_i(e,"tabindex",n);break;case"dir":case"role":case"viewBox":case"width":case"height":_i(e,l,n);break;case"style":Dd(e,n,u);return;case"data":if(t!=="object"){_i(e,"data",n);break}case"src":case"href":if(n===""&&(t!=="a"||l!=="href")){e.removeAttribute(l);break}if(n==null||typeof n=="function"||typeof n=="symbol"||typeof n=="boolean"){e.removeAttribute(l);break}n=wi(n),e.setAttribute(l,n);break;case"action":case"formAction":if(typeof n=="function"){e.setAttribute(l,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}else typeof u=="function"&&(l==="formAction"?(t!=="input"&&Be(e,t,"name",a.name,a,null),Be(e,t,"formEncType",a.formEncType,a,null),Be(e,t,"formMethod",a.formMethod,a,null),Be(e,t,"formTarget",a.formTarget,a,null)):(Be(e,t,"encType",a.encType,a,null),Be(e,t,"method",a.method,a,null),Be(e,t,"target",a.target,a,null)));if(n==null||typeof n=="symbol"||typeof n=="boolean"){e.removeAttribute(l);break}n=wi(n),e.setAttribute(l,n);break;case"onClick":n!=null&&(e.onclick=yl);return;case"onScroll":n!=null&&_e("scroll",e);return;case"onScrollEnd":n!=null&&_e("scrollend",e);return;case"dangerouslySetInnerHTML":if(n!=null){if(typeof n!="object"||!("__html"in n))throw Error(o(61));if(l=n.__html,l!=null){if(a.children!=null)throw Error(o(60));(u!=null?u.__html:void 0)!==l&&(e.innerHTML=l)}}break;case"multiple":e.multiple=n&&typeof n!="function"&&typeof n!="symbol";break;case"muted":e.muted=n&&typeof n!="function"&&typeof n!="symbol";break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":break;case"autoFocus":break;case"xlinkHref":if(n==null||typeof n=="function"||typeof n=="boolean"||typeof n=="symbol"){e.removeAttribute("xlink:href");break}l=wi(n),e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",l);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":n!=null&&typeof n!="function"&&typeof n!="symbol"?e.setAttribute(l,n):e.removeAttribute(l);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"credentialless":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":n&&typeof n!="function"&&typeof n!="symbol"?e.setAttribute(l,""):e.removeAttribute(l);break;case"capture":case"download":n===!0?e.setAttribute(l,""):n!==!1&&n!=null&&typeof n!="function"&&typeof n!="symbol"?e.setAttribute(l,n):e.removeAttribute(l);break;case"cols":case"rows":case"size":case"span":n!=null&&typeof n!="function"&&typeof n!="symbol"&&!isNaN(n)&&1<=n?e.setAttribute(l,n):e.removeAttribute(l);break;case"rowSpan":case"start":n==null||typeof n=="function"||typeof n=="symbol"||isNaN(n)?e.removeAttribute(l):e.setAttribute(l,n);break;case"popover":_e("beforetoggle",e),_e("toggle",e),Ti(e,"popover",n);break;case"xlinkActuate":Rl(e,"http://www.w3.org/1999/xlink","xlink:actuate",n);break;case"xlinkArcrole":Rl(e,"http://www.w3.org/1999/xlink","xlink:arcrole",n);break;case"xlinkRole":Rl(e,"http://www.w3.org/1999/xlink","xlink:role",n);break;case"xlinkShow":Rl(e,"http://www.w3.org/1999/xlink","xlink:show",n);break;case"xlinkTitle":Rl(e,"http://www.w3.org/1999/xlink","xlink:title",n);break;case"xlinkType":Rl(e,"http://www.w3.org/1999/xlink","xlink:type",n);break;case"xmlBase":Rl(e,"http://www.w3.org/XML/1998/namespace","xml:base",n);break;case"xmlLang":Rl(e,"http://www.w3.org/XML/1998/namespace","xml:lang",n);break;case"xmlSpace":Rl(e,"http://www.w3.org/XML/1998/namespace","xml:space",n);break;case"is":Ti(e,"is",n);break;case"innerText":case"textContent":return;default:if(!(2<l.length)||l[0]!=="o"&&l[0]!=="O"||l[1]!=="n"&&l[1]!=="N")l=Z0.get(l)||l,Ti(e,l,n);else return}Re=!0}function _s(e,t,l,n,a,u){switch(l){case"style":Dd(e,n,u);return;case"dangerouslySetInnerHTML":if(n!=null){if(typeof n!="object"||!("__html"in n))throw Error(o(61));if(l=n.__html,l!=null){if(a.children!=null)throw Error(o(60));(u!=null?u.__html:void 0)!==l&&(e.innerHTML=l)}}break;case"children":if(typeof n=="string")ba(e,n);else if(typeof n=="number"||typeof n=="bigint")ba(e,""+n);else return;break;case"onScroll":n!=null&&_e("scroll",e);return;case"onScrollEnd":n!=null&&_e("scro
Line truncated
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Vx=i=>i.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Eg=(...i)=>i.filter((c,r,o)=>!!c&&c.trim()!==""&&o.indexOf(c)===r).join(" ").trim();/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/var Xx={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Qx=g.forwardRef(({color:i="currentColor",size:c=24,strokeWidth:r=2,absoluteStrokeWidth:o,className:f="",children:m,iconNode:v,...p},E)=>g.createElement("svg",{ref:E,...Xx,width:c,height:c,stroke:i,strokeWidth:o?Number(r)*24/Number(c):r,className:Eg("lucide",f),...p},[...v.map(([b,N])=>g.createElement(b,N)),...Array.isArray(m)?m:[m]]));/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const xt=(i,c)=>{const r=g.forwardRef(({className:o,...f},m)=>g.createElement(Qx,{ref:m,iconNode:c,className:Eg(`lucide-${Vx(i)}`,o),...f}));return r.displayName=`${i}`,r};/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Zx=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],Ng=xt("BookOpen",Zx);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Kx=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Jx=xt("Check",Kx);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Ix=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],Fx=xt("EyeOff",Ix);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const $x=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],Px=xt("Eye",$x);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Wx=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],Zy=xt("KeyRound",Wx);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const eS=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],tS=xt("Layers",eS);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const lS=[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]],nS=xt("LayoutGrid",lS);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const aS=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]],uS=xt("Lock",aS);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const iS=[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]],cS=xt("Moon",iS);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const rS=[["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z",key:"12rzf8"}]],oS=xt("Palette",rS);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const sS=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M9 21V9",key:"1oto5p"}]],fS=xt("PanelsTopLeft",sS);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const dS=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]],Rf=xt("Search",dS);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const mS=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],hS=xt("ShieldCheck",mS);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const vS=[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]],yS=xt("Sparkles",vS);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const gS=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],pS=xt("Sun",gS);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const bS=[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]],jf=xt("Terminal",bS);/**
|
||||
* @license lucide-react v0.475.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const xS=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]],SS=xt("User",xS);var ES=Object.defineProperty,Df=(i,c)=>ES(i,"name",{value:c,configurable:!0});function vf(i,c){if(typeof i=="function")return i(c);i!=null&&(i.current=c)}Df(vf,"setRef");function ua(...i){return c=>{let r=!1;const o=i.map(f=>{const m=vf(f,c);return!r&&typeof m=="function"&&(r=!0),m});if(r)return()=>{for(let f=0;f<o.length;f++){const m=o[f];typeof m=="function"?m():vf(i[f],null)}}}}Df(ua,"composeRefs");function Dt(...i){return g.useCallback(ua(...i),i)}Df(Dt,"useComposedRefs");var NS=Object.defineProperty,Kt=(i,c)=>NS(i,"name",{value:c,configurable:!0});function An(i){const c=g.forwardRef((r,o)=>{let{children:f,...m}=r,v=null,p=!1;const E=[];f=Ag(f),g.Children.forEach(f,T=>{var B;if(wg(T)){p=!0;const D=T;let M="child"in D.props?D.props.child:D.props.children;for(;Mf(M)&&typeof ar=="function";)M=ar(M._payload);v=_S(D,M),E.push((B=v==null?void 0:v.props)==null?void 0:B.children)}else E.push(T)}),v?v=g.cloneElement(v,void 0,E):!p&&g.Children.count(f)===1&&g.isValidElement(f)&&(v=f);const b=v?_g(v):void 0,N=Dt(o,b);if(!v){if(f||f===0)throw new Error(p?AS(i):OS(i));return f}const y=Tg(m,v.props??{});return v.type!==g.Fragment&&(y.ref=o?N:b),g.cloneElement(v,y)});return c.displayName=`${i}.Slot`,c}Kt(An,"createSlot");var CS=An("Slot"),Cg=Symbol.for("radix.slottable");function TS(i){const c=Kt(r=>"child"in r?r.children(r.child):r.children,"Slottable");return c.displayName=`${i}.Slottable`,c.__radixId=Cg,c}Kt(TS,"createSlottable");var _S=Kt((i,c)=>"child"in i.props?g.isValidElement(c)?g.cloneElement(c,void 0,i.props.children(c.props.children)):null:g.isValidElement(c)?c:null,"getSlottableElementFromSlottable");function Tg(i,c){const r={...c};for(const o in c){const f=i[o],m=c[o];/^on[A-Z]/.test(o)?f&&m?r[o]=(...p)=>{const E=m(...p);return f(...p),E}:f&&(r[o]=f):o==="style"?r[o]={...f,...m}:o==="className"?r[o]=[f,m].filter(Boolean).join(" "):o==="aria-describedby"&&(r[o]=zg(m,f))}return{...i,...r}}Kt(Tg,"mergeProps");function _g(i){var o,f;let c=(o=Object.getOwnPropertyDescriptor(i.props,"ref"))==null?void 0:o.get,r=c&&"isReactWarning"in c&&c.isReactWarning;return r?i.ref:(c=(f=Object.getOwnPropertyDescriptor(i,"ref"))==null?void 0:f.get,r=c&&"isReactWarning"in c&&c.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}Kt(_g,"getElementRef");function wg(i){return g.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===Cg}Kt(wg,"isSlottable");var wS=Symbol.for("react.lazy");function Mf(i){return i!=null&&typeof i=="object"&&"$$typeof"in i&&i.$$typeof===wS&&"_payload"in i&&Og(i._payload)}Kt(Mf,"isLazyComponent");function Og(i){return typeof i=="object"&&i!==null&&"then"in i}Kt(Og,"isPromiseLike");function Ag(i){let c=i;for(;Mf(c)&&typeof ar=="function";)c=ar(c._payload);return c}Kt(Ag,"useUnwrappedLazy");function zg(...i){const c=new Set;for(const r of i)if(typeof r=="string")for(const o of String(r).trim().split(/\s+/))o&&c.add(o);return c.size>0?Array.from(c).join(" "):void 0}Kt(zg,"concatAriaDescribedby");var OS=Kt(i=>`${i} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,"createSlotError"),AS=Kt(i=>`${i} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,"createSlottableError"),ar=ra[" use ".trim().toString()];function Rg(i){var c,r,o="";if(typeof i=="string"||typeof i=="number")o+=i;else if(typeof i=="object")if(Array.isArray(i)){var f=i.length;for(c=0;c<f;c++)i[c]&&(r=Rg(i[c]))&&(o&&(o+=" "),o+=r)}else for(r in i)i[r]&&(o&&(o+=" "),o+=r);return o}function jg(){for(var i,c,r=0,o="",f=arguments.length;r<f;r++)(i=arguments[r])&&(c=Rg(i))&&(o&&(o+=" "),o+=c);return o}const Ky=i=>typeof i=="boolean"?`${i}`:i===0?"0":i,Jy=jg,Dg=(i,c)=>r=>{var o;if((c==null?void 0:c.variants)==null)return Jy(i,r==null?void 0:r.class,r==null?void 0:r.className);const{variants:f,defaultVariants:m}=c,v=Object.keys(f).map(b=>{const N=r==null?void 0:r[b],y=m==null?void 0:m[b];if(N===null)return null;const T=Ky(N)||Ky(y);return f[b][T]}),p=r&&Object.entries(r).reduce((b,N)=>{let[y,T]=N;return T===void 0||(b[y]=T),b},{}),E=c==null||(o=c.compoundVariants)===null||o===void 0?void 0:o.reduce((b,N)=>{let{class:y,className:T,...B}=N;return Object.entries(B).every(D=>{let[M,H]=D;return Array.isArray(H)?H.includes({...m,...p}[M]):{...m,...p}[M]===H})?[...b,y,T]:b},[]);return Jy(i,v,E,r==null?void 0:r.class,r==null?void 0:r.className)},zS=(i,c)=>{const r=new Array(i.length+c.length);for(let o=0;o<i.length;o++)r[o]=i[o];for(let o=0;o<c.length;o++)r[i.length+o]=c[o];return r},RS=(i,c)=>({classGroupId:i,validator:c}),Mg=(i=new Map,c=null,r)=>({nextPart:i,validators:c,classGroupId:r}),ur="-",Iy=[],jS="arbitrary..",DS=i=>{const c=US(i),{conflictingClassGroups:r,conflictingClassGroupModifiers:o}=i;return{getClassGroupId:v=>{if(v.startsWith("[")&&v.endsWith("]"))return MS(v);const p=v.splitLine truncated
|
||||
.`.concat(qE,` {
|
||||
overflow: hidden `).concat(o,`;
|
||||
padding-right: `).concat(p,"px ").concat(o,`;
|
||||
}
|
||||
body[`).concat(ou,`] {
|
||||
overflow: hidden `).concat(o,`;
|
||||
overscroll-behavior: contain;
|
||||
`).concat([c&&"position: relative ".concat(o,";"),r==="margin"&&`
|
||||
padding-left: `.concat(f,`px;
|
||||
padding-top: `).concat(m,`px;
|
||||
padding-right: `).concat(v,`px;
|
||||
margin-left:0;
|
||||
margin-top:0;
|
||||
margin-right: `).concat(p,"px ").concat(o,`;
|
||||
`),r==="padding"&&"padding-right: ".concat(p,"px ").concat(o,";")].filter(Boolean).join(""),`
|
||||
}
|
||||
|
||||
.`).concat(lr,` {
|
||||
right: `).concat(p,"px ").concat(o,`;
|
||||
}
|
||||
|
||||
.`).concat(nr,` {
|
||||
margin-right: `).concat(p,"px ").concat(o,`;
|
||||
}
|
||||
|
||||
.`).concat(lr," .").concat(lr,` {
|
||||
right: 0 `).concat(o,`;
|
||||
}
|
||||
|
||||
.`).concat(nr," .").concat(nr,` {
|
||||
margin-right: 0 `).concat(o,`;
|
||||
}
|
||||
|
||||
body[`).concat(ou,`] {
|
||||
`).concat(VE,": ").concat(p,`px;
|
||||
}
|
||||
`)},mg=function(){var i=parseInt(document.body.getAttribute(ou)||"0",10);return isFinite(i)?i:0},rN=function(){g.useEffect(function(){return document.body.setAttribute(ou,(mg()+1).toString()),function(){var i=mg()-1;i<=0?document.body.removeAttribute(ou):document.body.setAttribute(ou,i.toString())}},[])},oN=function(i){var c=i.noRelative,r=i.noImportant,o=i.gapMode,f=o===void 0?"margin":o;rN();var m=g.useMemo(function(){return uN(f)},[f]);return g.createElement(iN,{styles:cN(m,!c,f,r?"":"!important")})},wf=!1;if(typeof window<"u")try{var Fc=Object.defineProperty({},"passive",{get:function(){return wf=!0,!0}});window.addEventListener("test",Fc,Fc),window.removeEventListener("test",Fc,Fc)}catch{wf=!1}var nu=wf?{passive:!1}:!1,sN=function(i){return i.tagName==="TEXTAREA"},Kp=function(i,c){if(!(i instanceof Element))return!1;var r=window.getComputedStyle(i);return r[c]!=="hidden"&&!(r.overflowY===r.overflowX&&!sN(i)&&r[c]==="visible")},fN=function(i){return Kp(i,"overflowY")},dN=function(i){return Kp(i,"overflowX")},hg=function(i,c){var r=c.ownerDocument,o=c;do{typeof ShadowRoot<"u"&&o instanceof ShadowRoot&&(o=o.host);var f=Jp(i,o);if(f){var m=Ip(i,o),v=m[1],p=m[2];if(v>p)return!0}o=o.parentNode}while(o&&o!==r.body);return!1},mN=function(i){var c=i.scrollTop,r=i.scrollHeight,o=i.clientHeight;return[c,r,o]},hN=function(i){var c=i.scrollLeft,r=i.scrollWidth,o=i.clientWidth;return[c,r,o]},Jp=function(i,c){return i==="v"?fN(c):dN(c)},Ip=function(i,c){return i==="v"?mN(c):hN(c)},vN=function(i,c){return i==="h"&&c==="rtl"?-1:1},yN=function(i,c,r,o,f){var m=vN(i,window.getComputedStyle(c).direction),v=m*o,p=r.target,E=c.contains(p),b=!1,N=v>0,y=0,T=0;do{if(!p)break;var B=Ip(i,p),D=B[0],M=B[1],H=B[2],Z=M-H-m*D;(D||Z)&&Jp(i,p)&&(y+=Z,T+=D);var Q=p.parentNode;p=Q&&Q.nodeType===Node.DOCUMENT_FRAGMENT_NODE?Q.host:Q}while(!E&&p!==document.body||E&&(c.contains(p)||c===p));return(N&&Math.abs(y)<1||!N&&Math.abs(T)<1)&&(b=!0),b},$c=function(i){return"changedTouches"in i?[i.changedTouches[0].clientX,i.changedTouches[0].clientY]:[0,0]},vg=function(i){return[i.deltaX,i.deltaY]},yg=function(i){return i&&"current"in i?i.current:i},gN=function(i,c){return i[0]===c[0]&&i[1]===c[1]},pN=function(i){return`
|
||||
.block-interactivity-`.concat(i,` {pointer-events: none;}
|
||||
.allow-interactivity-`).concat(i,` {pointer-events: all;}
|
||||
`)},bN=0,au=[];function xN(i){var c=g.useRef([]),r=g.useRef([0,0]),o=g.useRef(),f=g.useState(bN++)[0],m=g.useState(Zp)[0],v=g.useRef(i);g.useEffect(function(){v.current=i},[i]),g.useEffect(function(){if(i.inert){document.body.classList.add("block-interactivity-".concat(f));var M=YE([i.lockRef.current],(i.shards||[]).map(yg),!0).filter(Boolean);return M.forEach(function(H){return H.classList.add("allow-interactivity-".concat(f))}),function(){document.body.classList.remove("block-interactivity-".concat(f)),M.forEach(function(H){return H.classList.remove("allow-interactivity-".concat(f))})}}},[i.inert,i.lockRef.current,i.shards]);var p=g.useCallback(function(M,H){if("touches"in M&&M.touches.length===2||M.type==="wheel"&&M.ctrlKey)return!v.current.allowPinchZoom;var Z=$c(M),Q=r.current,V="deltaX"in M?M.deltaX:Q[0]-Z[0],P="deltaY"in M?M.deltaY:Q[1]-Z[1],F,G=M.target,U=Math.abs(V)>Math.abs(P)?"h":"v";if("touches"in M&&U==="h"&&G.type==="range")return!1;var k=window.getSelection(),ce=k&&k.anchorNode,xe=ce?ce===G||ce.contains(G):!1;if(xe)return!1;var he=hg(U,G);if(!he)return!0;if(he?F=U:(F=U==="v"?"h":"v",he=hg(U,G)),!he)return!1;if(!o.current&&"changedTouches"in M&&(V||P)&&(o.current=F),!F)return!0;var se=o.current||F;return yN(se,H,M,se==="h"?V:P)},[]),E=g.useCallback(function(M){var H=M;if(!(!au.length||au[au.length-1]!==m)){var Z="deltaY"in H?vg(H):$c(H),Q=c.current.filter(function(F){return F.name===H.type&&(F.target===H.target||H.target===F.shadowParent)&&gN(F.delta,Z)})[0];if(Q&&Q.should){H.cancelable&&H.preventDefault();return}if(!Q){var V=(v.current.shards||[]).map(yg).filter(Boolean).filter(function(F){return F.contains(H.target)}),P=V.length>0?p(H,V[0]):!v.current.noIsolation;P&&H.cancelable&&H.preventDefault()}}},[]),b=g.useCallback(function(M,H,Z,Q){var V={name:M,delta:H,target:Z,should:Q,shadowParent:SN(Z)};c.current.push(V),setTimeout(function(){c.current=c.current.filter(function(P){return P!==V})},1)},[]),N=g.useCallback(function(M){r.current=$c(M),o.current=void 0},[]),y=g.useCallback(function(M){b(M.type,vg(M),M.target,p(M,i.lockRef.current))},[]),T=g.useCallback(function(M){b(M.type,$c(M),M.target,p(M,i.lockRef.current))},[]);g.useEffect(function(){return au.push(m),i.setCallbacks({onScrollCapture:y,onWheelCapture:y,onTouchMoveCapture:T}),document.addEventListener("wheel",E,nu),document.addEventListener("touchmove",E,nu),document.addEventListener("touchstart",N,nu),function(){au=au.filter(function(M){return M!==m}),document.removeEventListener("wheel",E,nu),document.removeEventListener("touchmove",E,nu),document.removeEventListener("touchstart",N,nu)}},[]);var B=i.removeScrollBar,D=i.inert;return g.createElement(g.Fragment,null,D?g.createElement(m,{styles:pN(f)}):null,B?g.createElement(oN,{noRelative:i.noRelative,gapMode:i.gapMode}):null)}function SN(i){for(var c=null;i!==null;)i instanceof ShadowRoot&&(c=i.host,i=i.host),i=i.parentNode;return c}const EN=FE(Qp,xN);var Fp=g.forwardRef(function(i,c){return g.createElement(dr,Al({},i,{ref:c,sideCar:EN}))});Fp.classNames=dr.classNames;var NN=function(i){if(typeof document>"u")return null;var c=Array.isArray(i)?i[0]:i;return c.ownerDocument.body},uu=new WeakMap,Pc=new WeakMap,Wc={},mf=0,$p=function(i){return i&&(i.host||$p(i.parentNode))},CN=function(i,c){return c.map(function(r){if(i.contains(r))return r;var o=$p(r);return o&&i.contains(o)?o:(console.error("aria-hidden",r,"in not contained inside",i,". Doing nothing"),null)}).filter(function(r){return!!r})},TN=function(i,c,r,o){var f=CN(c,Array.isArray(i)?i:[i]);Wc[r]||(Wc[r]=new WeakMap);var m=Wc[r],v=[],p=new Set,E=new Set(f),b=function(y){!y||p.has(y)||(p.add(y),b(y.parentNode))};f.forEach(b);var N=function(y){!y||E.has(y)||Array.prototype.forEach.call(y.children,function(T){if(p.has(T))N(T);else try{var B=T.getAttribute(o),D=B!==null&&B!=="false",M=(uu.get(T)||0)+1,H=(m.get(T)||0)+1;uu.set(T,M),m.set(T,H),v.push(T),M===1&&D&&Pc.set(T,!0),H===1&&T.setAttribute(r,"true"),D||T.setAttribute(o,"true")}catch(Z){console.error("aria-hidden: cannot operate on ",T,Z)}})};return N(c),p.clear(),mf++,function(){v.forEach(function(y){var T=uu.get(y)-1,B=m.get(y)-1;uu.set(y,T),m.set(y,B),T||(Pc.has(y)||y.removeAttribute(o),Pc.delete(y)),B||y.removeAttribute(r)}),mf--,mf||(uu=new WeakMap,uu=new WeakMap,Pc=new WeakMap,Wc={})}},_N=function(i,c,r){r===void 0&&(r="data-aria-hidden");var o=Array.from(Array.isArray(i)?i:[i]),f=NN(i);return f?(o.push.apply(o,Array.from(f.querySelectorAll("[aria-live], script"))),TN(o,f,r,"aria-hidden")):function(){return null}},wN=Object.defineProperty,il=(i,c)=>wN(i,"name",{value:c,configurable:!0}),If="Dialog",[Pp,xC]=sa(If),[ON,Jl]=Pp(If),Wp=il(i=>{const{__scopeDialog:c,children:r,open:o,defaultOpen:f,onOpenChange:m,modal:v=!0}=i,p=g.useRef(null),E=g.useRef(null),{nodes:b,registry:N}=Hp(),[y,T]=mi({prop:o,defaultProp:f??!1,onChange:m,caller:If}),[B,D]=g.useState(0),[M,H]=g.useState(0);return d.jsx(ON,{scope:c,triggerRef:p,contentRef:E,contentId:al(),titleId:al(),descriptionId:al()
Line truncated
|
||||
@@ -1 +0,0 @@
|
||||
/*! tailwindcss v4.3.5 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--blur-sm:8px;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-Line truncated
|
||||
Vendored
+2
-2
@@ -11,8 +11,8 @@
|
||||
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<script type="module" crossorigin src="/assets/index-CC6K5dbV.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-R7AnvXyQ.css">
|
||||
<script type="module" crossorigin src="/assets/index-DE2eKnU3.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-CYjCaNsV.css">
|
||||
</head>
|
||||
<body class="min-h-screen">
|
||||
<div id="root"></div>
|
||||
|
||||
Generated
+711
-1
@@ -8,7 +8,15 @@
|
||||
"name": "homelab-console",
|
||||
"version": "3.0.0",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-dialog": "^1.3.1",
|
||||
"@radix-ui/react-label": "^2.1.17",
|
||||
"@radix-ui/react-separator": "^1.2.0",
|
||||
"@radix-ui/react-slot": "^1.5.0",
|
||||
"@radix-ui/react-switch": "^1.4.1",
|
||||
"@radix-ui/react-tabs": "^1.2.1",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"cmdk": "^1.1.1",
|
||||
"lucide-react": "^0.475.0",
|
||||
"react": "^19.0.0",
|
||||
"react-dom": "^19.0.0",
|
||||
@@ -799,6 +807,535 @@
|
||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/primitive": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.2.0.tgz",
|
||||
"integrity": "sha512-KABY+VMIRPJL+Vyzv/335FEhXXD/xDv8BMb1kl48/aXJZMH0LtHCTx5ga5RnxaEP3nZHtmTLf1P9vanmFX46bw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@radix-ui/react-collection": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.2.0.tgz",
|
||||
"integrity": "sha512-+yiQzqcc7Sy7/5s0jrMCjpPRFB3538VNrXPWdTLZhE/SCfgEws4aI6lHWN/vvcnyhHndROWBzqmqB4QBrITZ9Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-compose-refs": "1.1.5",
|
||||
"@radix-ui/react-context": "1.3.0",
|
||||
"@radix-ui/react-primitive": "2.2.0",
|
||||
"@radix-ui/react-slot": "1.5.0",
|
||||
"@radix-ui/react-use-layout-effect": "1.1.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-compose-refs": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz",
|
||||
"integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-context": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.3.0.tgz",
|
||||
"integrity": "sha512-v5AYEocMISkbJ+1fTXzZpiFv7NRr3D2WiYbLIKf+FkmJ8VkP6d503eV2n34MFussHXY1pcoq3yfJiQH77dc4Mg==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-dialog": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.3.1.tgz",
|
||||
"integrity": "sha512-+0E4qvVTwjAWra9sEhJ+9BTsvHE00zkUuNw1VGh7S+Gc13dfYk+S1PVQdchWDj+XYHhAai7Z7IpzXVDCGsDplg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/primitive": "1.2.0",
|
||||
"@radix-ui/react-compose-refs": "1.1.5",
|
||||
"@radix-ui/react-context": "1.3.0",
|
||||
"@radix-ui/react-dismissable-layer": "1.2.1",
|
||||
"@radix-ui/react-focus-guards": "1.2.0",
|
||||
"@radix-ui/react-focus-scope": "1.3.1",
|
||||
"@radix-ui/react-id": "1.1.4",
|
||||
"@radix-ui/react-portal": "1.2.0",
|
||||
"@radix-ui/react-presence": "1.1.11",
|
||||
"@radix-ui/react-primitive": "2.2.0",
|
||||
"@radix-ui/react-slot": "1.5.0",
|
||||
"@radix-ui/react-use-controllable-state": "1.3.0",
|
||||
"@radix-ui/react-use-layout-effect": "1.1.4",
|
||||
"aria-hidden": "^1.2.4",
|
||||
"react-remove-scroll": "^2.7.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-direction": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.2.0.tgz",
|
||||
"integrity": "sha512-FtRA52a/r+LKStFT+neLUm+8vSe7wbzkbQGGeU8ixFiwC8NU14Evoq9ATECqL3eGbcUzJR4fyfA4KkK/q6dfqg==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-dismissable-layer": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.2.1.tgz",
|
||||
"integrity": "sha512-KIfDcAsx+oVylFZ4xryVKusJUrLLhTQmfnJW4kwk4Km5myvhHCrj04hnWWUC166+xD4DHdH8tQGylwYX1h6+Pg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/primitive": "1.2.0",
|
||||
"@radix-ui/react-compose-refs": "1.1.5",
|
||||
"@radix-ui/react-primitive": "2.2.0",
|
||||
"@radix-ui/react-use-callback-ref": "1.1.5",
|
||||
"@radix-ui/react-use-effect-event": "0.0.5"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-focus-guards": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.2.0.tgz",
|
||||
"integrity": "sha512-MPm5R0iRGUDrDnPNxmLBkv+X7pN4XKzt+MbWJEuJQsH3NFH4omrbpXpucyYCCKTSt+na/ZxGhEWQrWTZ0285cA==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-focus-scope": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.3.1.tgz",
|
||||
"integrity": "sha512-ugeMhbXt4y5S2T1GnIqbWDKEN962PDwnX1fN0eKOOgf5f63Dh2mn8F1FUySlgW0iF6GiVsRF32DzuDIWTUyQJg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-compose-refs": "1.1.5",
|
||||
"@radix-ui/react-primitive": "2.2.0",
|
||||
"@radix-ui/react-use-callback-ref": "1.1.5"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-id": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz",
|
||||
"integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-use-layout-effect": "1.1.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-label": {
|
||||
"version": "2.1.17",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.17.tgz",
|
||||
"integrity": "sha512-xmj7MN/drx1oUAXkfiFIvyDmGNUIN/omGobvA5oAoNqu9zO2MkISYGZOkBcqSzs/UZXXwV+/3ACRE7q7mGcmkA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-primitive": "2.2.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-portal": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.2.0.tgz",
|
||||
"integrity": "sha512-StX7xXnaRU41VvFtMm9zlhVGz8XF6GmWWTXftkQaY+tqVkbs/R9UmAp5mLzHHapk5hM9RMZQvO/3usyIP/g42g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-primitive": "2.2.0",
|
||||
"@radix-ui/react-use-layout-effect": "1.1.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-presence": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.11.tgz",
|
||||
"integrity": "sha512-Z7/atlkab36Z8hm+V8zYc79r0W+tiOB1o0tun1By94JyadkekLQmtEAnBSP9XKXBNQsStoStS4+gX10JpS5akA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-use-layout-effect": "1.1.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-primitive": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.2.0.tgz",
|
||||
"integrity": "sha512-HCTSPMNqv55Qk0IX4geJbpyXazmqulcimwuyjxTkKi29v+QZbG2Zho9BnbBq4YS2PF+KlNb2CXoLz66uUmblkg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-slot": "1.5.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-roving-focus": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.2.1.tgz",
|
||||
"integrity": "sha512-UwraORzVUeEPMclhO1p0vz0qI+TbdDLO9i+FiOqhJyHKwdpCRCck9yVEscUnAMIzCiuNoQa8D4A9bIpOPXGt6Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/primitive": "1.2.0",
|
||||
"@radix-ui/react-collection": "1.2.0",
|
||||
"@radix-ui/react-compose-refs": "1.1.5",
|
||||
"@radix-ui/react-context": "1.3.0",
|
||||
"@radix-ui/react-direction": "1.2.0",
|
||||
"@radix-ui/react-id": "1.1.4",
|
||||
"@radix-ui/react-primitive": "2.2.0",
|
||||
"@radix-ui/react-use-callback-ref": "1.1.5",
|
||||
"@radix-ui/react-use-controllable-state": "1.3.0",
|
||||
"@radix-ui/react-use-is-hydrated": "0.1.3",
|
||||
"@radix-ui/react-use-layout-effect": "1.1.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-separator": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.2.0.tgz",
|
||||
"integrity": "sha512-1jUAap0wZEqVP05Ou7kJgRxe/W+Qftng+rUNWGa0qkKbv9r5pWTG3E7a3ELKo2eJoHKMECnzuYrZpSyO1YgcYQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-primitive": "2.2.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-slot": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.5.0.tgz",
|
||||
"integrity": "sha512-tyYd9ddPXAysAbdbD9eYxgwpCSv6f3PncqVSNKQFSR5lcJVLz3cb/pANDoYrLiHBpXv7skortyUgGUWsYuPPFQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-compose-refs": "1.1.5"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-switch": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.4.1.tgz",
|
||||
"integrity": "sha512-NpBGwc40rY02ZmSvuyeKk0Bvc8ZsNeTMi4qHvJ+ZH4EiYCv0zIXEgdCW4bVdzgIUeP9xxbLJSxKOUfqITYNmkA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/primitive": "1.2.0",
|
||||
"@radix-ui/react-compose-refs": "1.1.5",
|
||||
"@radix-ui/react-context": "1.3.0",
|
||||
"@radix-ui/react-primitive": "2.2.0",
|
||||
"@radix-ui/react-use-controllable-state": "1.3.0",
|
||||
"@radix-ui/react-use-size": "1.1.5"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-tabs": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.2.1.tgz",
|
||||
"integrity": "sha512-hRoJlode+hg5ZNlR+3tkfkUliIybdTpD5lkAvHQ9yaXseGf7XVO9Ib2GPEIOuaJJbo7YWYbNpDDRfo8Dhf6/xA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/primitive": "1.2.0",
|
||||
"@radix-ui/react-context": "1.3.0",
|
||||
"@radix-ui/react-direction": "1.2.0",
|
||||
"@radix-ui/react-id": "1.1.4",
|
||||
"@radix-ui/react-presence": "1.1.11",
|
||||
"@radix-ui/react-primitive": "2.2.0",
|
||||
"@radix-ui/react-roving-focus": "1.2.1",
|
||||
"@radix-ui/react-use-controllable-state": "1.3.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"@types/react-dom": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
|
||||
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"@types/react-dom": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-use-callback-ref": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.5.tgz",
|
||||
"integrity": "sha512-Y5GBf4NKeADoXI1geiMlMuMoURT3k9MizzzKhGb/m55H94aGigZ01PIpkvsO6lML13BA6XYAXSJ6gza7vTn5nw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-use-layout-effect": "1.1.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-use-controllable-state": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.3.0.tgz",
|
||||
"integrity": "sha512-TAcBI7bw2ljYCbv4+zuTSd6zICu8pRt6SDN2vJ/Z06K2MXh6I9WYFe/A9ovlFDtR5HVHGm5iDxDoABm/++dbKg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/primitive": "1.2.0",
|
||||
"@radix-ui/react-use-effect-event": "0.0.5",
|
||||
"@radix-ui/react-use-layout-effect": "1.1.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-use-effect-event": {
|
||||
"version": "0.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz",
|
||||
"integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-use-layout-effect": "1.1.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-use-is-hydrated": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz",
|
||||
"integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-use-layout-effect": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz",
|
||||
"integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@radix-ui/react-use-size": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.5.tgz",
|
||||
"integrity": "sha512-V1McDQkMGzgivwqdu7u96APs7oi0Jvj9LTzgq3WWrDZqxWdAqU9yZnZQqk5OizGFR8badUQwZsrlao7MOlWYOA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-use-layout-effect": "1.1.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/pluginutils": {
|
||||
"version": "1.0.0-beta.27",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
|
||||
@@ -1625,7 +2162,7 @@
|
||||
"version": "19.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz",
|
||||
"integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@types/react": "^19.3.0"
|
||||
@@ -1652,6 +2189,18 @@
|
||||
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/aria-hidden": {
|
||||
"version": "1.2.6",
|
||||
"resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
|
||||
"integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"tslib": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/baseline-browser-mapping": {
|
||||
"version": "2.11.35",
|
||||
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.35.tgz",
|
||||
@@ -1720,6 +2269,18 @@
|
||||
],
|
||||
"license": "CC-BY-4.0"
|
||||
},
|
||||
"node_modules/class-variance-authority": {
|
||||
"version": "0.7.1",
|
||||
"resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
|
||||
"integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"clsx": "^2.1.1"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://polar.sh/cva"
|
||||
}
|
||||
},
|
||||
"node_modules/clsx": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
|
||||
@@ -1729,6 +2290,22 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/cmdk": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz",
|
||||
"integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@radix-ui/react-compose-refs": "^1.1.1",
|
||||
"@radix-ui/react-dialog": "^1.1.6",
|
||||
"@radix-ui/react-id": "^1.1.0",
|
||||
"@radix-ui/react-primitive": "^2.0.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^18 || ^19 || ^19.0.0-rc",
|
||||
"react-dom": "^18 || ^19 || ^19.0.0-rc"
|
||||
}
|
||||
},
|
||||
"node_modules/convert-source-map": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
|
||||
@@ -1771,6 +2348,12 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/detect-node-es": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
|
||||
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/electron-to-chromium": {
|
||||
"version": "1.5.478",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.478.tgz",
|
||||
@@ -1887,6 +2470,15 @@
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/get-nonce": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
|
||||
"integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/graceful-fs": {
|
||||
"version": "4.2.11",
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||
@@ -2355,6 +2947,75 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-remove-scroll": {
|
||||
"version": "2.7.2",
|
||||
"resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
|
||||
"integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"react-remove-scroll-bar": "^2.3.7",
|
||||
"react-style-singleton": "^2.2.3",
|
||||
"tslib": "^2.1.0",
|
||||
"use-callback-ref": "^1.3.3",
|
||||
"use-sidecar": "^1.1.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/react-remove-scroll-bar": {
|
||||
"version": "2.3.8",
|
||||
"resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
|
||||
"integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"react-style-singleton": "^2.2.2",
|
||||
"tslib": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/react-style-singleton": {
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
|
||||
"integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"get-nonce": "^1.0.0",
|
||||
"tslib": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/rollup": {
|
||||
"version": "4.67.5",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.67.5.tgz",
|
||||
@@ -2475,6 +3136,12 @@
|
||||
"url": "https://github.com/sponsors/SuperchupuDev"
|
||||
}
|
||||
},
|
||||
"node_modules/tslib": {
|
||||
"version": "2.9.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.9.1.tgz",
|
||||
"integrity": "sha512-a4Ux9VKuIMHsOS7ENbEq6hK2ZGYIT27Rtl0E4eD9KqwxhKiQeMZE/9xb3IdYwWaSOyIBQLExhQgXDTYoiCxnWA==",
|
||||
"license": "0BSD"
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "5.9.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
||||
@@ -2520,6 +3187,49 @@
|
||||
"browserslist": ">= 4.21.0"
|
||||
}
|
||||
},
|
||||
"node_modules/use-callback-ref": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
|
||||
"integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"tslib": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/use-sidecar": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
|
||||
"integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"detect-node-es": "^1.1.0",
|
||||
"tslib": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "*",
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "6.4.5",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.4.5.tgz",
|
||||
|
||||
@@ -9,7 +9,15 @@
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@radix-ui/react-dialog": "^1.3.1",
|
||||
"@radix-ui/react-label": "^2.1.17",
|
||||
"@radix-ui/react-separator": "^1.2.0",
|
||||
"@radix-ui/react-slot": "^1.5.0",
|
||||
"@radix-ui/react-switch": "^1.4.1",
|
||||
"@radix-ui/react-tabs": "^1.2.1",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"cmdk": "^1.1.1",
|
||||
"lucide-react": "^0.475.0",
|
||||
"react": "^19.0.0",
|
||||
"react-dom": "^19.0.0",
|
||||
@@ -20,9 +28,9 @@
|
||||
"@tailwindcss/vite": "^4.0.6",
|
||||
"@types/react": "^19.0.8",
|
||||
"@types/react-dom": "^19.0.3",
|
||||
"@vitejs/plugin-react": "^4.3.4",
|
||||
"tailwindcss": "^4.0.6",
|
||||
"typescript": "^5.7.3",
|
||||
"vite": "^6.1.0",
|
||||
"@vitejs/plugin-react": "^4.3.4"
|
||||
"vite": "^6.1.0"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { usePortalStore } from '../store/usePortalStore';
|
||||
import { AuthGateCard } from './AuthGateModal';
|
||||
import { Button } from './ui/button';
|
||||
import { Dialog, DialogContent, DialogDescription, DialogTitle } from './ui/dialog';
|
||||
|
||||
export const AgyTerminalModal: React.FC = () => {
|
||||
const { showAgyModal, setShowAgyModal, getEffectiveMode } = usePortalStore();
|
||||
@@ -35,12 +37,15 @@ export const AgyTerminalModal: React.FC = () => {
|
||||
});
|
||||
}, [showAgyModal, mode]);
|
||||
|
||||
if (!showAgyModal) return null;
|
||||
|
||||
return (
|
||||
<div className="fixed inset-0 z-50 bg-black/75 backdrop-blur-sm flex items-center justify-center p-3 sm:p-6">
|
||||
<div className="w-full h-full max-w-6xl hl-card flex flex-col overflow-hidden shadow-2xl">
|
||||
<div className="px-4 py-2.5 border-b hl-border flex items-center justify-between hl-muted">
|
||||
<Dialog open={showAgyModal} onOpenChange={setShowAgyModal}>
|
||||
<DialogContent className="w-[95vw] max-w-6xl h-[88vh] flex flex-col overflow-hidden p-0">
|
||||
<DialogTitle className="sr-only">AGY 云端工作台</DialogTitle>
|
||||
<DialogDescription className="sr-only">
|
||||
M6 Mac mini 上的 24 小时 tmux 常驻 AI 编程终端
|
||||
</DialogDescription>
|
||||
|
||||
<div className="px-4 py-2.5 border-b hl-border flex items-center justify-between hl-muted shrink-0">
|
||||
<div className="flex items-center gap-2.5">
|
||||
<img
|
||||
src="https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/google-gemini.png"
|
||||
@@ -52,29 +57,34 @@ export const AgyTerminalModal: React.FC = () => {
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<Button variant="outline" size="sm" asChild>
|
||||
<a
|
||||
href={url}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="hl-btn-outline px-2.5 py-1 text-xs font-mono-num"
|
||||
className="font-mono-num"
|
||||
>
|
||||
新标签页全屏 ↗
|
||||
</a>
|
||||
<button
|
||||
onClick={() => setShowAgyModal(false)}
|
||||
className="hl-btn-primary px-3 py-1 text-xs cursor-pointer"
|
||||
>
|
||||
</Button>
|
||||
<Button size="sm" onClick={() => setShowAgyModal(false)}>
|
||||
收起终端
|
||||
</button>
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{!authChecked ? (
|
||||
<div className="flex-1 flex items-center justify-center text-xs font-mono-num" style={{ color: 'var(--text-muted)' }}>
|
||||
<div
|
||||
className="flex-1 flex items-center justify-center text-xs font-mono-num"
|
||||
style={{ color: 'var(--text-muted)' }}
|
||||
>
|
||||
正在校验 HomeLab SSO 通行证...
|
||||
</div>
|
||||
) : !authenticated ? (
|
||||
<div className="flex-1 flex items-center justify-center p-4" style={{ backgroundColor: 'var(--bg-page)' }}>
|
||||
<div
|
||||
className="flex-1 flex items-center justify-center p-4"
|
||||
style={{ backgroundColor: 'var(--bg-page)' }}
|
||||
>
|
||||
<AuthGateCard
|
||||
targetUrl={url}
|
||||
onSuccess={() => setAuthenticated(true)}
|
||||
@@ -82,9 +92,13 @@ export const AgyTerminalModal: React.FC = () => {
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<iframe src={url} title="AGY Cloud Workbench" className="w-full flex-1 bg-black border-0" />
|
||||
<iframe
|
||||
src={url}
|
||||
title="AGY Cloud Workbench"
|
||||
className="w-full flex-1 bg-black border-0"
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
);
|
||||
};
|
||||
@@ -1,5 +1,10 @@
|
||||
import React, { useState } from 'react';
|
||||
import { Check, Eye, EyeOff, Lock, ShieldCheck, Terminal, User } from 'lucide-react';
|
||||
import { Eye, EyeOff, Lock, ShieldCheck, Terminal, User } from 'lucide-react';
|
||||
import { Badge } from './ui/badge';
|
||||
import { Button } from './ui/button';
|
||||
import { Card } from './ui/card';
|
||||
import { InputGroup } from './ui/input';
|
||||
import { Switch } from './ui/switch';
|
||||
|
||||
interface AuthGateCardProps {
|
||||
targetUrl?: string;
|
||||
@@ -50,11 +55,7 @@ export const AuthGateCard: React.FC<AuthGateCardProps> = ({
|
||||
};
|
||||
|
||||
return (
|
||||
<div
|
||||
className={`w-full max-w-md hl-card p-6 space-y-5 ${
|
||||
embedded ? '' : 'shadow-2xl'
|
||||
}`}
|
||||
>
|
||||
<Card className={`w-full max-w-md p-6 space-y-5 ${embedded ? '' : 'shadow-2xl'}`}>
|
||||
{/* Header */}
|
||||
<div className="flex items-start justify-between gap-3 border-b hl-border pb-4">
|
||||
<div className="flex items-center gap-3">
|
||||
@@ -67,14 +68,12 @@ export const AuthGateCard: React.FC<AuthGateCardProps> = ({
|
||||
<div>
|
||||
<div className="flex items-center gap-2">
|
||||
<h3 className="text-sm font-bold tracking-tight">HomeLab 统一安全通行证</h3>
|
||||
<span
|
||||
className="text-[10px] font-mono-num px-1.5 py-0.5 rounded font-semibold"
|
||||
style={{ backgroundColor: 'var(--success-soft)', color: 'var(--success)' }}
|
||||
>
|
||||
SSO 2.0
|
||||
</span>
|
||||
<Badge variant="success">SSO 2.0</Badge>
|
||||
</div>
|
||||
<p className="text-xs font-mono-num mt-0.5 truncate max-w-[260px]" style={{ color: 'var(--text-muted)' }}>
|
||||
<p
|
||||
className="text-xs font-mono-num mt-0.5 truncate max-w-[260px]"
|
||||
style={{ color: 'var(--text-muted)' }}
|
||||
>
|
||||
{targetUrl}
|
||||
</p>
|
||||
</div>
|
||||
@@ -87,7 +86,7 @@ export const AuthGateCard: React.FC<AuthGateCardProps> = ({
|
||||
<label className="block text-xs font-semibold" style={{ color: 'var(--text-muted)' }}>
|
||||
管理员账号 (Username)
|
||||
</label>
|
||||
<div className="hl-input-group">
|
||||
<InputGroup>
|
||||
<User className="w-4 h-4 shrink-0" style={{ color: 'var(--text-subtle)' }} />
|
||||
<input
|
||||
type="text"
|
||||
@@ -97,7 +96,7 @@ export const AuthGateCard: React.FC<AuthGateCardProps> = ({
|
||||
placeholder="输入管理员账号 (如 ixvii0iv)"
|
||||
className="font-mono-num"
|
||||
/>
|
||||
</div>
|
||||
</InputGroup>
|
||||
</div>
|
||||
|
||||
<div className="space-y-1.5">
|
||||
@@ -109,7 +108,7 @@ export const AuthGateCard: React.FC<AuthGateCardProps> = ({
|
||||
与 Mac mini 密码一致
|
||||
</span>
|
||||
</div>
|
||||
<div className="hl-input-group">
|
||||
<InputGroup>
|
||||
<Lock className="w-4 h-4 shrink-0" style={{ color: 'var(--text-subtle)' }} />
|
||||
<input
|
||||
type={showPass ? 'text' : 'password'}
|
||||
@@ -129,36 +128,15 @@ export const AuthGateCard: React.FC<AuthGateCardProps> = ({
|
||||
>
|
||||
{showPass ? <EyeOff className="w-3.5 h-3.5" /> : <Eye className="w-3.5 h-3.5" />}
|
||||
</button>
|
||||
</div>
|
||||
</InputGroup>
|
||||
</div>
|
||||
|
||||
{/* Custom Checkbox */}
|
||||
<div className="flex items-center justify-between pt-0.5">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setRememberMe(!rememberMe)}
|
||||
className="flex items-center gap-2 text-xs cursor-pointer select-none"
|
||||
style={{ color: 'var(--text-muted)' }}
|
||||
>
|
||||
<span
|
||||
className="w-4 h-4 rounded flex items-center justify-center border transition-colors"
|
||||
style={
|
||||
rememberMe
|
||||
? {
|
||||
backgroundColor: 'var(--accent)',
|
||||
borderColor: 'var(--accent)',
|
||||
color: '#ffffff',
|
||||
}
|
||||
: {
|
||||
backgroundColor: 'var(--bg-muted)',
|
||||
borderColor: 'var(--border-color)',
|
||||
}
|
||||
}
|
||||
>
|
||||
{rememberMe && <Check className="w-3 h-3" />}
|
||||
{/* Official @radix-ui/react-switch Toggle */}
|
||||
<div className="flex items-center justify-between pt-1">
|
||||
<span className="text-xs select-none" style={{ color: 'var(--text-muted)' }}>
|
||||
在此设备保持 30 天免密通行 (*.961504.xyz)
|
||||
</span>
|
||||
<span>在此设备保持 30 天免密通行 (*.961504.xyz)</span>
|
||||
</button>
|
||||
<Switch checked={rememberMe} onCheckedChange={setRememberMe} />
|
||||
</div>
|
||||
|
||||
{errorMsg && (
|
||||
@@ -177,24 +155,16 @@ export const AuthGateCard: React.FC<AuthGateCardProps> = ({
|
||||
{/* Actions */}
|
||||
<div className="flex items-center justify-end gap-2.5 pt-2">
|
||||
{onCancel && (
|
||||
<button
|
||||
type="button"
|
||||
onClick={onCancel}
|
||||
className="hl-btn-outline px-4 py-2 text-xs font-medium cursor-pointer"
|
||||
>
|
||||
<Button type="button" variant="outline" onClick={onCancel}>
|
||||
取消
|
||||
</button>
|
||||
</Button>
|
||||
)}
|
||||
<button
|
||||
type="submit"
|
||||
disabled={loading}
|
||||
className="hl-btn-primary px-5 py-2 text-xs font-semibold flex items-center gap-2 cursor-pointer"
|
||||
>
|
||||
<Button type="submit" disabled={loading} className="px-4">
|
||||
<Terminal className="w-3.5 h-3.5" />
|
||||
<span>{loading ? '正在验证签名...' : '解锁并进入工作台'}</span>
|
||||
</button>
|
||||
</Button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
@@ -1,6 +1,14 @@
|
||||
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { Search } from 'lucide-react';
|
||||
import React, { useMemo } from 'react';
|
||||
import { usePortalStore } from '../store/usePortalStore';
|
||||
import { Badge } from './ui/badge';
|
||||
import {
|
||||
CommandDialog,
|
||||
CommandEmpty,
|
||||
CommandGroup,
|
||||
CommandInput,
|
||||
CommandItem,
|
||||
CommandList,
|
||||
} from './ui/command';
|
||||
|
||||
interface CmdItem {
|
||||
id: string;
|
||||
@@ -21,16 +29,6 @@ export const CommandPalette: React.FC = () => {
|
||||
getEffectiveMode,
|
||||
} = usePortalStore();
|
||||
|
||||
const [query, setQuery] = useState('');
|
||||
const inputRef = useRef<HTMLInputElement>(null);
|
||||
|
||||
useEffect(() => {
|
||||
if (showCmdPalette) {
|
||||
setQuery('');
|
||||
setTimeout(() => inputRef.current?.focus(), 20);
|
||||
}
|
||||
}, [showCmdPalette]);
|
||||
|
||||
const commands = useMemo<CmdItem[]>(() => {
|
||||
const mode = getEffectiveMode();
|
||||
const resolve = (edge: string, home: string, lan: string) =>
|
||||
@@ -156,86 +154,32 @@ export const CommandPalette: React.FC = () => {
|
||||
];
|
||||
}, [getEffectiveMode, setShowAgyModal, setTheme, triggerAction, copyCmd]);
|
||||
|
||||
const filtered = useMemo(() => {
|
||||
const q = query.trim().toLowerCase();
|
||||
if (!q) return commands;
|
||||
return commands.filter(
|
||||
(c) => c.title.toLowerCase().includes(q) || c.hint.toLowerCase().includes(q)
|
||||
);
|
||||
}, [query, commands]);
|
||||
|
||||
if (!showCmdPalette) return null;
|
||||
|
||||
const execute = (cmd: CmdItem) => {
|
||||
return (
|
||||
<CommandDialog open={showCmdPalette} onOpenChange={setShowCmdPalette}>
|
||||
<CommandInput placeholder="输入服务名称、SSH 指令、路由模式或主题..." />
|
||||
<CommandList>
|
||||
<CommandEmpty>未找到匹配的指令或服务</CommandEmpty>
|
||||
<CommandGroup heading="快速操作与服务直达 (cmdk + Radix Dialog)">
|
||||
{commands.map((cmd) => (
|
||||
<CommandItem
|
||||
key={cmd.id}
|
||||
value={`${cmd.title} ${cmd.hint} ${cmd.type}`}
|
||||
onSelect={() => {
|
||||
setShowCmdPalette(false);
|
||||
cmd.run();
|
||||
};
|
||||
|
||||
return (
|
||||
<div
|
||||
onClick={(e) => {
|
||||
if (e.target === e.currentTarget) setShowCmdPalette(false);
|
||||
}}
|
||||
className="fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-start justify-center pt-20 px-4"
|
||||
>
|
||||
<div className="w-full max-w-xl hl-card overflow-hidden shadow-2xl">
|
||||
<div className="px-4 py-3 border-b hl-border flex items-center gap-3">
|
||||
<Search className="w-4 h-4" style={{ color: 'var(--text-muted)' }} />
|
||||
<input
|
||||
ref={inputRef}
|
||||
value={query}
|
||||
onChange={(e) => setQuery(e.target.value)}
|
||||
type="text"
|
||||
placeholder="输入服务名称、SSH 指令、路由模式或主题..."
|
||||
className="w-full bg-transparent text-sm outline-none"
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Escape') setShowCmdPalette(false);
|
||||
if (e.key === 'Enter' && filtered.length > 0) execute(filtered[0]);
|
||||
}}
|
||||
/>
|
||||
<kbd
|
||||
className="px-1.5 py-0.5 text-[10px] font-mono-num rounded hl-muted"
|
||||
style={{ color: 'var(--text-muted)' }}
|
||||
>
|
||||
ESC
|
||||
</kbd>
|
||||
</div>
|
||||
|
||||
<div className="max-h-80 overflow-y-auto p-2 text-xs">
|
||||
<div
|
||||
className="px-2.5 py-1 text-[10px] font-semibold uppercase tracking-wider"
|
||||
style={{ color: 'var(--text-subtle)' }}
|
||||
>
|
||||
快速操作与服务直达
|
||||
</div>
|
||||
{filtered.map((cmd) => (
|
||||
<button
|
||||
key={cmd.id}
|
||||
onClick={() => execute(cmd)}
|
||||
className="w-full px-3 py-2 rounded-lg text-left flex items-center justify-between transition-colors cursor-pointer"
|
||||
onMouseEnter={(e) => {
|
||||
e.currentTarget.style.backgroundColor = 'var(--bg-muted)';
|
||||
}}
|
||||
onMouseLeave={(e) => {
|
||||
e.currentTarget.style.backgroundColor = 'transparent';
|
||||
}}
|
||||
>
|
||||
<div className="flex items-center gap-2.5">
|
||||
<span className="font-medium">{cmd.title}</span>
|
||||
<span className="font-mono-num text-[11px]" style={{ color: 'var(--text-muted)' }}>
|
||||
<span className="font-mono-num text-[11px] text-[var(--text-muted)]">
|
||||
{cmd.hint}
|
||||
</span>
|
||||
</div>
|
||||
<span
|
||||
className="text-[10px] font-mono-num px-1.5 py-0.5 rounded hl-muted"
|
||||
style={{ color: 'var(--text-muted)' }}
|
||||
>
|
||||
{cmd.type}
|
||||
</span>
|
||||
</button>
|
||||
<Badge variant="secondary">{cmd.type}</Badge>
|
||||
</CommandItem>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</CommandGroup>
|
||||
</CommandList>
|
||||
</CommandDialog>
|
||||
);
|
||||
};
|
||||
@@ -15,6 +15,12 @@ import { usePortalStore } from '../store/usePortalStore';
|
||||
import { AuthGateCard } from './AuthGateModal';
|
||||
import { ServiceCard } from './ServiceCard';
|
||||
import { SshShelf } from './SshShelf';
|
||||
import { Badge } from './ui/badge';
|
||||
import { Button } from './ui/button';
|
||||
import { Card } from './ui/card';
|
||||
import { Input, InputGroup } from './ui/input';
|
||||
import { Switch } from './ui/switch';
|
||||
import { Tabs, TabsList, TabsTrigger } from './ui/tabs';
|
||||
|
||||
type StoryId =
|
||||
| 'layout-architecture'
|
||||
@@ -32,6 +38,7 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
setTheme,
|
||||
setLayoutPreset,
|
||||
setViewMode,
|
||||
setShowCmdPalette,
|
||||
telemetry,
|
||||
showToast,
|
||||
} = usePortalStore();
|
||||
@@ -43,6 +50,7 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
// Interactive Playground Props for Form Inputs story
|
||||
const [demoSearch, setDemoSearch] = useState('');
|
||||
const [demoHost, setDemoHost] = useState('192.168.31.164');
|
||||
const [demoSwitch, setDemoSwitch] = useState(true);
|
||||
|
||||
const stories: Array<{ id: StoryId; group: string; title: string; icon: React.ReactNode }> = [
|
||||
{
|
||||
@@ -59,19 +67,19 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
},
|
||||
{
|
||||
id: 'form-inputs',
|
||||
group: 'COMPONENTS / 核心组件',
|
||||
title: '03. Input & AuthGate 输入框与登录弹窗',
|
||||
group: 'SHADCN / RADIX UI 组件',
|
||||
title: '03. shadcn/ui + Radix 原语与认证弹窗',
|
||||
icon: <KeyRound className="w-3.5 h-3.5" />,
|
||||
},
|
||||
{
|
||||
id: 'service-card',
|
||||
group: 'COMPONENTS / 核心组件',
|
||||
group: 'SHADCN / RADIX UI 组件',
|
||||
title: '04. ServiceCard 内联遥测卡片',
|
||||
icon: <Layers className="w-3.5 h-3.5" />,
|
||||
},
|
||||
{
|
||||
id: 'ssh-shelf',
|
||||
group: 'COMPONENTS / 核心组件',
|
||||
group: 'SHADCN / RADIX UI 组件',
|
||||
title: '05. SshShelf 快捷指令栏',
|
||||
icon: <Terminal className="w-3.5 h-3.5" />,
|
||||
},
|
||||
@@ -81,13 +89,13 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
<div className="flex-1 max-w-7xl w-full mx-auto px-4 sm:px-6 lg:px-8 py-6">
|
||||
<div className="grid grid-cols-1 lg:grid-cols-4 gap-6 items-start">
|
||||
{/* Left Sidebar: Storybook Navigation Tree */}
|
||||
<aside className="hl-card p-4 space-y-4 lg:sticky lg:top-20">
|
||||
<Card className="p-4 space-y-4 lg:sticky lg:top-20">
|
||||
<div className="flex items-center justify-between border-b hl-border pb-3">
|
||||
<div className="flex items-center gap-2">
|
||||
<BookOpen className="w-4 h-4" style={{ color: 'var(--accent)' }} />
|
||||
<span className="text-xs font-bold uppercase tracking-wider">Storybook 组件库</span>
|
||||
<span className="text-xs font-bold uppercase tracking-wider">shadcn/ui 组件库</span>
|
||||
</div>
|
||||
<span className="text-[10px] font-mono-num px-1.5 py-0.5 rounded hl-muted">v3.2</span>
|
||||
<Badge variant="accent">Radix + cmdk</Badge>
|
||||
</div>
|
||||
|
||||
<div className="space-y-1">
|
||||
@@ -113,39 +121,27 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
|
||||
<div className="pt-3 border-t hl-border space-y-2 text-xs">
|
||||
<div className="text-[11px] font-semibold" style={{ color: 'var(--text-muted)' }}>
|
||||
全局外观状态预览
|
||||
全局外观状态预览 (@radix-ui/react-tabs)
|
||||
</div>
|
||||
<div className="grid grid-cols-3 gap-1 p-1 rounded-lg hl-muted border hl-border">
|
||||
{(['system', 'light', 'dark'] as const).map((t) => (
|
||||
<button
|
||||
key={t}
|
||||
onClick={() => setTheme(t)}
|
||||
className="py-1 rounded text-[11px] font-medium cursor-pointer"
|
||||
style={
|
||||
theme === t
|
||||
? { backgroundColor: 'var(--bg-card)', color: 'var(--text-main)' }
|
||||
: { color: 'var(--text-muted)' }
|
||||
}
|
||||
>
|
||||
{t === 'system' ? '自动' : t === 'light' ? '浅色' : '深色'}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
<button
|
||||
onClick={() => setViewMode('dashboard')}
|
||||
className="w-full hl-btn-primary py-2 text-xs text-center mt-2 cursor-pointer"
|
||||
>
|
||||
<Tabs value={theme} onValueChange={(v) => setTheme(v as 'system' | 'light' | 'dark')}>
|
||||
<TabsList className="w-full grid grid-cols-3">
|
||||
<TabsTrigger value="system">自动</TabsTrigger>
|
||||
<TabsTrigger value="light">浅色</TabsTrigger>
|
||||
<TabsTrigger value="dark">深色</TabsTrigger>
|
||||
</TabsList>
|
||||
</Tabs>
|
||||
<Button onClick={() => setViewMode('dashboard')} className="w-full mt-2">
|
||||
返回中控台主页
|
||||
</button>
|
||||
</Button>
|
||||
</div>
|
||||
</aside>
|
||||
</Card>
|
||||
|
||||
{/* Right Canvas: Interactive Story Preview & Controls */}
|
||||
<div className="lg:col-span-3 space-y-6">
|
||||
{/* STORY 1: Layout Architecture */}
|
||||
{activeStory === 'layout-architecture' && (
|
||||
<div className="space-y-6">
|
||||
<div className="hl-card p-6 space-y-4">
|
||||
<Card className="p-6 space-y-4">
|
||||
<div className="flex items-center justify-between border-b hl-border pb-4">
|
||||
<div>
|
||||
<span
|
||||
@@ -168,7 +164,7 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
{/* Visual Blueprint Diagram of Two-Tier Header */}
|
||||
<div className="p-4 rounded-xl hl-muted border hl-border space-y-2.5 font-mono-num text-xs">
|
||||
<div className="p-3 rounded-lg hl-card flex items-center justify-between">
|
||||
<span>[左] 🍎 HomeLab · 导航切换 (中控台 / Storybook)</span>
|
||||
<span>[左] 🍎 HomeLab · Radix Tabs 切换 (中控台 / Storybook)</span>
|
||||
<span style={{ color: 'var(--accent)' }}>
|
||||
[最右固定] 🔍 搜索 ⌘K · >_ AGY 终端 · ☀️/🌙 主题切换
|
||||
</span>
|
||||
@@ -177,7 +173,7 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
<span style={{ color: 'var(--success)' }}>
|
||||
[左] 实时硬件遥测条 (M6 CPU · RAM · Z4 20TB · SG 专线)
|
||||
</span>
|
||||
<span>[右对齐] 路由模式切换器 (智能路由 / 443 / 10443 / LAN)</span>
|
||||
<span>[右对齐] Radix Tabs 路由切换器 (智能路由 / 443 / 10443 / LAN)</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -225,13 +221,13 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* STORY 2: Theme Tokens */}
|
||||
{activeStory === 'theme-tokens' && (
|
||||
<div className="hl-card p-6 space-y-6">
|
||||
<Card className="p-6 space-y-6">
|
||||
<div className="border-b hl-border pb-4 flex items-center justify-between">
|
||||
<div>
|
||||
<span
|
||||
@@ -244,9 +240,9 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
主流双主题色板规范(当前生效:{resolvedTheme === 'dark' ? '深色极客' : '浅色纯净'})
|
||||
</h2>
|
||||
</div>
|
||||
<span className="text-xs font-mono-num px-2.5 py-1 rounded hl-muted">
|
||||
<Badge variant="secondary">
|
||||
模式: {theme === 'system' ? '跟随设备自动切换' : '手动锁定'}
|
||||
</span>
|
||||
</Badge>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-5">
|
||||
@@ -319,39 +315,75 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
)}
|
||||
|
||||
{/* STORY 3: Custom Form Inputs & AuthGate Card */}
|
||||
{/* STORY 3: Official shadcn/ui + Radix UI Primitives & AuthGate Card */}
|
||||
{activeStory === 'form-inputs' && (
|
||||
<div className="hl-card p-6 space-y-6">
|
||||
<Card className="p-6 space-y-6">
|
||||
<div className="border-b hl-border pb-4 flex items-center justify-between">
|
||||
<div>
|
||||
<span
|
||||
className="text-[11px] font-mono-num uppercase tracking-wider"
|
||||
style={{ color: 'var(--accent)' }}
|
||||
>
|
||||
Components / Form Controls & SSO Auth Gate
|
||||
src/components/ui/* · Official shadcn/ui + Radix Primitives + cmdk
|
||||
</span>
|
||||
<h2 className="text-lg font-bold mt-0.5">
|
||||
统一自定义输入框 (`.hl-input`) 与 SSO 认证卡片(彻底禁用浏览器原生弹窗)
|
||||
开源 `shadcn/ui` 组件库(`Input` / `Button` / `Switch` / `Badge` / `CommandDialog` / `AuthGateCard`)
|
||||
</h2>
|
||||
</div>
|
||||
<KeyRound className="w-4 h-4" style={{ color: 'var(--accent)' }} />
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6 items-start">
|
||||
{/* Left: Input Primitives Showcase */}
|
||||
{/* Left: shadcn/ui Primitives Showcase */}
|
||||
<div className="p-5 rounded-xl hl-muted border hl-border space-y-4">
|
||||
<div className="text-xs font-bold uppercase tracking-wider" style={{ color: 'var(--text-muted)' }}>
|
||||
1. 基础表单输入组件规范 (`.hl-input` / `.hl-input-group`)
|
||||
<div
|
||||
className="text-xs font-bold uppercase tracking-wider"
|
||||
style={{ color: 'var(--text-muted)' }}
|
||||
>
|
||||
1. `src/components/ui/*` 标准原语展示
|
||||
</div>
|
||||
|
||||
{/* Button Variants */}
|
||||
<div className="space-y-1.5">
|
||||
<label className="block text-xs font-medium" style={{ color: 'var(--text-muted)' }}>
|
||||
带前缀图标与快捷键提示的搜索框
|
||||
Button 变体 (`cva` + `@radix-ui/react-slot`)
|
||||
</label>
|
||||
<div className="hl-input-group">
|
||||
<div className="flex flex-wrap items-center gap-2">
|
||||
<Button variant="default">Primary 主按钮</Button>
|
||||
<Button variant="outline">Outline 描边</Button>
|
||||
<Button variant="secondary">Secondary 次级</Button>
|
||||
<Button variant="accent">Accent 高亮</Button>
|
||||
<Button variant="ghost" onClick={() => setShowCmdPalette(true)}>
|
||||
唤起 cmdk 面板 ⌘K
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Badge Variants & Radix Switch */}
|
||||
<div className="space-y-1.5">
|
||||
<label className="block text-xs font-medium" style={{ color: 'var(--text-muted)' }}>
|
||||
Badge 标签与 `@radix-ui/react-switch` 开关
|
||||
</label>
|
||||
<div className="flex flex-wrap items-center justify-between gap-2 p-2.5 rounded-lg hl-card">
|
||||
<div className="flex items-center gap-1.5">
|
||||
<Badge variant="default">Default</Badge>
|
||||
<Badge variant="accent">Radix UI</Badge>
|
||||
<Badge variant="success">Online</Badge>
|
||||
<Badge variant="outline">v3.2</Badge>
|
||||
</div>
|
||||
<Switch checked={demoSwitch} onCheckedChange={setDemoSwitch} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Input & InputGroup */}
|
||||
<div className="space-y-1.5">
|
||||
<label className="block text-xs font-medium" style={{ color: 'var(--text-muted)' }}>
|
||||
`InputGroup` 组合输入框
|
||||
</label>
|
||||
<InputGroup>
|
||||
<Search className="w-4 h-4 shrink-0" style={{ color: 'var(--text-subtle)' }} />
|
||||
<input
|
||||
type="text"
|
||||
@@ -365,35 +397,21 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
>
|
||||
⌘K
|
||||
</kbd>
|
||||
</div>
|
||||
</InputGroup>
|
||||
</div>
|
||||
|
||||
<div className="space-y-1.5">
|
||||
<label className="block text-xs font-medium" style={{ color: 'var(--text-muted)' }}>
|
||||
等宽字体 IP / 域名输入框 (`.hl-input .font-mono-num`)
|
||||
`Input` 等宽字体输入框
|
||||
</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
value={demoHost}
|
||||
onChange={(e) => setDemoHost(e.target.value)}
|
||||
className="hl-input font-mono-num"
|
||||
className="font-mono-num"
|
||||
placeholder="192.168.31.164"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="p-3 rounded-lg hl-card text-[11px] leading-relaxed space-y-1" style={{ color: 'var(--text-muted)' }}>
|
||||
<div className="font-semibold" style={{ color: 'var(--text-main)' }}>
|
||||
为什么不再出现浏览器默认输入框和弹窗?
|
||||
</div>
|
||||
<p>
|
||||
1. 全局 CSS 已设置 <code>appearance: none</code> 与自定义聚焦光环{' '}
|
||||
<code>box-shadow: 0 0 0 3px var(--accent-soft)</code>,并覆盖了 Chrome 自动填充的黄色背景。
|
||||
</p>
|
||||
<p>
|
||||
2. Caddy 网关已移除 <code>basicauth</code>,改用 <code>forward_auth</code> 对接右侧的{' '}
|
||||
<strong>HomeLab SSO 2.0 统一认证卡片</strong>,一次登录全域名 30 天免密通行。
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Right: Live AuthGateCard Preview */}
|
||||
@@ -405,12 +423,12 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
)}
|
||||
|
||||
{/* STORY 4: ServiceCard Interactive Playground */}
|
||||
{activeStory === 'service-card' && (
|
||||
<div className="hl-card p-6 space-y-6">
|
||||
<Card className="p-6 space-y-6">
|
||||
<div className="border-b hl-border pb-4 flex items-center justify-between">
|
||||
<div>
|
||||
<span
|
||||
@@ -428,27 +446,24 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
|
||||
{/* Interactive Controls */}
|
||||
<div className="p-4 rounded-xl hl-muted border hl-border flex flex-wrap items-center gap-6 text-xs">
|
||||
<div className="flex items-center gap-2">
|
||||
<div className="flex items-center gap-2.5">
|
||||
<span className="font-semibold">在线状态 (online):</span>
|
||||
<button
|
||||
onClick={() => setDemoOnline(!demoOnline)}
|
||||
className="px-2.5 py-1 rounded hl-card font-mono-num cursor-pointer"
|
||||
>
|
||||
{demoOnline ? 'true (绿灯)' : 'false (离线红灯)'}
|
||||
</button>
|
||||
<Switch checked={demoOnline} onCheckedChange={setDemoOnline} />
|
||||
<span className="font-mono-num">{demoOnline ? 'true' : 'false'}</span>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="font-semibold">右上角动作按钮 (actionType):</span>
|
||||
{(['drawer', 'backup', undefined] as const).map((act, i) => (
|
||||
<button
|
||||
<Button
|
||||
key={i}
|
||||
variant={demoAction === act ? 'accent' : 'outline'}
|
||||
size="sm"
|
||||
onClick={() => setDemoAction(act)}
|
||||
className="px-2.5 py-1 rounded hl-card font-mono-num cursor-pointer"
|
||||
style={demoAction === act ? { borderColor: 'var(--accent)' } : {}}
|
||||
className="font-mono-num"
|
||||
>
|
||||
{act || 'route-badge'}
|
||||
</button>
|
||||
</Button>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
@@ -476,12 +491,12 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
)}
|
||||
|
||||
{/* STORY 5: SshShelf */}
|
||||
{activeStory === 'ssh-shelf' && (
|
||||
<div className="hl-card p-6 space-y-6">
|
||||
<Card className="p-6 space-y-6">
|
||||
<div className="border-b hl-border pb-4">
|
||||
<span
|
||||
className="text-[11px] font-mono-num uppercase tracking-wider"
|
||||
@@ -492,7 +507,7 @@ export const StorybookWorkbench: React.FC = () => {
|
||||
<h2 className="text-lg font-bold mt-0.5">底部 SSH 快捷复制与运维操作栏</h2>
|
||||
</div>
|
||||
<SshShelf />
|
||||
</div>
|
||||
</Card>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,6 +2,8 @@ import React from 'react';
|
||||
import { BookOpen, LayoutGrid, Moon, Search, Sun, Terminal } from 'lucide-react';
|
||||
import { usePortalStore } from '../store/usePortalStore';
|
||||
import type { RouteModeId } from '../types/telemetry';
|
||||
import { Button } from './ui/button';
|
||||
import { Tabs, TabsList, TabsTrigger } from './ui/tabs';
|
||||
|
||||
const MODES: Array<{ id: RouteModeId; label: string }> = [
|
||||
{ id: 'auto', label: '智能路由' },
|
||||
@@ -29,15 +31,15 @@ export const TopRibbon: React.FC = () => {
|
||||
<>
|
||||
{/* =====================================================================
|
||||
Tier 1: Standard AppShell Global Top Navbar (h-14, NEVER wraps!)
|
||||
Left: Brand + View Tabs (中控台 / Storybook)
|
||||
Far Right (Red Box): Search (Cmd+K) + AGY Terminal + Theme Switcher
|
||||
Left: Brand + Radix Tabs (中控台 / Storybook)
|
||||
Far Right: Search (Cmd+K) + AGY Terminal + Theme Switcher
|
||||
===================================================================== */}
|
||||
<header
|
||||
className="border-b hl-border sticky top-0 z-30 backdrop-blur-md"
|
||||
style={{ backgroundColor: 'color-mix(in srgb, var(--bg-card) 88%, transparent)' }}
|
||||
>
|
||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-14 flex items-center justify-between gap-4">
|
||||
{/* Left Group: Brand Logo + Navigation Tabs */}
|
||||
{/* Left Group: Brand Logo + Official Radix Navigation Tabs */}
|
||||
<div className="flex items-center gap-4 shrink-0">
|
||||
<div
|
||||
onClick={() => setViewMode('dashboard')}
|
||||
@@ -58,47 +60,30 @@ export const TopRibbon: React.FC = () => {
|
||||
|
||||
<div className="h-4 w-[1px] hl-muted" />
|
||||
|
||||
{/* View Switcher Tabs: Dashboard vs Storybook */}
|
||||
<nav className="flex items-center gap-1 text-xs">
|
||||
<button
|
||||
onClick={() => setViewMode('dashboard')}
|
||||
className="px-2.5 py-1.5 rounded-md font-medium flex items-center gap-1.5 transition-all cursor-pointer"
|
||||
style={
|
||||
viewMode === 'dashboard'
|
||||
? {
|
||||
backgroundColor: 'var(--bg-muted)',
|
||||
color: 'var(--text-main)',
|
||||
}
|
||||
: { color: 'var(--text-muted)' }
|
||||
}
|
||||
{/* View Switcher Tabs via @radix-ui/react-tabs */}
|
||||
<Tabs
|
||||
value={viewMode}
|
||||
onValueChange={(v) => setViewMode(v as 'dashboard' | 'storybook')}
|
||||
>
|
||||
<TabsList>
|
||||
<TabsTrigger value="dashboard">
|
||||
<LayoutGrid className="w-3.5 h-3.5" />
|
||||
<span>中控台</span>
|
||||
</button>
|
||||
|
||||
<button
|
||||
onClick={() => setViewMode('storybook')}
|
||||
className="px-2.5 py-1.5 rounded-md font-medium flex items-center gap-1.5 transition-all cursor-pointer"
|
||||
style={
|
||||
viewMode === 'storybook'
|
||||
? {
|
||||
backgroundColor: 'var(--bg-muted)',
|
||||
color: 'var(--text-main)',
|
||||
}
|
||||
: { color: 'var(--text-muted)' }
|
||||
}
|
||||
>
|
||||
</TabsTrigger>
|
||||
<TabsTrigger value="storybook">
|
||||
<BookOpen className="w-3.5 h-3.5" />
|
||||
<span>Storybook 设计规范</span>
|
||||
</button>
|
||||
</nav>
|
||||
</TabsTrigger>
|
||||
</TabsList>
|
||||
</Tabs>
|
||||
</div>
|
||||
|
||||
{/* Far Right Group: Pinned to Right Edge (Search + AGY + Theme Switcher) */}
|
||||
<div className="flex items-center gap-2.5 shrink-0 ml-auto">
|
||||
<button
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={() => setShowCmdPalette(true)}
|
||||
className="hl-btn-outline px-3 py-1.5 text-xs flex items-center gap-3 cursor-pointer"
|
||||
className="gap-3"
|
||||
title="按 Cmd+K 唤起全局命令面板"
|
||||
>
|
||||
<span className="flex items-center gap-1.5" style={{ color: 'var(--text-muted)' }}>
|
||||
@@ -111,15 +96,12 @@ export const TopRibbon: React.FC = () => {
|
||||
>
|
||||
⌘K
|
||||
</kbd>
|
||||
</button>
|
||||
</Button>
|
||||
|
||||
<button
|
||||
onClick={() => setShowAgyModal(true)}
|
||||
className="hl-btn-primary px-3 py-1.5 text-xs flex items-center gap-1.5 cursor-pointer"
|
||||
>
|
||||
<Button onClick={() => setShowAgyModal(true)}>
|
||||
<Terminal className="w-3.5 h-3.5" />
|
||||
<span>AGY 终端</span>
|
||||
</button>
|
||||
</Button>
|
||||
|
||||
{/* Top-Right Theme Toggle (Pinned at Far Right Corner!) */}
|
||||
<div className="flex items-center p-0.5 rounded-lg hl-muted border hl-border text-xs">
|
||||
@@ -163,7 +145,7 @@ export const TopRibbon: React.FC = () => {
|
||||
{/* =====================================================================
|
||||
Tier 2: Subheader Telemetry & Route Mode Bar (Aligned with Grid)
|
||||
Left: 4 Hardware & Network Gauges
|
||||
Right: Route Mode Segmented Switcher (智能路由 / 443 / 10443 / LAN)
|
||||
Right: Route Mode Segmented Switcher via @radix-ui/react-tabs
|
||||
===================================================================== */}
|
||||
{viewMode === 'dashboard' && (
|
||||
<div className="border-b hl-border" style={{ backgroundColor: 'var(--bg-card)' }}>
|
||||
@@ -217,27 +199,20 @@ export const TopRibbon: React.FC = () => {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Right: Route Mode Switcher (Pinned to Right Edge of Subheader) */}
|
||||
<div className="flex items-center p-0.5 rounded-lg hl-muted border hl-border text-xs ml-auto">
|
||||
{MODES.map((m) => (
|
||||
<button
|
||||
key={m.id}
|
||||
onClick={() => setRouteMode(m.id)}
|
||||
className="px-2.5 py-1 rounded-md font-medium transition-all cursor-pointer"
|
||||
style={
|
||||
routeMode === m.id
|
||||
? {
|
||||
backgroundColor: 'var(--bg-card)',
|
||||
color: 'var(--text-main)',
|
||||
boxShadow: '0 1px 2px rgba(0,0,0,0.08)',
|
||||
}
|
||||
: { color: 'var(--text-muted)' }
|
||||
}
|
||||
{/* Right: Route Mode Switcher via @radix-ui/react-tabs */}
|
||||
<Tabs
|
||||
value={routeMode}
|
||||
onValueChange={(v) => setRouteMode(v as RouteModeId)}
|
||||
className="ml-auto"
|
||||
>
|
||||
<TabsList>
|
||||
{MODES.map((m) => (
|
||||
<TabsTrigger key={m.id} value={m.id}>
|
||||
{m.label}
|
||||
</button>
|
||||
</TabsTrigger>
|
||||
))}
|
||||
</div>
|
||||
</TabsList>
|
||||
</Tabs>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
import * as React from 'react';
|
||||
import { cva, type VariantProps } from 'class-variance-authority';
|
||||
import { cn } from '../../lib/utils';
|
||||
|
||||
const badgeVariants = cva(
|
||||
'inline-flex items-center gap-1 rounded-md px-2 py-0.5 text-[11px] font-mono-num font-medium transition-colors shrink-0',
|
||||
{
|
||||
variants: {
|
||||
variant: {
|
||||
default: 'bg-[var(--primary)] text-[var(--primary-fg)]',
|
||||
secondary: 'hl-muted text-[var(--text-muted)] border hl-border',
|
||||
outline: 'border hl-border text-[var(--text-muted)] bg-[var(--bg-card)]',
|
||||
accent: 'bg-[var(--accent-soft)] text-[var(--accent)] font-semibold',
|
||||
success: 'bg-[var(--success-soft)] text-[var(--success)] font-semibold',
|
||||
},
|
||||
},
|
||||
defaultVariants: {
|
||||
variant: 'secondary',
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
export interface BadgeProps
|
||||
extends React.HTMLAttributes<HTMLDivElement>,
|
||||
VariantProps<typeof badgeVariants> {}
|
||||
|
||||
function Badge({ className, variant, ...props }: BadgeProps) {
|
||||
return <div className={cn(badgeVariants({ variant }), className)} {...props} />;
|
||||
}
|
||||
|
||||
export { Badge, badgeVariants };
|
||||
@@ -0,0 +1,52 @@
|
||||
import * as React from 'react';
|
||||
import { Slot } from '@radix-ui/react-slot';
|
||||
import { cva, type VariantProps } from 'class-variance-authority';
|
||||
import { cn } from '../../lib/utils';
|
||||
|
||||
const buttonVariants = cva(
|
||||
'inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-lg text-xs font-medium transition-all cursor-pointer select-none disabled:pointer-events-none disabled:opacity-50 shrink-0',
|
||||
{
|
||||
variants: {
|
||||
variant: {
|
||||
default: 'hl-btn-primary shadow-xs',
|
||||
outline: 'hl-btn-outline',
|
||||
secondary: 'hl-muted border hl-border hover:opacity-90',
|
||||
ghost: 'hover:bg-[var(--bg-muted)]',
|
||||
accent:
|
||||
'border border-[var(--accent)] bg-[var(--accent-soft)] text-[var(--accent)] font-semibold hover:opacity-90',
|
||||
},
|
||||
size: {
|
||||
default: 'h-8 px-3 py-1.5',
|
||||
sm: 'h-7 px-2.5 text-[11px] rounded-md',
|
||||
lg: 'h-9 px-4 text-xs',
|
||||
icon: 'h-8 w-8 p-0',
|
||||
},
|
||||
},
|
||||
defaultVariants: {
|
||||
variant: 'default',
|
||||
size: 'default',
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
export interface ButtonProps
|
||||
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
|
||||
VariantProps<typeof buttonVariants> {
|
||||
asChild?: boolean;
|
||||
}
|
||||
|
||||
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
||||
({ className, variant, size, asChild = false, ...props }, ref) => {
|
||||
const Comp = asChild ? Slot : 'button';
|
||||
return (
|
||||
<Comp
|
||||
className={cn(buttonVariants({ variant, size, className }))}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
);
|
||||
Button.displayName = 'Button';
|
||||
|
||||
export { Button, buttonVariants };
|
||||
@@ -0,0 +1,55 @@
|
||||
import * as React from 'react';
|
||||
import { cn } from '../../lib/utils';
|
||||
|
||||
const Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
||||
({ className, ...props }, ref) => (
|
||||
<div ref={ref} className={cn('hl-card', className)} {...props} />
|
||||
)
|
||||
);
|
||||
Card.displayName = 'Card';
|
||||
|
||||
const CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
||||
({ className, ...props }, ref) => (
|
||||
<div ref={ref} className={cn('flex flex-col space-y-1.5 p-5', className)} {...props} />
|
||||
)
|
||||
);
|
||||
CardHeader.displayName = 'CardHeader';
|
||||
|
||||
const CardTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(
|
||||
({ className, ...props }, ref) => (
|
||||
<h3
|
||||
ref={ref}
|
||||
className={cn('text-sm font-bold leading-none tracking-tight', className)}
|
||||
{...props}
|
||||
/>
|
||||
)
|
||||
);
|
||||
CardTitle.displayName = 'CardTitle';
|
||||
|
||||
const CardDescription = React.forwardRef<
|
||||
HTMLParagraphElement,
|
||||
React.HTMLAttributes<HTMLParagraphElement>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<p
|
||||
ref={ref}
|
||||
className={cn('text-xs text-[var(--text-muted)]', className)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
CardDescription.displayName = 'CardDescription';
|
||||
|
||||
const CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
||||
({ className, ...props }, ref) => (
|
||||
<div ref={ref} className={cn('p-5 pt-0', className)} {...props} />
|
||||
)
|
||||
);
|
||||
CardContent.displayName = 'CardContent';
|
||||
|
||||
const CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
||||
({ className, ...props }, ref) => (
|
||||
<div ref={ref} className={cn('flex items-center p-5 pt-0', className)} {...props} />
|
||||
)
|
||||
);
|
||||
CardFooter.displayName = 'CardFooter';
|
||||
|
||||
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };
|
||||
@@ -0,0 +1,121 @@
|
||||
import * as React from 'react';
|
||||
import { Command as CommandPrimitive } from 'cmdk';
|
||||
import { Search } from 'lucide-react';
|
||||
import { cn } from '../../lib/utils';
|
||||
import { Dialog, DialogContent, DialogDescription, DialogTitle } from './dialog';
|
||||
|
||||
const Command = React.forwardRef<
|
||||
React.ComponentRef<typeof CommandPrimitive>,
|
||||
React.ComponentPropsWithoutRef<typeof CommandPrimitive>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<CommandPrimitive
|
||||
ref={ref}
|
||||
className={cn(
|
||||
'flex h-full w-full flex-col overflow-hidden rounded-xl bg-[var(--bg-card)] text-[var(--text-main)]',
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
Command.displayName = CommandPrimitive.displayName;
|
||||
|
||||
interface CommandDialogProps extends React.ComponentPropsWithoutRef<typeof Dialog> {}
|
||||
|
||||
const CommandDialog: React.FC<CommandDialogProps> = ({ children, ...props }) => {
|
||||
return (
|
||||
<Dialog {...props}>
|
||||
<DialogContent className="max-w-xl overflow-hidden p-0 shadow-2xl top-[22%] translate-y-0">
|
||||
<DialogTitle className="sr-only">全局命令与服务搜索面板</DialogTitle>
|
||||
<DialogDescription className="sr-only">
|
||||
使用键盘上下方向键选择服务或操作,回车立即执行
|
||||
</DialogDescription>
|
||||
<Command>{children}</Command>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
);
|
||||
};
|
||||
|
||||
const CommandInput = React.forwardRef<
|
||||
React.ComponentRef<typeof CommandPrimitive.Input>,
|
||||
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<div className="flex items-center border-b hl-border px-4 py-3 gap-3" cmdk-input-wrapper="">
|
||||
<Search className="h-4 w-4 shrink-0 text-[var(--text-muted)]" />
|
||||
<CommandPrimitive.Input
|
||||
ref={ref}
|
||||
className={cn(
|
||||
'flex w-full bg-transparent text-sm outline-none placeholder:text-[var(--text-subtle)] disabled:cursor-not-allowed disabled:opacity-50',
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
<kbd className="px-1.5 py-0.5 text-[10px] font-mono-num rounded hl-muted text-[var(--text-muted)] shrink-0">
|
||||
ESC
|
||||
</kbd>
|
||||
</div>
|
||||
));
|
||||
CommandInput.displayName = CommandPrimitive.Input.displayName;
|
||||
|
||||
const CommandList = React.forwardRef<
|
||||
React.ComponentRef<typeof CommandPrimitive.List>,
|
||||
React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<CommandPrimitive.List
|
||||
ref={ref}
|
||||
className={cn('max-h-80 overflow-y-auto overflow-x-hidden p-2', className)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
CommandList.displayName = CommandPrimitive.List.displayName;
|
||||
|
||||
const CommandEmpty = React.forwardRef<
|
||||
React.ComponentRef<typeof CommandPrimitive.Empty>,
|
||||
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>
|
||||
>((props, ref) => (
|
||||
<CommandPrimitive.Empty
|
||||
ref={ref}
|
||||
className="py-6 text-center text-xs text-[var(--text-muted)]"
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
|
||||
|
||||
const CommandGroup = React.forwardRef<
|
||||
React.ComponentRef<typeof CommandPrimitive.Group>,
|
||||
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<CommandPrimitive.Group
|
||||
ref={ref}
|
||||
className={cn(
|
||||
'overflow-hidden p-1 text-[var(--text-main)] [&_[cmdk-group-heading]]:px-2.5 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-[10px] [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider [&_[cmdk-group-heading]]:text-[var(--text-subtle)]',
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
CommandGroup.displayName = CommandPrimitive.Group.displayName;
|
||||
|
||||
const CommandItem = React.forwardRef<
|
||||
React.ComponentRef<typeof CommandPrimitive.Item>,
|
||||
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<CommandPrimitive.Item
|
||||
ref={ref}
|
||||
className={cn(
|
||||
'relative flex cursor-pointer select-none items-center justify-between rounded-lg px-3 py-2 text-xs outline-none transition-colors data-[selected=true]:bg-[var(--bg-muted)] data-[selected=true]:text-[var(--text-main)] data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50',
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
CommandItem.displayName = CommandPrimitive.Item.displayName;
|
||||
|
||||
export {
|
||||
Command,
|
||||
CommandDialog,
|
||||
CommandInput,
|
||||
CommandList,
|
||||
CommandEmpty,
|
||||
CommandGroup,
|
||||
CommandItem,
|
||||
};
|
||||
@@ -0,0 +1,90 @@
|
||||
import * as React from 'react';
|
||||
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
||||
import { cn } from '../../lib/utils';
|
||||
|
||||
const Dialog = DialogPrimitive.Root;
|
||||
const DialogTrigger = DialogPrimitive.Trigger;
|
||||
const DialogPortal = DialogPrimitive.Portal;
|
||||
const DialogClose = DialogPrimitive.Close;
|
||||
|
||||
const DialogOverlay = React.forwardRef<
|
||||
React.ComponentRef<typeof DialogPrimitive.Overlay>,
|
||||
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<DialogPrimitive.Overlay
|
||||
ref={ref}
|
||||
className={cn(
|
||||
'fixed inset-0 z-50 bg-black/70 backdrop-blur-sm transition-opacity',
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
||||
|
||||
const DialogContent = React.forwardRef<
|
||||
React.ComponentRef<typeof DialogPrimitive.Content>,
|
||||
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
|
||||
>(({ className, children, ...props }, ref) => (
|
||||
<DialogPortal>
|
||||
<DialogOverlay />
|
||||
<DialogPrimitive.Content
|
||||
ref={ref}
|
||||
className={cn(
|
||||
'fixed left-[50%] top-[50%] z-50 w-full max-w-lg translate-x-[-50%] translate-y-[-50%] hl-card shadow-2xl duration-200 outline-none',
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
>
|
||||
{children}
|
||||
</DialogPrimitive.Content>
|
||||
</DialogPortal>
|
||||
));
|
||||
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
||||
|
||||
const DialogHeader = ({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) => (
|
||||
<div
|
||||
className={cn('flex flex-col space-y-1.5 text-left', className)}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
DialogHeader.displayName = 'DialogHeader';
|
||||
|
||||
const DialogTitle = React.forwardRef<
|
||||
React.ComponentRef<typeof DialogPrimitive.Title>,
|
||||
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<DialogPrimitive.Title
|
||||
ref={ref}
|
||||
className={cn('text-sm font-bold leading-none tracking-tight', className)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
||||
|
||||
const DialogDescription = React.forwardRef<
|
||||
React.ComponentRef<typeof DialogPrimitive.Description>,
|
||||
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<DialogPrimitive.Description
|
||||
ref={ref}
|
||||
className={cn('text-xs text-[var(--text-muted)]', className)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
||||
|
||||
export {
|
||||
Dialog,
|
||||
DialogPortal,
|
||||
DialogOverlay,
|
||||
DialogClose,
|
||||
DialogTrigger,
|
||||
DialogContent,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
DialogDescription,
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
import * as React from 'react';
|
||||
import { cn } from '../../lib/utils';
|
||||
|
||||
export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}
|
||||
|
||||
const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
||||
({ className, type, ...props }, ref) => {
|
||||
return (
|
||||
<input
|
||||
type={type}
|
||||
className={cn('hl-input', className)}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
);
|
||||
Input.displayName = 'Input';
|
||||
|
||||
export interface InputGroupProps extends React.HTMLAttributes<HTMLDivElement> {}
|
||||
|
||||
const InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(
|
||||
({ className, ...props }, ref) => {
|
||||
return <div ref={ref} className={cn('hl-input-group', className)} {...props} />;
|
||||
}
|
||||
);
|
||||
InputGroup.displayName = 'InputGroup';
|
||||
|
||||
export { Input, InputGroup };
|
||||
@@ -0,0 +1,26 @@
|
||||
import * as React from 'react';
|
||||
import * as SwitchPrimitives from '@radix-ui/react-switch';
|
||||
import { cn } from '../../lib/utils';
|
||||
|
||||
const Switch = React.forwardRef<
|
||||
React.ComponentRef<typeof SwitchPrimitives.Root>,
|
||||
React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<SwitchPrimitives.Root
|
||||
className={cn(
|
||||
'peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border transition-colors disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-[var(--accent)] data-[state=checked]:border-[var(--accent)] data-[state=unchecked]:bg-[var(--bg-muted)] data-[state=unchecked]:border-[var(--border-color)]',
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
ref={ref}
|
||||
>
|
||||
<SwitchPrimitives.Thumb
|
||||
className={cn(
|
||||
'pointer-events-none block h-3.5 w-3.5 rounded-full bg-white shadow-sm transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0.5'
|
||||
)}
|
||||
/>
|
||||
</SwitchPrimitives.Root>
|
||||
));
|
||||
Switch.displayName = SwitchPrimitives.Root.displayName;
|
||||
|
||||
export { Switch };
|
||||
@@ -0,0 +1,49 @@
|
||||
import * as React from 'react';
|
||||
import * as TabsPrimitive from '@radix-ui/react-tabs';
|
||||
import { cn } from '../../lib/utils';
|
||||
|
||||
const Tabs = TabsPrimitive.Root;
|
||||
|
||||
const TabsList = React.forwardRef<
|
||||
React.ComponentRef<typeof TabsPrimitive.List>,
|
||||
React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<TabsPrimitive.List
|
||||
ref={ref}
|
||||
className={cn(
|
||||
'inline-flex items-center justify-center rounded-lg hl-muted p-1 border hl-border text-[var(--text-muted)]',
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
TabsList.displayName = TabsPrimitive.List.displayName;
|
||||
|
||||
const TabsTrigger = React.forwardRef<
|
||||
React.ComponentRef<typeof TabsPrimitive.Trigger>,
|
||||
React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<TabsPrimitive.Trigger
|
||||
ref={ref}
|
||||
className={cn(
|
||||
'inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-md px-2.5 py-1 text-xs font-medium transition-all cursor-pointer select-none disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-[var(--bg-card)] data-[state=active]:text-[var(--text-main)] data-[state=active]:shadow-xs',
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
|
||||
|
||||
const TabsContent = React.forwardRef<
|
||||
React.ComponentRef<typeof TabsPrimitive.Content>,
|
||||
React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<TabsPrimitive.Content
|
||||
ref={ref}
|
||||
className={cn('mt-2 outline-none', className)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
TabsContent.displayName = TabsPrimitive.Content.displayName;
|
||||
|
||||
export { Tabs, TabsList, TabsTrigger, TabsContent };
|
||||
@@ -0,0 +1,6 @@
|
||||
import { clsx, type ClassValue } from 'clsx';
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs));
|
||||
}
|
||||
Reference in new issue
Block a user