@dsh-sup/dsh-core-linux-x64 0.1.2-BETA.7 → 0.1.3-BETA.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core.cjs +4677 -3422
- package/package.json +1 -1
- package/ui-react/assets/InstancesPage-CyEm5iX2.js +3 -0
- package/ui-react/assets/LanPage-B50Kzjs4.js +4 -0
- package/ui-react/assets/{OverviewPage-CWZO0NU0.js → OverviewPage-MzDlXklJ.js} +1 -1
- package/ui-react/assets/PluginsPage-C7FgTTbn.js +5 -0
- package/ui-react/assets/RouterPage-CNBkA6Mc.js +1 -0
- package/ui-react/assets/SettingsPage-CY-7TRWq.js +3 -0
- package/ui-react/assets/{TasksPage-DKg4oZpB.js → TasksPage-DVmziA2O.js} +1 -1
- package/ui-react/assets/{external-link-7tHSa1Y1.js → external-link-BvGetYRO.js} +1 -1
- package/ui-react/assets/jobs-BjLbfJTM.js +1 -0
- package/ui-react/assets/{refresh-cw-3BcNWlWU.js → refresh-cw-BqEefYJE.js} +1 -1
- package/ui-react/assets/{rocket-CT4BqsDO.js → rocket-wmBaPRU7.js} +1 -1
- package/ui-react/assets/{shield-check-TAdrvvOX.js → shield-check-twf0JYXe.js} +1 -1
- package/ui-react/assets/{supervisor-m53cymoX.js → supervisor-CrE6sh9a.js} +1 -1
- package/ui-react/assets/supervisor-CvEVeLaH.css +2 -0
- package/ui-react/assets/{supervisor-AngOxQui.js → supervisor-D7hcOyJj.js} +3 -3
- package/ui-react/assets/{useSupervisorAction-BG3WZkEK.js → useSupervisorAction-BSJF1MI0.js} +1 -1
- package/ui-react/assets/{widgets-OLyrPchF.js → widgets-CryqOrYX.js} +1 -1
- package/ui-react/supervisor.html +3 -3
- package/ui-react/assets/InstancesPage-DRMrbdTv.js +0 -3
- package/ui-react/assets/LanPage-CfDYyjjB.js +0 -4
- package/ui-react/assets/PluginsPage-BmsG5jv7.js +0 -5
- package/ui-react/assets/RouterPage-B4b4UHFH.js +0 -1
- package/ui-react/assets/SettingsPage-Bg-ur2Qq.js +0 -1
- package/ui-react/assets/supervisor-DoAb2I7j.css +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
import{L as e,k as t,n,z as r}from"./supervisor-
|
|
1
|
+
import{L as e,k as t,n,z as r}from"./supervisor-CrE6sh9a.js";var i=r(e(),1);function a(){let[e,r]=(0,i.useState)(null);return{busy:e,run:(0,i.useCallback)(async(e,i,a)=>{r(e);let o=!0;try{await i(),a?.success&&t.success(a.success)}catch(e){o=!1,t.error(e instanceof Error?e.message:String(e))}finally{r(null),a?.onDone?.(),o&&a?.refresh!==!1&&n.refresh()}return o},[])}}export{a as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{E as e,O as t}from"./supervisor-
|
|
1
|
+
import{E as e,O as t}from"./supervisor-CrE6sh9a.js";var n=t();function r({tone:t=`off`,ping:r=!1,className:i}){let a=t===`ok`?`bg-status-ok shadow-[0_0_6px_2px_var(--status-ok-ring)]`:t===`err`?`bg-status-error shadow-[0_0_6px_2px_var(--status-error-ring)]`:t===`warn`?`bg-warning`:t===`boot`?`bg-status-brand shadow-[0_0_6px_2px_var(--status-brand-ring)]`:`bg-muted-foreground/50`;return(0,n.jsxs)(`span`,{"aria-hidden":`true`,className:e(`relative inline-flex size-2 shrink-0 items-center justify-center`,i),children:[r?(0,n.jsx)(`span`,{className:e(`absolute inline-flex size-full animate-ping rounded-full`,t===`ok`?`bg-status-ok-soft opacity-75`:`bg-transparent`),style:t===`ok`?{animationDuration:`2s`}:void 0}):null,(0,n.jsx)(`span`,{className:e(`relative inline-flex size-2 rounded-full`,a)})]})}function i({tone:t=`off`,className:r,children:i}){return(0,n.jsx)(`span`,{className:e(`inline-flex h-5 shrink-0 items-center whitespace-nowrap rounded-full px-2 text-xs font-semibold leading-none`,t===`ok`&&`bg-success-background text-success`,t===`err`&&`bg-careful-background text-careful`,t===`warn`&&`bg-warning-background text-warning`,t===`boot`&&`bg-primary/10 text-primary`,t===`off`&&`bg-muted text-muted-foreground`,r),children:i})}function a({className:t,children:r}){return(0,n.jsx)(`div`,{className:e(`overflow-hidden rounded-lg border border-border bg-card shadow-[0_1px_2px_rgba(15,23,42,0.04)]`,t),children:r})}function o({title:t,subtitle:r,actions:i,className:a}){return(0,n.jsxs)(`div`,{className:e(`flex min-h-[52px] items-center justify-between gap-4 border-b border-border/70 bg-muted px-5`,a),children:[(0,n.jsxs)(`div`,{className:`min-w-0`,children:[(0,n.jsx)(`strong`,{className:`block truncate text-sm font-semibold leading-tight text-foreground`,children:t}),r?(0,n.jsx)(`span`,{className:`mt-1 block text-xs leading-tight text-muted-foreground`,children:r}):null]}),i?(0,n.jsx)(`div`,{className:`flex shrink-0 items-center gap-2`,children:i}):null]})}function s({icon:t,label:r,value:i,mono:a=!1,warn:o=!1,className:s}){return(0,n.jsxs)(`div`,{className:e(`flex min-w-0 flex-col gap-2`,s),children:[(0,n.jsxs)(`div`,{className:e(`flex items-center gap-1.5 text-xs text-muted-foreground`,o&&`text-destructive`),children:[t,(0,n.jsx)(`span`,{className:`truncate`,children:r})]}),(0,n.jsx)(`strong`,{className:e(`truncate text-lg font-semibold tabular-nums leading-none`,a&&`font-mono`,o?`text-destructive`:`text-foreground`),children:i})]})}function c({icon:t,label:r,value:i,note:a,danger:o=!1}){return(0,n.jsxs)(`div`,{className:`grid min-h-[52px] min-w-0 flex-1 grid-cols-[auto_minmax(0,1fr)] items-center gap-x-1.5 rounded-md border border-border bg-card px-3 py-2`,children:[(0,n.jsx)(`span`,{className:`text-muted-foreground`,children:t}),(0,n.jsx)(`span`,{className:`overflow-hidden text-ellipsis whitespace-nowrap text-xs leading-tight text-muted-foreground`,children:r}),(0,n.jsx)(`strong`,{className:e(`col-span-full mt-1 truncate text-base font-semibold leading-none tabular-nums`,o?`text-destructive`:`text-foreground`),children:i}),a?(0,n.jsx)(`span`,{className:`col-span-full mt-1 truncate text-[11px] leading-tight text-muted-foreground`,children:a}):null]})}function l({domain:e}){return(0,n.jsx)(i,{tone:e===`native`?`boot`:`off`,children:e===`native`?`原生`:`沙箱`})}function u({children:t,className:r}){return(0,n.jsx)(`span`,{className:e(`max-w-[180px] overflow-hidden text-ellipsis whitespace-nowrap font-mono text-sm leading-tight text-muted-foreground`,r),children:t})}export{u as a,r as c,s as i,o as n,i as o,l as r,c as s,a as t};
|
package/ui-react/supervisor.html
CHANGED
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
html, body, #root { width: 100%; height: 100%; height: 100dvh; }
|
|
17
17
|
body { margin: 0; min-width: 320px; min-height: 100vh; min-height: 100dvh; overflow: hidden; background: transparent; }
|
|
18
18
|
</style>
|
|
19
|
-
<script type="module" crossorigin src="/assets/supervisor-
|
|
20
|
-
<link rel="modulepreload" crossorigin href="/assets/supervisor-
|
|
19
|
+
<script type="module" crossorigin src="/assets/supervisor-D7hcOyJj.js"></script>
|
|
20
|
+
<link rel="modulepreload" crossorigin href="/assets/supervisor-CrE6sh9a.js">
|
|
21
21
|
<link rel="stylesheet" crossorigin href="/assets/supervisor-hG2-v7mV.css">
|
|
22
|
-
<link rel="stylesheet" crossorigin href="/assets/supervisor-
|
|
22
|
+
<link rel="stylesheet" crossorigin href="/assets/supervisor-CvEVeLaH.css">
|
|
23
23
|
</head>
|
|
24
24
|
<body>
|
|
25
25
|
<div id="root"></div>
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{A as e,E as t,L as n,O as r,P as i,T as a,_ as o,b as s,g as c,h as l,i as u,k as d,m as f,n as p,o as m,r as h,t as g,v as _,y as v,z as y}from"./supervisor-m53cymoX.js";import{t as b}from"./external-link-7tHSa1Y1.js";import{n as x,t as S}from"./rocket-CT4BqsDO.js";import{t as ee}from"./shield-check-TAdrvvOX.js";import{c as C,f as w,o as T,s as E}from"./supervisor-AngOxQui.js";import{t as D}from"./useSupervisorAction-BG3WZkEK.js";import{c as O,i as k,o as A,r as j,t as M}from"./widgets-OLyrPchF.js";var N=i(`box`,[[`path`,{d:`M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z`,key:`hh9hay`}],[`path`,{d:`m3.3 7 8.7 5 8.7-5`,key:`g66t2b`}],[`path`,{d:`M12 22V12`,key:`d0xqtd`}]]),P=i(`rotate-cw`,[[`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`,key:`1p45f6`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}]]),F=i(`square`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}]]),I=y(n(),1),L=r();function R({onRegisterActions:n}){let{snap:r}=g(),{busy:i,run:y}=D(),[R,z]=(0,I.useState)(!1),[B,V]=(0,I.useState)(null),[H,U]=(0,I.useState)(``),[W,G]=(0,I.useState)(``),[K,q]=(0,I.useState)(``),[J,Y]=(0,I.useState)(`4G`),[X,Z]=(0,I.useState)(`150%`),Q=r.instances?.instances??[];(0,I.useEffect)(()=>(n?.({onAdd:()=>z(!0)}),()=>n?.(null)),[n]);let $=(e,t)=>y(e,t);async function te(){let e=parseInt(W,10);if(!Number.isFinite(e)||e<=0){d.error(`请填写有效端口`);return}let t=K?K.split(/\n/).map(e=>e.trim()).filter(Boolean):[];try{let n=await h.instanceAdd({name:H.trim()||`沙箱 `+e,port:e,command:t,memoryMax:J||`4G`,cpuQuota:X||`150%`});if(n&&n.ok===!1){d.error(n.error||`添加失败`);return}d.success(`已添加实例`),z(!1),U(``),G(``),q(``),Y(`4G`),Z(`150%`),p.refresh()}catch(e){d.error(String(e))}}async function ne(e){await y(e.id,async()=>{let t=await h.instanceCheckUpdate(e.id);t.updateAvailable?(d.success(`发现新版 `+t.latest+`,可点「更新」升级`),ie(t=>new Map(t).set(e.id,!0))):t.latest?d.info(`已是最新 `+t.latest):d.error(t.error||`版本检测失败`)})}let[re,ie]=(0,I.useState)(new Map);async function ae(e){confirm(`将升级该沙箱实例的 DSH 到最新版(实例会短暂重启,进行中的请求中断)。确定升级?`)&&await y(e.id,()=>h.instanceUpgrade(e.id),{success:`升级已开始…`})}let oe=({it:n})=>{let r=n.state?.running??!1,o=n.state?.lifecyclePhase,s=E(o,r),c=n.updateJob,l=c?.state===`running`,u=n.sandbox?.memoryMax||`—`,d=n.sandbox?.cpuQuota||`—`,f=i===n.id;return(0,L.jsxs)(M,{className:`overflow-visible`,children:[(0,L.jsxs)(`div`,{className:`grid grid-cols-1 @min-[720px]:grid-cols-[minmax(0,5fr)_minmax(0,6fr)]`,children:[(0,L.jsxs)(`div`,{className:`flex flex-col gap-4 border-b border-border px-6 py-5 md:border-b-0 md:border-r`,children:[(0,L.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,L.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,L.jsx)(`strong`,{className:`truncate text-lg font-semibold tracking-[-0.01em] text-foreground`,children:n.name}),n.version?(0,L.jsxs)(`span`,{className:`font-mono text-sm text-muted-foreground`,children:[`v`,n.version]}):null]}),re.get(n.id)?(0,L.jsxs)(a,{className:`text-primary-foreground`,onClick:()=>void ae(n),size:`chip`,children:[(0,L.jsx)(P,{className:`size-3`}),`更新`]}):(0,L.jsxs)(a,{className:`bg-primary/10 text-primary hover:bg-primary/15`,disabled:f||l,onClick:()=>void ne(n),size:`chip`,variant:`ghost`,children:[(0,L.jsx)(P,{className:t(`size-3`,f&&`animate-spin`)}),`检测更新`]})]}),(0,L.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,L.jsx)(O,{tone:s.tone,ping:s.tone===`ok`}),(0,L.jsx)(`span`,{className:`text-base font-semibold leading-none text-foreground`,children:s.label})]}),l?(0,L.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,L.jsx)(m,{className:`size-3`}),`正在升级 DeepSeek Harness(`,c?.step||``,`)…`]}):null,n.state?.installing?(0,L.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,L.jsx)(m,{className:`size-3`}),`正在安装…`]}):null,o===`FAILED`?(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs text-destructive`,children:[(0,L.jsx)(e,{className:`size-3.5`}),(0,L.jsx)(`span`,{className:`truncate`,children:n.state?.lastError||`失败`})]}):null]}),(0,L.jsx)(`div`,{className:`flex items-center bg-[image:var(--panel-accent-gradient)] px-6 py-5`,children:(0,L.jsxs)(`div`,{className:`grid w-full grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-4`,children:[(0,L.jsx)(k,{icon:(0,L.jsx)(w,{className:`size-4`}),label:`端口`,value:String(n.port),mono:!0}),(0,L.jsx)(k,{icon:(0,L.jsx)(F,{className:`size-4`}),label:`PID`,value:n.state?.pid?String(n.state.pid):`—`,mono:!0}),(0,L.jsx)(k,{icon:(0,L.jsx)(P,{className:`size-4`}),label:`重启次数`,value:String(n.state?.restartCount??0),mono:!0}),(0,L.jsx)(k,{icon:(0,L.jsx)(e,{className:`size-4`}),label:`最近故障`,value:n.state?.lastFailure?T(n.state.lastFailure):`无`,warn:!!n.state?.lastFailure})]})})]}),(0,L.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 border-t border-border/60 px-6 py-3`,children:[(0,L.jsxs)(`span`,{className:`hidden min-w-0 items-center lg:inline-flex gap-2 text-xs text-muted-foreground`,children:[(0,L.jsx)(j,{domain:`sandbox`}),(0,L.jsx)(A,{tone:n.remoteEnabled?`boot`:`off`,children:n.remoteEnabled?`远程开启`:`远程关闭`}),(0,L.jsxs)(`span`,{className:`whitespace-nowrap`,children:[`内存 `,u,` · CPU `,d]})]}),(0,L.jsxs)(`div`,{className:`ml-auto flex flex-wrap items-center gap-2`,children:[(0,L.jsxs)(a,{disabled:!r,onClick:()=>void $(n.id,()=>h.instanceOpenWeb(n.id)),size:`sm`,title:`打开 DSH Web(自动带认证连接)`,variant:`outline`,className:`hidden md:inline-flex`,children:[(0,L.jsx)(b,{className:`size-4`}),`DSH Web`]}),(0,L.jsx)(a,{disabled:l,onClick:()=>void $(n.id,()=>r?h.instanceStop(n.id):h.instanceStart(n.id)),size:`sm`,variant:`outline`,children:r?(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(x,{className:`size-4 text-status-error`}),`停止实例`]}):(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(S,{className:`size-4 text-primary`}),`启动实例`]})}),(0,L.jsx)(`span`,{"aria-hidden":`true`,className:`mx-1 h-5 w-px bg-border`}),(0,L.jsxs)(a,{disabled:f,onClick:()=>void $(n.id,()=>h.instanceUpdate(n.id,{guardian:!n.guardian})),size:`sm`,variant:`outline`,children:[(0,L.jsx)(ee,{className:t(`size-4`,n.guardian?`text-status-ok`:`text-muted-foreground`)}),n.guardian?`停止守护`:`启动守护`]}),(0,L.jsxs)(a,{className:`hidden h-[30px] md:inline-flex`,disabled:f,onClick:()=>V(n.id),size:`sm`,variant:`destructive`,children:[(0,L.jsx)(C,{className:`size-4`}),`删除`]})]})]})]})};return(0,L.jsxs)(`div`,{className:`grid content-start gap-4`,children:[Q.length?(0,L.jsx)(`div`,{className:`grid gap-3`,children:Q.map(e=>(0,L.jsx)(oe,{it:e},e.id))}):(0,L.jsx)(`div`,{className:`grid min-h-[220px] place-items-center rounded-lg border border-dashed border-border text-center`,children:(0,L.jsxs)(`div`,{children:[(0,L.jsx)(N,{className:`mx-auto mb-3 size-8 text-muted-foreground`}),(0,L.jsx)(`p`,{className:`text-sm font-medium text-foreground`,children:`尚未添加沙箱实例`}),(0,L.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`点击顶部「添加实例」创建沙箱`})]})}),(0,L.jsx)(c,{open:R,onOpenChange:z,children:(0,L.jsxs)(o,{className:`max-w-[440px]`,children:[(0,L.jsx)(v,{children:(0,L.jsx)(s,{children:`添加 DSH 实例`})}),(0,L.jsxs)(`div`,{className:`grid gap-3`,children:[(0,L.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,L.jsx)(f,{children:`实例名称`}),(0,L.jsx)(l,{placeholder:`如 沙箱二开`,value:H,onChange:e=>U(e.target.value)})]}),(0,L.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,L.jsx)(f,{children:`监听端口`}),(0,L.jsx)(l,{inputMode:`numeric`,placeholder:`如 3082`,value:W,onChange:e=>G(e.target.value)})]}),(0,L.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,L.jsx)(f,{children:`启动命令(每项一参数,可留空用默认)`}),(0,L.jsx)(u,{className:`min-h-[72px] font-mono text-sm`,placeholder:`node
|
|
2
|
-
/home/bowen/.npm-global/bin/dsh
|
|
3
|
-
web`,value:K,onChange:e=>q(e.target.value)})]}),(0,L.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,L.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,L.jsx)(f,{children:`内存限额`}),(0,L.jsx)(l,{placeholder:`如 4G`,value:J,onChange:e=>Y(e.target.value)})]}),(0,L.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,L.jsx)(f,{children:`CPU 配额`}),(0,L.jsx)(l,{placeholder:`如 150%`,value:X,onChange:e=>Z(e.target.value)})]})]})]}),(0,L.jsxs)(_,{children:[(0,L.jsx)(a,{onClick:()=>z(!1),variant:`outline`,children:`取消`}),(0,L.jsx)(a,{onClick:()=>void te(),children:`添加`})]})]})}),(0,L.jsx)(c,{open:!!B,onOpenChange:e=>!e&&V(null),children:(0,L.jsxs)(o,{className:`max-w-[380px]`,children:[(0,L.jsx)(v,{children:(0,L.jsx)(s,{children:`删除实例?`})}),(0,L.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`将彻底删除该沙箱实例(含配置与运行时数据)。此操作不可恢复。`}),(0,L.jsxs)(_,{children:[(0,L.jsx)(a,{onClick:()=>V(null),variant:`outline`,children:`取消`}),(0,L.jsx)(a,{className:`h-[34px]`,onClick:()=>{B&&$(B,()=>h.instanceRemove(B)),V(null)},variant:`destructive`,children:`删除`})]})]})})]})}export{R as InstancesPage};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{E as e,L as t,O as n,P as r,R as i,T as a,a as o,h as s,m as c,r as l,t as u,z as d}from"./supervisor-m53cymoX.js";import{t as f}from"./external-link-7tHSa1Y1.js";import{t as p}from"./useSupervisorAction-BG3WZkEK.js";import{n as m,o as h,r as g,t as _}from"./widgets-OLyrPchF.js";var v=r(`save`,[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`,key:`1c8476`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`,key:`1ydtos`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`,key:`t51u73`}]]),y=r(`wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z`,key:`1ngwbx`}]]),b=i(((e,t)=>{t.exports=`SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED`})),x=i(((e,t)=>{var n=b();function r(){}function i(){}i.resetWarningCache=r,t.exports=function(){function e(e,t,r,i,a,o){if(o!==n){var s=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name=`Invariant Violation`,s}}e.isRequired=e;function t(){return e}var a={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:r};return a.PropTypes=a,a}})),S=i(((e,t)=>{t.exports=x()()})),C=d(t(),1),w=d(S(),1),T=function(e,t){let n=e,r=D[t],i=null,a=0,o=null,s=[],c={},l=function(e,t){a=n*4+17,i=function(e){let t=Array(e);for(let n=0;n<e;n+=1){t[n]=Array(e);for(let r=0;r<e;r+=1)t[n][r]=null}return t}(a),u(0,0),u(a-7,0),u(0,a-7),p(),f(),h(e,t),n>=7&&m(e),o??=v(n,r,s),g(o,t)},u=function(e,t){for(let n=-1;n<=7;n+=1)if(!(e+n<=-1||a<=e+n))for(let r=-1;r<=7;r+=1)t+r<=-1||a<=t+r||(0<=n&&n<=6&&(r==0||r==6)||0<=r&&r<=6&&(n==0||n==6)||2<=n&&n<=4&&2<=r&&r<=4?i[e+n][t+r]=!0:i[e+n][t+r]=!1)},d=function(){let e=0,t=0;for(let n=0;n<8;n+=1){l(!0,n);let r=k.getLostPoint(c);(n==0||e>r)&&(e=r,t=n)}return t},f=function(){for(let e=8;e<a-8;e+=1)i[e][6]??(i[e][6]=e%2==0);for(let e=8;e<a-8;e+=1)i[6][e]??(i[6][e]=e%2==0)},p=function(){let e=k.getPatternPosition(n);for(let t=0;t<e.length;t+=1)for(let n=0;n<e.length;n+=1){let r=e[t],a=e[n];if(i[r][a]==null)for(let e=-2;e<=2;e+=1)for(let t=-2;t<=2;t+=1)e==-2||e==2||t==-2||t==2||e==0&&t==0?i[r+e][a+t]=!0:i[r+e][a+t]=!1}},m=function(e){let t=k.getBCHTypeNumber(n);for(let n=0;n<18;n+=1){let r=!e&&(t>>n&1)==1;i[Math.floor(n/3)][n%3+a-8-3]=r}for(let n=0;n<18;n+=1){let r=!e&&(t>>n&1)==1;i[n%3+a-8-3][Math.floor(n/3)]=r}},h=function(e,t){let n=r<<3|t,o=k.getBCHTypeInfo(n);for(let t=0;t<15;t+=1){let n=!e&&(o>>t&1)==1;t<6?i[t][8]=n:t<8?i[t+1][8]=n:i[a-15+t][8]=n}for(let t=0;t<15;t+=1){let n=!e&&(o>>t&1)==1;t<8?i[8][a-t-1]=n:t<9?i[8][15-t-1+1]=n:i[8][15-t-1]=n}i[a-8][8]=!e},g=function(e,t){let n=-1,r=a-1,o=7,s=0,c=k.getMaskFunction(t);for(let t=a-1;t>0;t-=2)for(t==6&&--t;;){for(let n=0;n<2;n+=1)if(i[r][t-n]==null){let a=!1;s<e.length&&(a=(e[s]>>>o&1)==1),c(r,t-n)&&(a=!a),i[r][t-n]=a,--o,o==-1&&(s+=1,o=7)}if(r+=n,r<0||a<=r){r-=n,n=-n;break}}},_=function(e,t){let n=0,r=0,i=0,a=Array(t.length),o=Array(t.length);for(let s=0;s<t.length;s+=1){let c=t[s].dataCount,l=t[s].totalCount-c;r=Math.max(r,c),i=Math.max(i,l),a[s]=Array(c);for(let t=0;t<a[s].length;t+=1)a[s][t]=255&e.getBuffer()[t+n];n+=c;let u=k.getErrorCorrectPolynomial(l),d=j(a[s],u.getLength()-1).mod(u);o[s]=Array(u.getLength()-1);for(let e=0;e<o[s].length;e+=1){let t=e+d.getLength()-o[s].length;o[s][e]=t>=0?d.getAt(t):0}}let s=0;for(let e=0;e<t.length;e+=1)s+=t[e].totalCount;let c=Array(s),l=0;for(let e=0;e<r;e+=1)for(let n=0;n<t.length;n+=1)e<a[n].length&&(c[l]=a[n][e],l+=1);for(let e=0;e<i;e+=1)for(let n=0;n<t.length;n+=1)e<o[n].length&&(c[l]=o[n][e],l+=1);return c},v=function(e,t,n){let r=M.getRSBlocks(e,t),i=N();for(let t=0;t<n.length;t+=1){let r=n[t];i.put(r.getMode(),4),i.put(r.getLength(),k.getLengthInBits(r.getMode(),e)),r.write(i)}let a=0;for(let e=0;e<r.length;e+=1)a+=r[e].dataCount;if(i.getLengthInBits()>a*8)throw`code length overflow. (`+i.getLengthInBits()+`>`+a*8+`)`;for(i.getLengthInBits()+4<=a*8&&i.put(0,4);i.getLengthInBits()%8!=0;)i.putBit(!1);for(;!(i.getLengthInBits()>=a*8||(i.put(236,8),i.getLengthInBits()>=a*8));)i.put(17,8);return _(i,r)};c.addData=function(e,t){t||=`Byte`;let n=null;switch(t){case`Numeric`:n=P(e);break;case`Alphanumeric`:n=F(e);break;case`Byte`:n=I(e);break;case`Kanji`:n=L(e);break;default:throw`mode:`+t}s.push(n),o=null},c.isDark=function(e,t){if(e<0||a<=e||t<0||a<=t)throw e+`,`+t;return i[e][t]},c.getModuleCount=function(){return a},c.make=function(){if(n<1){let e=1;for(;e<40;e++){let t=M.getRSBlocks(e,r),n=N();for(let t=0;t<s.length;t++){let r=s[t];n.put(r.getMode(),4),n.put(r.getLength(),k.getLengthInBits(r.getMode(),e)),r.write(n)}let i=0;for(let e=0;e<t.length;e++)i+=t[e].dataCount;if(n.getLengthInBits()<=i*8)break}n=e}l(!1,d())},c.createTableTag=function(e,t){e||=2,t=t===void 0?e*4:t;let n=``;n+=`<table style="`,n+=` border-width: 0px; border-style: none;`,n+=` border-collapse: collapse;`,n+=` padding: 0px; margin: `+t+`px;`,n+=`">`,n+=`<tbody>`;for(let t=0;t<c.getModuleCount();t+=1){n+=`<tr>`;for(let r=0;r<c.getModuleCount();r+=1)n+=`<td style="`,n+=` border-width: 0px; border-style: none;`,n+=` border-collapse: collapse;`,n+=` padding: 0px; margin: 0px;`,n+=` width: `+e+`px;`,n+=` height: `+e+`px;`,n+=` background-color: `,n+=c.isDark(t,r)?`#000000`:`#ffffff`,n+=`;`,n+=`"/>`;n+=`</tr>`}return n+=`</tbody>`,n+=`</table>`,n},c.createSvgTag=function(e,t,n,r){let i={};typeof arguments[0]==`object`&&(i=arguments[0],e=i.cellSize,t=i.margin,n=i.alt,r=i.title),e||=2,t=t===void 0?e*4:t,n=typeof n==`string`?{text:n}:n||{},n.text=n.text||null,n.id=n.text?n.id||`qrcode-description`:null,r=typeof r==`string`?{text:r}:r||{},r.text=r.text||null,r.id=r.text?r.id||`qrcode-title`:null;let a=c.getModuleCount()*e+t*2,o,s,l,u,d=``,f;for(f=`l`+e+`,0 0,`+e+` -`+e+`,0 0,-`+e+`z `,d+=`<svg version="1.1" xmlns="http://www.w3.org/2000/svg"`,d+=i.scalable?``:` width="`+a+`px" height="`+a+`px"`,d+=` viewBox="0 0 `+a+` `+a+`" `,d+=` preserveAspectRatio="xMinYMin meet"`,d+=r.text||n.text?` role="img" aria-labelledby="`+y([r.id,n.id].join(` `).trim())+`"`:``,d+=`>`,d+=r.text?`<title id="`+y(r.id)+`">`+y(r.text)+`</title>`:``,d+=n.text?`<description id="`+y(n.id)+`">`+y(n.text)+`</description>`:``,d+=`<rect width="100%" height="100%" fill="white" cx="0" cy="0"/>`,d+=`<path d="`,l=0;l<c.getModuleCount();l+=1)for(u=l*e+t,o=0;o<c.getModuleCount();o+=1)c.isDark(l,o)&&(s=o*e+t,d+=`M`+s+`,`+u+f);return d+=`" stroke="transparent" fill="black"/>`,d+=`</svg>`,d},c.createDataURL=function(e,t){e||=2,t=t===void 0?e*4:t;let n=c.getModuleCount()*e+t*2,r=t,i=n-t;return H(n,n,function(t,n){if(r<=t&&t<i&&r<=n&&n<i){let i=Math.floor((t-r)/e),a=Math.floor((n-r)/e);return+!c.isDark(a,i)}return 1})},c.createImgTag=function(e,t,n){e||=2,t=t===void 0?e*4:t;let r=c.getModuleCount()*e+t*2,i=``;return i+=`<img`,i+=` src="`,i+=c.createDataURL(e,t),i+=`"`,i+=` width="`,i+=r,i+=`"`,i+=` height="`,i+=r,i+=`"`,n&&(i+=` alt="`,i+=y(n),i+=`"`),i+=`/>`,i};let y=function(e){let t=``;for(let n=0;n<e.length;n+=1){let r=e.charAt(n);switch(r){case`<`:t+=`<`;break;case`>`:t+=`>`;break;case`&`:t+=`&`;break;case`"`:t+=`"`;break;default:t+=r}}return t},b=function(e){e=e===void 0?2:e;let t=c.getModuleCount()*1+e*2,n=e,r=t-e,i,a,o,s,l,u={"██":`█`,"█ ":`▀`," █":`▄`," ":` `},d={"██":`▀`,"█ ":`▀`," █":` `," ":` `},f=``;for(i=0;i<t;i+=2){for(o=Math.floor((i-n)/1),s=Math.floor((i+1-n)/1),a=0;a<t;a+=1)l=`█`,n<=a&&a<r&&n<=i&&i<r&&c.isDark(o,Math.floor((a-n)/1))&&(l=` `),n<=a&&a<r&&n<=i+1&&i+1<r&&c.isDark(s,Math.floor((a-n)/1))?l+=` `:l+=`█`,f+=e<1&&i+1>=r?d[l]:u[l];f+=`
|
|
2
|
-
`}return t%2&&e>0?f.substring(0,f.length-t-1)+Array(t+1).join(`▀`):f.substring(0,f.length-1)};return c.createASCII=function(e,t){if(e||=1,e<2)return b(t);--e,t=t===void 0?e*2:t;let n=c.getModuleCount()*e+t*2,r=t,i=n-t,a,o,s,l,u=Array(e+1).join(`██`),d=Array(e+1).join(` `),f=``,p=``;for(a=0;a<n;a+=1){for(s=Math.floor((a-r)/e),p=``,o=0;o<n;o+=1)l=1,r<=o&&o<i&&r<=a&&a<i&&c.isDark(s,Math.floor((o-r)/e))&&(l=0),p+=l?u:d;for(s=0;s<e;s+=1)f+=p+`
|
|
3
|
-
`}return f.substring(0,f.length-1)},c.renderTo2dContext=function(e,t){t||=2;let n=c.getModuleCount();for(let r=0;r<n;r++)for(let i=0;i<n;i++)e.fillStyle=c.isDark(r,i)?`black`:`white`,e.fillRect(i*t,r*t,t,t)},c};T.stringToBytes=function(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e.charCodeAt(n);t.push(r&255)}return t},T.createStringToBytes=function(e,t){let n=function(){let n=B(e),r=function(){let e=n.read();if(e==-1)throw`eof`;return e},i=0,a={};for(;;){let e=n.read();if(e==-1)break;let t=r(),o=r(),s=r(),c=String.fromCharCode(e<<8|t);a[c]=o<<8|s,i+=1}if(i!=t)throw i+` != `+t;return a}();return function(e){let t=[];for(let r=0;r<e.length;r+=1){let i=e.charCodeAt(r);if(i<128)t.push(i);else{let i=n[e.charAt(r)];typeof i==`number`?(i&255)==i?t.push(i):(t.push(i>>>8),t.push(i&255)):t.push(63)}}return t}};var E={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},D={L:1,M:0,Q:3,H:2},O={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},k=function(){let e=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],t=1335,n=7973,r={},i=function(e){let t=0;for(;e!=0;)t+=1,e>>>=1;return t};return r.getBCHTypeInfo=function(e){let n=e<<10;for(;i(n)-i(t)>=0;)n^=t<<i(n)-i(t);return(e<<10|n)^21522},r.getBCHTypeNumber=function(e){let t=e<<12;for(;i(t)-i(n)>=0;)t^=n<<i(t)-i(n);return e<<12|t},r.getPatternPosition=function(t){return e[t-1]},r.getMaskFunction=function(e){switch(e){case O.PATTERN000:return function(e,t){return(e+t)%2==0};case O.PATTERN001:return function(e,t){return e%2==0};case O.PATTERN010:return function(e,t){return t%3==0};case O.PATTERN011:return function(e,t){return(e+t)%3==0};case O.PATTERN100:return function(e,t){return(Math.floor(e/2)+Math.floor(t/3))%2==0};case O.PATTERN101:return function(e,t){return e*t%2+e*t%3==0};case O.PATTERN110:return function(e,t){return(e*t%2+e*t%3)%2==0};case O.PATTERN111:return function(e,t){return(e*t%3+(e+t)%2)%2==0};default:throw`bad maskPattern:`+e}},r.getErrorCorrectPolynomial=function(e){let t=j([1],0);for(let n=0;n<e;n+=1)t=t.multiply(j([1,A.gexp(n)],0));return t},r.getLengthInBits=function(e,t){if(1<=t&&t<10)switch(e){case E.MODE_NUMBER:return 10;case E.MODE_ALPHA_NUM:return 9;case E.MODE_8BIT_BYTE:return 8;case E.MODE_KANJI:return 8;default:throw`mode:`+e}else if(t<27)switch(e){case E.MODE_NUMBER:return 12;case E.MODE_ALPHA_NUM:return 11;case E.MODE_8BIT_BYTE:return 16;case E.MODE_KANJI:return 10;default:throw`mode:`+e}else if(t<41)switch(e){case E.MODE_NUMBER:return 14;case E.MODE_ALPHA_NUM:return 13;case E.MODE_8BIT_BYTE:return 16;case E.MODE_KANJI:return 12;default:throw`mode:`+e}else throw`type:`+t},r.getLostPoint=function(e){let t=e.getModuleCount(),n=0;for(let r=0;r<t;r+=1)for(let i=0;i<t;i+=1){let a=0,o=e.isDark(r,i);for(let n=-1;n<=1;n+=1)if(!(r+n<0||t<=r+n))for(let s=-1;s<=1;s+=1)i+s<0||t<=i+s||(n!=0||s!=0)&&o==e.isDark(r+n,i+s)&&(a+=1);a>5&&(n+=3+a-5)}for(let r=0;r<t-1;r+=1)for(let i=0;i<t-1;i+=1){let t=0;e.isDark(r,i)&&(t+=1),e.isDark(r+1,i)&&(t+=1),e.isDark(r,i+1)&&(t+=1),e.isDark(r+1,i+1)&&(t+=1),(t==0||t==4)&&(n+=3)}for(let r=0;r<t;r+=1)for(let i=0;i<t-6;i+=1)e.isDark(r,i)&&!e.isDark(r,i+1)&&e.isDark(r,i+2)&&e.isDark(r,i+3)&&e.isDark(r,i+4)&&!e.isDark(r,i+5)&&e.isDark(r,i+6)&&(n+=40);for(let r=0;r<t;r+=1)for(let i=0;i<t-6;i+=1)e.isDark(i,r)&&!e.isDark(i+1,r)&&e.isDark(i+2,r)&&e.isDark(i+3,r)&&e.isDark(i+4,r)&&!e.isDark(i+5,r)&&e.isDark(i+6,r)&&(n+=40);let r=0;for(let n=0;n<t;n+=1)for(let i=0;i<t;i+=1)e.isDark(i,n)&&(r+=1);let i=Math.abs(100*r/t/t-50)/5;return n+=i*10,n},r}(),A=function(){let e=Array(256),t=Array(256);for(let t=0;t<8;t+=1)e[t]=1<<t;for(let t=8;t<256;t+=1)e[t]=e[t-4]^e[t-5]^e[t-6]^e[t-8];for(let n=0;n<255;n+=1)t[e[n]]=n;let n={};return n.glog=function(e){if(e<1)throw`glog(`+e+`)`;return t[e]},n.gexp=function(t){for(;t<0;)t+=255;for(;t>=256;)t-=255;return e[t]},n}(),j=function(e,t){if(e.length===void 0)throw e.length+`/`+t;let n=function(){let n=0;for(;n<e.length&&e[n]==0;)n+=1;let r=Array(e.length-n+t);for(let t=0;t<e.length-n;t+=1)r[t]=e[t+n];return r}(),r={};return r.getAt=function(e){return n[e]},r.getLength=function(){return n.length},r.multiply=function(e){let t=Array(r.getLength()+e.getLength()-1);for(let n=0;n<r.getLength();n+=1)for(let i=0;i<e.getLength();i+=1)t[n+i]^=A.gexp(A.glog(r.getAt(n))+A.glog(e.getAt(i)));return j(t,0)},r.mod=function(e){if(r.getLength()-e.getLength()<0)return r;let t=A.glog(r.getAt(0))-A.glog(e.getAt(0)),n=Array(r.getLength());for(let e=0;e<r.getLength();e+=1)n[e]=r.getAt(e);for(let r=0;r<e.getLength();r+=1)n[r]^=A.gexp(A.glog(e.getAt(r))+t);return j(n,0).mod(e)},r},M=function(){let e=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(e,t){let n={};return n.totalCount=e,n.dataCount=t,n},n={},r=function(t,n){switch(n){case D.L:return e[(t-1)*4+0];case D.M:return e[(t-1)*4+1];case D.Q:return e[(t-1)*4+2];case D.H:return e[(t-1)*4+3];default:return}};return n.getRSBlocks=function(e,n){let i=r(e,n);if(i===void 0)throw`bad rs block @ typeNumber:`+e+`/errorCorrectionLevel:`+n;let a=i.length/3,o=[];for(let e=0;e<a;e+=1){let n=i[e*3+0],r=i[e*3+1],a=i[e*3+2];for(let e=0;e<n;e+=1)o.push(t(r,a))}return o},n}(),N=function(){let e=[],t=0,n={};return n.getBuffer=function(){return e},n.getAt=function(t){let n=Math.floor(t/8);return(e[n]>>>7-t%8&1)==1},n.put=function(e,t){for(let r=0;r<t;r+=1)n.putBit((e>>>t-r-1&1)==1)},n.getLengthInBits=function(){return t},n.putBit=function(n){let r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1},n},P=function(e){let t=E.MODE_NUMBER,n=e,r={};r.getMode=function(){return t},r.getLength=function(e){return n.length},r.write=function(e){let t=n,r=0;for(;r+2<t.length;)e.put(i(t.substring(r,r+3)),10),r+=3;r<t.length&&(t.length-r==1?e.put(i(t.substring(r,r+1)),4):t.length-r==2&&e.put(i(t.substring(r,r+2)),7))};let i=function(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*10+a(e.charAt(n));return t},a=function(e){if(`0`<=e&&e<=`9`)return e.charCodeAt(0)-48;throw`illegal char :`+e};return r},F=function(e){let t=E.MODE_ALPHA_NUM,n=e,r={};r.getMode=function(){return t},r.getLength=function(e){return n.length},r.write=function(e){let t=n,r=0;for(;r+1<t.length;)e.put(i(t.charAt(r))*45+i(t.charAt(r+1)),11),r+=2;r<t.length&&e.put(i(t.charAt(r)),6)};let i=function(e){if(`0`<=e&&e<=`9`)return e.charCodeAt(0)-48;if(`A`<=e&&e<=`Z`)return e.charCodeAt(0)-65+10;switch(e){case` `:return 36;case`$`:return 37;case`%`:return 38;case`*`:return 39;case`+`:return 40;case`-`:return 41;case`.`:return 42;case`/`:return 43;case`:`:return 44;default:throw`illegal char :`+e}};return r},I=function(e){let t=E.MODE_8BIT_BYTE,n=T.stringToBytes(e),r={};return r.getMode=function(){return t},r.getLength=function(e){return n.length},r.write=function(e){for(let t=0;t<n.length;t+=1)e.put(n[t],8)},r},L=function(e){let t=E.MODE_KANJI,n=T.stringToBytes;(function(e,t){let r=n(e);if(r.length!=2||(r[0]<<8|r[1])!=t)throw`sjis not supported.`})(`友`,38726);let r=n(e),i={};return i.getMode=function(){return t},i.getLength=function(e){return~~(r.length/2)},i.write=function(e){let t=r,n=0;for(;n+1<t.length;){let r=(255&t[n])<<8|255&t[n+1];if(33088<=r&&r<=40956)r-=33088;else if(57408<=r&&r<=60351)r-=49472;else throw`illegal char at `+(n+1)+`/`+r;r=(r>>>8&255)*192+(r&255),e.put(r,13),n+=2}if(n<t.length)throw`illegal char at `+(n+1)},i},R=function(){let e=[],t={};return t.writeByte=function(t){e.push(t&255)},t.writeShort=function(e){t.writeByte(e),t.writeByte(e>>>8)},t.writeBytes=function(e,n,r){n||=0,r||=e.length;for(let i=0;i<r;i+=1)t.writeByte(e[i+n])},t.writeString=function(e){for(let n=0;n<e.length;n+=1)t.writeByte(e.charCodeAt(n))},t.toByteArray=function(){return e},t.toString=function(){let t=``;t+=`[`;for(let n=0;n<e.length;n+=1)n>0&&(t+=`,`),t+=e[n];return t+=`]`,t},t},z=function(){let e=0,t=0,n=0,r=``,i={},a=function(e){r+=String.fromCharCode(o(e&63))},o=function(e){if(e<0)throw`n:`+e;if(e<26)return 65+e;if(e<52)return 97+(e-26);if(e<62)return 48+(e-52);if(e==62)return 43;if(e==63)return 47;throw`n:`+e};return i.writeByte=function(r){for(e=e<<8|r&255,t+=8,n+=1;t>=6;)a(e>>>t-6),t-=6},i.flush=function(){if(t>0&&(a(e<<6-t),e=0,t=0),n%3!=0){let e=3-n%3;for(let t=0;t<e;t+=1)r+=`=`}},i.toString=function(){return r},i},B=function(e){let t=e,n=0,r=0,i=0,a={};a.read=function(){for(;i<8;){if(n>=t.length){if(i==0)return-1;throw`unexpected end of file./`+i}let e=t.charAt(n);if(n+=1,e==`=`)return i=0,-1;e.match(/^\s$/)||(r=r<<6|o(e.charCodeAt(0)),i+=6)}let e=r>>>i-8&255;return i-=8,e};let o=function(e){if(65<=e&&e<=90)return e-65;if(97<=e&&e<=122)return e-97+26;if(48<=e&&e<=57)return e-48+52;if(e==43)return 62;if(e==47)return 63;throw`c:`+e};return a},V=function(e,t){let n=e,r=t,i=Array(e*t),a={};a.setPixel=function(e,t,r){i[t*n+e]=r},a.write=function(e){e.writeString(`GIF87a`),e.writeShort(n),e.writeShort(r),e.writeByte(128),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(255),e.writeByte(255),e.writeByte(255),e.writeString(`,`),e.writeShort(0),e.writeShort(0),e.writeShort(n),e.writeShort(r),e.writeByte(0);let t=s(2);e.writeByte(2);let i=0;for(;t.length-i>255;)e.writeByte(255),e.writeBytes(t,i,255),i+=255;e.writeByte(t.length-i),e.writeBytes(t,i,t.length-i),e.writeByte(0),e.writeString(`;`)};let o=function(e){let t=e,n=0,r=0,i={};return i.write=function(e,i){if(e>>>i)throw`length over`;for(;n+i>=8;)t.writeByte(255&(e<<n|r)),i-=8-n,e>>>=8-n,r=0,n=0;r=e<<n|r,n+=i},i.flush=function(){n>0&&t.writeByte(r)},i},s=function(e){let t=1<<e,n=(1<<e)+1,r=e+1,a=c();for(let e=0;e<t;e+=1)a.add(String.fromCharCode(e));a.add(String.fromCharCode(t)),a.add(String.fromCharCode(n));let s=R(),l=o(s);l.write(t,r);let u=0,d=String.fromCharCode(i[u]);for(u+=1;u<i.length;){let e=String.fromCharCode(i[u]);u+=1,a.contains(d+e)?d+=e:(l.write(a.indexOf(d),r),a.size()<4095&&(a.size()==1<<r&&(r+=1),a.add(d+e)),d=e)}return l.write(a.indexOf(d),r),l.write(n,r),l.flush(),s.toByteArray()},c=function(){let e={},t=0,n={};return n.add=function(r){if(n.contains(r))throw`dup key:`+r;e[r]=t,t+=1},n.size=function(){return t},n.indexOf=function(t){return e[t]},n.contains=function(t){return e[t]!==void 0},n};return a},H=function(e,t,n){let r=V(e,t);for(let i=0;i<t;i+=1)for(let t=0;t<e;t+=1)r.setPixel(t,i,n(t,i));let i=R();r.write(i);let a=z(),o=i.toByteArray();for(let e=0;e<o.length;e+=1)a.writeByte(o[e]);return a.flush(),`data:image/gif;base64,`+a};T.stringToBytes;function U(){return U=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},U.apply(null,arguments)}function W(e,t){if(e==null)return{};var n,r,i=G(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function G(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}var K=[`bgColor`,`bgD`,`fgD`,`fgColor`,`size`,`title`,`viewBoxSize`,`xmlns`],q={bgColor:w.default.oneOfType([w.default.object,w.default.string]).isRequired,bgD:w.default.string.isRequired,fgColor:w.default.oneOfType([w.default.object,w.default.string]).isRequired,fgD:w.default.string.isRequired,size:w.default.number.isRequired,title:w.default.string,viewBoxSize:w.default.number.isRequired,xmlns:w.default.string},J=(0,C.forwardRef)(function(e,t){var n=e.bgColor,r=e.bgD,i=e.fgD,a=e.fgColor,o=e.size,s=e.title,c=e.viewBoxSize,l=e.xmlns,u=l===void 0?`http://www.w3.org/2000/svg`:l,d=W(e,K);return C.createElement(`svg`,U({},d,{height:o,ref:t,viewBox:`0 0 ${c} ${c}`,width:o,xmlns:u}),s?C.createElement(`title`,null,s):null,C.createElement(`path`,{d:r,fill:n}),C.createElement(`path`,{d:i,fill:a}))});J.displayName=`QRCodeSvg`,J.propTypes=q;var Y=[`bgColor`,`fgColor`,`level`,`size`,`value`];T.stringToBytes=function(e){return Array.from(new TextEncoder().encode(e))};var X={bgColor:w.default.oneOfType([w.default.object,w.default.string]),fgColor:w.default.oneOfType([w.default.object,w.default.string]),level:w.default.string,size:w.default.number,value:w.default.string.isRequired},Z=(0,C.forwardRef)(function(e,t){var n=e.bgColor,r=n===void 0?`#FFFFFF`:n,i=e.fgColor,a=i===void 0?`#000000`:i,o=e.level,s=o===void 0?`L`:o,c=e.size,l=c===void 0?256:c,u=e.value,d=W(e,Y),f=T(0,s);f.addData(u),f.make();var p=f.getModuleCount(),m=Array.from({length:p},function(e,t){return Array.from({length:p},function(e,n){return f.isDark(t,n)})});return C.createElement(J,U({},d,{bgColor:r,bgD:m.map(function(e,t){return e.map(function(e,n){return e?``:`M ${n} ${t} l 1 0 0 1 -1 0 Z`}).join(` `)}).join(` `),fgColor:a,fgD:m.map(function(e,t){return e.map(function(e,n){return e?`M ${n} ${t} l 1 0 0 1 -1 0 Z`:``}).join(` `)}).join(` `),ref:t,size:l,viewBoxSize:p}))});Z.displayName=`QRCode`,Z.propTypes=X;var Q=n();function $(){let{snap:t}=u(),{busy:n,run:r}=p(),i=[...t.instances?.native?[t.instances.native]:[],...t.instances?.instances??[]],d=t.lan?.items??[],b=(t.lan?.addresses??[])[0]||``,x=t.frp,[S,w]=(0,C.useState)(``),[T,E]=(0,C.useState)(`7000`),[D,O]=(0,C.useState)(``),[k,A]=(0,C.useState)(!1);(0,C.useEffect)(()=>{!x||k||(w(x.settings.serverAddr||``),E(String(x.settings.serverPort||7e3)),O(x.settings.authToken||``),A(!0))},[x,k]);async function j(){await r(`frp-save`,()=>l.frpSettings({serverAddr:S,serverPort:parseInt(T,10)||7e3,authToken:D}),{success:`已保存 FRP 配置`})}return(0,Q.jsx)(`div`,{className:`grid content-start gap-4`,children:(0,Q.jsxs)(`div`,{className:`grid items-start gap-4 @min-[900px]:grid-cols-[minmax(0,1fr)_420px]`,children:[(0,Q.jsxs)(_,{children:[(0,Q.jsx)(m,{title:`局域网远程控制`,subtitle:`为本地 DSH 实例开启局域网反向代理访问(需实例运行中)`}),(0,Q.jsx)(`div`,{className:`grid`,children:i.length?i.map(t=>{let n=t.state?.running??!1,i=d.find(e=>e.dshPort===t.port),a=!!i?.running,s=!!i?.enabled,c=n&&s&&a&&b?`http://`+b+`:`+i?.wanPort+`/`:null,u=a?i?.inject:null,p=!!(n&&s&&a&&u?.cookieReady),m=n?s?a?u?.cookieReady?`DSH 会话 cookie 已注入,远程访问已认证`:u?.tokenSet?u?.lastError||`正在注入…`:`令牌缺失`:`远程服务未就绪`:`远程未开启(点右侧开关开启)`:`实例未运行`,_=p?(0,Q.jsx)(h,{tone:`ok`,children:`远程就绪`}):(0,Q.jsx)(`span`,{title:m,children:(0,Q.jsx)(h,{tone:`off`,children:`远程停止`})});return(0,Q.jsxs)(`div`,{className:`grid grid-cols-[auto_minmax(0,1fr)_auto] items-stretch gap-4 border-b border-border/60 px-5 py-4 last:border-b-0`,children:[c?(0,Q.jsx)(`div`,{className:`flex shrink-0 items-center rounded-lg border border-border bg-white p-1.5`,title:`扫码访问该实例远程地址`,children:(0,Q.jsx)(Z,{value:c,size:88})}):(0,Q.jsx)(`div`,{className:`grid size-[96px] shrink-0 place-items-center rounded-lg border border-dashed border-border/70 text-[11px] leading-tight text-muted-foreground/60`,children:n?`代理就绪后生成二维码`:`启动后可用`}),(0,Q.jsxs)(`div`,{className:`flex min-w-0 flex-col`,children:[(0,Q.jsxs)(`div`,{className:`pt-2.5 flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(g,{domain:t.domain}),(0,Q.jsx)(`strong`,{className:`truncate text-sm font-semibold text-foreground`,children:t.name}),_]}),(0,Q.jsxs)(`div`,{className:`mt-auto grid content-end gap-1.5 pb-1`,children:[(0,Q.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`端口 `,t.port,t.remoteEnabled?` · 远程已开`:` · 远程未开`]}),c?(0,Q.jsxs)(`a`,{className:`inline-flex max-w-full items-center gap-1 truncate text-xs text-primary hover:underline`,href:c,target:`_blank`,rel:`noreferrer`,children:[(0,Q.jsx)(f,{className:`size-3 shrink-0`}),c]}):(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground/70`,children:n?`等待代理就绪…`:`实例未运行,启动后可开启远程`})]})]}),(0,Q.jsxs)(`div`,{className:e(`flex items-center gap-2`,!n&&`pointer-events-none opacity-50`),children:[(0,Q.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:`远程控制`}),(0,Q.jsx)(o,{checked:t.remoteEnabled??!1,disabled:!n,onCheckedChange:e=>void r(t.id,()=>t.domain===`native`?l.nativeSettings({remoteEnabled:e}):l.instanceUpdate(t.id,{remoteEnabled:e}),{success:e?`已开启远程控制`:`已关闭远程控制`})})]})]},t.id)}):(0,Q.jsx)(`div`,{className:`px-5 py-8 text-center text-sm text-muted-foreground`,children:`暂无实例(在「实例管理」添加后将出现在这里)`})})]}),(0,Q.jsxs)(_,{children:[(0,Q.jsx)(m,{title:`公网访问(FRP 内网穿透)`,subtitle:`通过 frpc 暴露本机端口到公网`,actions:(0,Q.jsx)(h,{tone:x?.running?`ok`:x?.installed?`warn`:`off`,children:x?.running?`frpc 运行中`:x?.installed?`已安装 · 未运行`:`未安装`})}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 gap-3 px-5 py-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,Q.jsx)(c,{children:`frps 地址`}),(0,Q.jsx)(s,{placeholder:`如 1.2.3.4`,value:S,onChange:e=>w(e.target.value)})]}),(0,Q.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,Q.jsx)(c,{children:`frps 端口`}),(0,Q.jsx)(s,{inputMode:`numeric`,placeholder:`7000`,value:T,onChange:e=>E(e.target.value)})]}),(0,Q.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,Q.jsx)(c,{children:`auth token`}),(0,Q.jsx)(s,{placeholder:`frps 的 auth.token`,value:D,onChange:e=>O(e.target.value)})]})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 px-5 pb-4`,children:[(0,Q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[x?.installed?``:`需安装 frpc`,(x?.instancesExposed?.length??0)>0?` · 公网暴露 `+x?.instancesExposed?.length+` 个实例`:` · 无公网暴露实例`]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsxs)(a,{disabled:n===`frp-inst`,onClick:()=>void r(`frp-inst`,()=>l.frpInstall(),{success:`frpc 安装完成`}),variant:`outline`,children:[(0,Q.jsx)(y,{className:`size-4`}),`安装 frpc`]}),(0,Q.jsxs)(a,{disabled:n===`frp-save`,onClick:()=>void j(),children:[(0,Q.jsx)(v,{className:`size-4`}),`保存并应用`]})]})]}),x?.logTail?.length?(0,Q.jsx)(`pre`,{className:`mx-5 mb-4 max-h-[160px] overflow-auto whitespace-pre-wrap break-all rounded-md bg-muted/70 p-3 font-mono text-xs leading-relaxed text-muted-foreground`,children:x.logTail.join(`
|
|
4
|
-
`)}):null]})]})})}export{$ as LanPage};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{E as e,L as t,O as n,P as r,T as i,_ as a,b as o,c as s,d as c,f as l,g as u,h as d,k as f,l as p,p as m,r as h,s as g,u as _,w as v,y,z as b}from"./supervisor-m53cymoX.js";import{n as x,t as S}from"./rocket-CT4BqsDO.js";import{t as C}from"./refresh-cw-3BcNWlWU.js";import{c as w,u as T}from"./supervisor-AngOxQui.js";import{t as E}from"./useSupervisorAction-BG3WZkEK.js";import{n as D,o as O,t as k}from"./widgets-OLyrPchF.js";var A=r(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),j=r(`store`,[[`path`,{d:`M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5`,key:`slp6dd`}],[`path`,{d:`M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244`,key:`o0xfot`}],[`path`,{d:`M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05`,key:`wn3emo`}]]),M=b(t(),1);function N(e){return e>=1073741824?`${(e/1024/1024/1024).toFixed(1)} GB`:e>=1048576?`${(e/1024/1024).toFixed(0)} MB`:e>=1024?`${(e/1024).toFixed(0)} KB`:`${e} B`}var P=n(),F=24;function I(){let[t,n]=(0,M.useState)(`market`);return(0,P.jsxs)(`div`,{className:`grid content-start gap-4`,children:[(0,P.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,P.jsx)(`div`,{className:`flex gap-1 rounded-lg bg-muted p-1`,children:[`market`,`installed`].map(r=>(0,P.jsxs)(i,{className:e(`font-medium`,t===r?`bg-card text-foreground shadow-sm`:`bg-transparent text-muted-foreground hover:bg-card/60 hover:text-foreground`),onClick:()=>n(r),size:`sm`,variant:`ghost`,children:[r===`market`?(0,P.jsx)(j,{className:`size-3.5`}):(0,P.jsx)(T,{className:`size-3.5`}),r===`market`?`插件商店`:`已安装`]},r))}),t===`market`?(0,P.jsx)(L,{}):null]}),t===`market`?(0,P.jsx)(R,{}):(0,P.jsx)(V,{})]})}function L(){let[t,n]=(0,M.useState)(!1);async function r(){n(!0);try{await h.market(!0),f.success(`插件索引已刷新`)}catch(e){f.error(String(e))}n(!1)}return(0,P.jsxs)(i,{disabled:t,onClick:()=>void r(),size:`chip`,variant:`outline`,children:[(0,P.jsx)(C,{className:e(`size-3.5`,t&&`animate-spin`)}),`刷新`]})}function R(){let[t,n]=(0,M.useState)(null),[r,v]=(0,M.useState)(``),[b,x]=(0,M.useState)(`all`),[S,C]=(0,M.useState)(`all`),[w,T]=(0,M.useState)(0),[E,D]=(0,M.useState)(null),[k,j]=(0,M.useState)([]),[N,I]=(0,M.useState)(`native`);(0,M.useEffect)(()=>{let e=!0;return h.market().then(t=>{e&&(n(t),T(F))}).catch(()=>void 0),()=>{e=!1}},[]);let L=(0,M.useMemo)(()=>{if(!t)return[];let e=r.trim().toLowerCase();return t.plugins.filter(t=>(b===`all`||t.category===b)&&(S===`all`||t.source===S)&&(!e||(t.name+` `+(t.description||``)).toLowerCase().includes(e)))},[t,r,b,S]),R=(0,M.useMemo)(()=>{let e={};for(let n of t?.plugins??[])e[n.category]=(e[n.category]||0)+1;return Object.entries(e).sort((e,t)=>t[1]-e[1])},[t]);async function V(e){D(e),I(`native`);try{let e=await h.instances();j((e.instances??[]).filter(e=>e.domain===`sandbox`).map(e=>({id:e.id,name:e.name})))}catch{j([])}}async function H(){if(E)try{let e=await h.pluginInstall(E.name,N);if(e.ok===!1){f.error(e.error||`安装失败`);return}f.success(`安装任务已提交`+(e.jobId?`(job `+e.jobId+`)`:``)),D(null)}catch(e){f.error(String(e))}}return(0,P.jsxs)(`div`,{className:`grid content-start gap-3`,children:[(0,P.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,P.jsxs)(`div`,{className:`relative min-w-[220px] flex-1`,children:[(0,P.jsx)(A,{className:`absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground`}),(0,P.jsx)(d,{className:`pl-8`,placeholder:`搜索插件名称、描述…`,value:r,onChange:e=>v(e.target.value)})]}),(0,P.jsxs)(g,{value:b,onValueChange:x,children:[(0,P.jsx)(_,{className:`h-9 w-[150px] shrink-0`,children:(0,P.jsx)(c,{placeholder:`全部分类`})}),(0,P.jsxs)(s,{children:[(0,P.jsx)(p,{value:`all`,children:`全部分类`}),R.map(([e,t])=>(0,P.jsxs)(p,{value:e,children:[e,` (`,t,`)`]},e))]})]}),(0,P.jsxs)(g,{value:S,onValueChange:C,children:[(0,P.jsx)(_,{className:`h-9 w-[130px] shrink-0`,children:(0,P.jsx)(c,{placeholder:`全部来源`})}),(0,P.jsxs)(s,{children:[(0,P.jsx)(p,{value:`all`,children:`全部来源`}),(0,P.jsx)(p,{value:`npm`,children:`npm`}),(0,P.jsx)(p,{value:`github`,children:`GitHub`}),(0,P.jsx)(p,{value:`community`,children:`社区`}),(0,P.jsx)(p,{value:`official`,children:`官方`})]})]})]}),t?(0,P.jsxs)(P.Fragment,{children:[(0,P.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`共 `,t.plugins.length,` 个插件 · 更新 `,t.indexedAt?new Date(t.indexedAt).toLocaleString():`—`,` · npm `,t.sources?.npm||0,` · GitHub `,t.sources?.github||0,` · 社区 `,t.sources?.community||0]}),L.length?(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(`div`,{className:`grid grid-cols-1 gap-3 @min-[640px]:grid-cols-2 @min-[1000px]:grid-cols-3`,children:L.slice(0,w).map(e=>(0,P.jsxs)(`div`,{className:`flex min-h-[150px] flex-col rounded-lg border border-border bg-card p-4`,children:[(0,P.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,P.jsx)(`strong`,{className:`truncate font-mono text-sm text-foreground`,children:e.name}),(0,P.jsx)(O,{tone:B(e.source),children:z(e.source)})]}),(0,P.jsx)(`p`,{className:`mt-2 line-clamp-3 min-h-[36px] text-xs leading-relaxed text-muted-foreground`,children:e.description||`(无描述)`}),(0,P.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,P.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5`,children:e.category}),e.version?(0,P.jsxs)(`span`,{className:`font-mono`,children:[`v`,e.version]}):null,e.stars?(0,P.jsxs)(`span`,{children:[`⭐`,e.stars]}):null]}),(0,P.jsxs)(`div`,{className:`mt-auto flex items-center justify-between gap-2 pt-3`,children:[(0,P.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:e.author||``}),(0,P.jsx)(i,{onClick:()=>void V(e),size:`chip`,children:`安装`})]})]},e.name))}),w<L.length?(0,P.jsxs)(i,{className:`justify-self-center`,onClick:()=>T(e=>e+F),variant:`outline`,children:[`加载更多(`,w,`/`,L.length,`)`]}):null]}):(0,P.jsx)(`div`,{className:`grid place-items-center rounded-lg border border-dashed border-border py-16 text-sm text-muted-foreground`,children:`无匹配插件`})]}):(0,P.jsx)(`div`,{className:`grid place-items-center py-20 text-sm text-muted-foreground`,children:`加载插件索引…`}),(0,P.jsx)(u,{open:!!E,onOpenChange:e=>!e&&D(null),children:(0,P.jsxs)(a,{className:`max-w-[400px]`,children:[(0,P.jsx)(y,{children:(0,P.jsxs)(o,{children:[`安装插件 — `,E?.name]})}),(0,P.jsx)(`div`,{className:`grid gap-2`,children:(0,P.jsx)(l,{value:N,onValueChange:I,className:`grid gap-2`,children:[[`native`,`原生实例`],[`all`,`所有实例(含原生)`]].concat(k.map(e=>[`id:`+e.id,e.name+`(`+e.id.slice(0,8)+`…)`])).map(([t,n])=>(0,P.jsxs)(`label`,{className:e(`flex cursor-pointer items-center gap-2 rounded-md border px-3 py-2 text-sm`,N===t?`border-primary/40 bg-primary/[0.05] text-foreground`:`border-border text-muted-foreground hover:bg-muted`),children:[(0,P.jsx)(m,{value:t}),n]},t))})}),(0,P.jsxs)(`div`,{className:`mt-3 flex justify-end gap-2`,children:[(0,P.jsx)(i,{onClick:()=>D(null),variant:`outline`,children:`取消`}),(0,P.jsx)(i,{onClick:()=>void H(),children:`开始安装`})]})]})})]})}var z=e=>({npm:`npm`,github:`GitHub`,community:`社区`,official:`官方`})[e]??e,B=e=>e===`official`?`boot`:e===`npm`?`ok`:e===`github`?`warn`:`off`;function V(){let[t,n]=(0,M.useState)(null),[r,a]=(0,M.useState)(`all`),[o,s]=(0,M.useState)(new Set),[c,l]=(0,M.useState)(new Map),[u,d]=(0,M.useState)(!1),{busy:p,run:m}=E(),g=async()=>{let e=await h.pluginsInstalled().catch(()=>null);n(e)};(0,M.useEffect)(()=>{g()},[]);let _=t?.thirdParty??[],y=e=>e.targets&&e.targets.length?e.targets:[`native`],b=_.filter(e=>r===`all`||y(e).includes(r)),A=e=>s(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),j=b.length>0&&b.every(e=>o.has(e.name)),F=()=>s(j?new Set:new Set(b.map(e=>e.name))),I=b.filter(e=>o.has(e.name)),L=I.some(e=>c.has(e.name)),R=I.filter(e=>e.enabled),z=I.filter(e=>!e.enabled);async function B(){d(!0);try{let e=await h.pluginsCheckUpdates(!0),t=new Map;for(let n of e.plugins??[]){if(!n.updateAvailable)continue;let e=n.targets?.find(e=>e.latest)?.latest||``;t.set(n.name,e)}l(t),f.success(t.size?`发现 `+t.size+` 个可更新插件`:`全部插件已是最新`),await g()}catch(e){f.error(String(e))}d(!1)}async function V(){let e=I.filter(e=>c.has(e.name)).map(e=>e.name);if(!e.length){f.info(`所选插件均无可用更新`);return}s(new Set),l(t=>{let n=new Map(t);for(let t of e)n.delete(t);return n}),await m(`upd-sel`,async()=>{for(let t of e)try{await h.pluginUpdate(t)}catch{}},{success:`已提交 `+e.length+` 个插件的更新任务`,refresh:!1,onDone:()=>void g()})}async function H(){let e=I.map(e=>e.name);confirm(`将卸载所选 `+e.length+` 个插件:
|
|
2
|
-
`+e.join(`
|
|
3
|
-
`)+`
|
|
4
|
-
|
|
5
|
-
确定继续?`)&&(s(new Set),await m(`uni-sel`,async()=>{for(let t of e)try{await h.pluginUninstall(t)}catch{}},{success:`已提交 `+e.length+` 个插件的卸载任务`,refresh:!1,onDone:()=>void g()}))}async function U(){let e=R.map(e=>e.name);s(new Set),await m(`stop-sel`,async()=>{for(let t of e)try{await h.pluginDisable(t)}catch{}},{success:`已停止 `+e.length+` 个插件`,refresh:!1,onDone:()=>void g()})}async function W(){let e=z.map(e=>e.name);s(new Set),await m(`start-sel`,async()=>{for(let t of e)try{await h.pluginEnable(t)}catch{}},{success:`已启动 `+e.length+` 个插件`,refresh:!1,onDone:()=>void g()})}let G=`grid grid-cols-[88px_minmax(0,1fr)_120px_84px_36px] items-center gap-3`;return(0,P.jsxs)(k,{className:`overflow-hidden`,children:[(0,P.jsx)(D,{title:`已安装插件`+(t?`(`+b.length+`)`:``),subtitle:r===`all`?`全部实例`:`实例:`+((t?.targets??[]).find(e=>e.id===r)?.name??r),actions:(0,P.jsxs)(P.Fragment,{children:[L?(0,P.jsxs)(i,{disabled:p===`upd-sel`,onClick:()=>void V(),size:`sm`,children:[(0,P.jsx)(C,{className:`size-3.5`}),`更新(`,I.filter(e=>c.has(e.name)).length,`)`]}):(0,P.jsxs)(i,{disabled:u,onClick:()=>void B(),size:`sm`,variant:`outline`,children:[(0,P.jsx)(C,{className:e(`size-3.5`,u&&`animate-spin`)}),u?`检查中…`:`检查更新`]}),I.length>0?(0,P.jsxs)(P.Fragment,{children:[R.length>0?(0,P.jsxs)(i,{disabled:p===`stop-sel`,onClick:()=>void U(),size:`sm`,variant:`outline`,children:[(0,P.jsx)(x,{className:`size-3.5`}),`停用(`,R.length,`)`]}):null,z.length>0?(0,P.jsxs)(i,{disabled:p===`start-sel`,onClick:()=>void W(),size:`sm`,variant:`outline`,children:[(0,P.jsx)(S,{className:`size-3.5`}),`启动(`,z.length,`)`]}):null,(0,P.jsxs)(i,{className:`h-[30px]`,disabled:p===`uni-sel`,onClick:()=>void H(),size:`sm`,variant:`destructive`,children:[(0,P.jsx)(w,{className:`size-3.5`}),`卸载(`,I.length,`)`]})]}):null]})}),(0,P.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 border-b border-border/60 px-5 py-2.5`,children:[(0,P.jsx)(i,{className:e(r===`all`?`bg-primary/10 text-primary hover:bg-primary/15`:`text-muted-foreground hover:bg-muted hover:text-foreground`),onClick:()=>a(`all`),size:`sm`,variant:`ghost`,children:`全部实例`}),(t?.targets??[]).map(t=>(0,P.jsx)(i,{className:e(r===t.id?`bg-primary/10 text-primary hover:bg-primary/15`:`text-muted-foreground hover:bg-muted hover:text-foreground`),onClick:()=>a(t.id),size:`sm`,variant:`ghost`,children:t.name},t.id))]}),t?b.length?(0,P.jsx)(P.Fragment,{children:(0,P.jsxs)(`div`,{className:`overflow-x-auto`,children:[(0,P.jsxs)(`div`,{className:e(G,`min-w-[720px] border-b border-border/70 bg-muted px-5 py-2 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground`),children:[(0,P.jsx)(`span`,{children:`来源`}),(0,P.jsx)(`span`,{children:`插件`}),(0,P.jsx)(`span`,{children:`版本`}),(0,P.jsx)(`span`,{className:`text-right`,children:`大小`}),(0,P.jsx)(`span`,{className:`flex justify-end`,children:(0,P.jsx)(v,{"aria-label":`全选`,checked:j,onChange:F})})]}),(0,P.jsx)(`div`,{className:`max-h-[560px] overflow-auto`,children:b.map(t=>{let n=o.has(t.name),r=c.get(t.name);return(0,P.jsxs)(`label`,{className:e(G,`min-h-[46px] min-w-[720px] w-full cursor-pointer border-b border-border/50 px-5 py-2 text-left transition-colors last:border-b-0 hover:bg-muted/40`,n&&`bg-muted/70 shadow-[inset_3px_0_0_var(--primary)]`),children:[(0,P.jsx)(`span`,{className:`inline-flex w-fit min-w-0 items-center`,children:(0,P.jsx)(O,{tone:t.bundle?`boot`:t.source?.includes(`github`)?`warn`:t.source===`npm`?`ok`:`off`,children:t.bundle?`bundle`:t.source===`npm`?`npm`:t.source?.includes(`github`)?`GitHub`:t.source&&t.source!==t.name?`本地`:`—`})}),(0,P.jsx)(`span`,{className:`grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-2`,children:(0,P.jsxs)(`span`,{className:`grid min-w-0 gap-0.5`,children:[(0,P.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,P.jsx)(`strong`,{className:`truncate font-mono text-[13px] font-semibold leading-tight text-foreground`,children:t.name}),(0,P.jsx)(O,{tone:t.enabled?`ok`:`off`,children:t.enabled?`已启用`:`已停用`})]}),t.description?(0,P.jsx)(`span`,{className:`truncate text-xs leading-tight text-muted-foreground`,children:t.description}):null]})}),(0,P.jsx)(`span`,{className:`min-w-0`,children:r?(0,P.jsxs)(`span`,{className:`inline-flex flex-wrap items-center gap-1.5`,children:[(0,P.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:t.version?`v`+t.version:`—`}),(0,P.jsx)(O,{tone:`warn`,children:`可更新`})]}):(0,P.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:t.version?`v`+t.version:`—`})}),(0,P.jsx)(`span`,{className:`text-right font-mono text-xs tabular-nums text-foreground`,children:t.size?N(t.size):`—`}),(0,P.jsx)(`span`,{className:`flex justify-end`,children:(0,P.jsx)(v,{"aria-label":`选择 `+t.name,checked:n,onChange:()=>A(t.name)})})]},t.name)})})]})}):(0,P.jsxs)(`div`,{className:`grid place-items-center rounded-lg border-0 py-16 text-center`,children:[(0,P.jsx)(T,{className:`mx-auto mb-3 size-8 text-muted-foreground`}),(0,P.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`当前实例均未安装第三方插件`})]}):(0,P.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`加载中…`})]})}export{I as PluginsPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as e,L as t,O as n,P as r,T as i,_ as a,b as o,c as s,d as c,g as l,h as u,i as d,j as f,k as p,l as m,m as h,n as g,r as _,s as v,t as y,u as b,y as x,z as S}from"./supervisor-m53cymoX.js";import{n as C,t as w}from"./rocket-CT4BqsDO.js";import{t as T}from"./refresh-cw-3BcNWlWU.js";import{c as E,f as D,l as O}from"./supervisor-AngOxQui.js";import{t as k}from"./useSupervisorAction-BG3WZkEK.js";import{a as A,c as j,i as M,o as N,s as P,t as F}from"./widgets-OLyrPchF.js";import{n as I}from"./format-QeaTKFhQ.js";var L=r(`ban`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M4.929 4.929 19.07 19.071`,key:`196cmz`}]]),R=r(`circle-x`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]]),z=r(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]),B=r(`repeat`,[[`path`,{d:`m17 2 4 4-4 4`,key:`nntrym`}],[`path`,{d:`M3 11v-1a4 4 0 0 1 4-4h14`,key:`84bu3i`}],[`path`,{d:`m7 22-4-4 4-4`,key:`1wqhfi`}],[`path`,{d:`M21 13v1a4 4 0 0 1-4 4H3`,key:`1rx37r`}]]),V=r(`terminal`,[[`path`,{d:`M12 19h8`,key:`baeox8`}],[`path`,{d:`m4 17 6-6-6-6`,key:`1yngyt`}]]),H=S(t(),1),U=n();function W(e){if(!e)return!1;let t=e=>!!(e&&(e.status===`rate-limited`||Number(e.percent)>=100));return t(e.rolling)||t(e.weekly)||t(e.monthly)}function G(e){return!e||!Number.isFinite(e)?``:new Date(e).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}function K(e){return[...e].sort((e,t)=>{let n=e=>e.selected?0:e.usable&&!W(e.quota)?1:2;return n(e)-n(t)})}var q=`grid-cols-[minmax(0,1fr)_230px_84px]`;function J({onRegisterActions:t}){let{snap:n}=y(),{busy:r,run:a}=k(),[o,s]=(0,H.useState)(!1),[c,l]=(0,H.useState)(!1),u=n.router,d=n.providers;(0,H.useEffect)(()=>(t?.({onAdd:()=>s(!0),onDelete:()=>l(!0)}),()=>t?.(null)),[t]);function p(e,t,n){return a(e,t,{success:n})}let m=d?.providers??[];return(0,U.jsxs)(`div`,{className:`grid content-start gap-4`,children:[(0,U.jsxs)(F,{children:[(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 border-b border-border/70 px-5 py-3.5`,children:[(0,U.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,U.jsx)(j,{tone:u?.running?`ok`:u?.conflict?`warn`:`off`,ping:!!u?.running}),(0,U.jsx)(`strong`,{className:`text-xl font-semibold tracking-[-0.01em] text-foreground`,children:u?.running?`路由运行中`:u?.conflict?`端口被占`:`路由已停止`})]}),(0,U.jsx)(i,{"aria-label":u?.running?`停止路由`:`启动路由`,className:e(`px-1`,u?.running?`text-status-error`:`text-primary`),disabled:r===`sw`,onClick:()=>void p(`sw`,()=>u?.running?_.lifecycleStop(`router`):_.lifecycleStart(`router`),u?.running?`路由已停止`:`路由已启动`),title:u?.running?`停止路由`:`启动路由`,variant:`ghost`,children:u?.running?(0,U.jsx)(C,{className:`size-6`}):(0,U.jsx)(w,{className:`size-6`})})]}),(0,U.jsxs)(`div`,{className:`grid grid-cols-1 divide-y divide-border/60 sm:grid-cols-2 sm:divide-y-0 lg:grid-cols-4 lg:divide-x lg:divide-border/60`,children:[(0,U.jsx)(`div`,{className:`px-5 py-3.5`,children:(0,U.jsx)(M,{icon:(0,U.jsx)(D,{className:`size-4`}),label:`总请求 / 失败`,value:I(u?.usage.requests)+` / `+I(u?.usage.errors),mono:!0})}),(0,U.jsx)(`div`,{className:`px-5 py-3.5`,children:(0,U.jsx)(M,{icon:(0,U.jsx)(f,{className:`size-4`}),label:`总 Tokens`,value:I(u?.usage.totalTokens),mono:!0})}),(0,U.jsx)(`div`,{className:`px-5 py-3.5`,children:(0,U.jsx)(M,{icon:(0,U.jsx)(V,{className:`size-4`}),label:`Prompt / Completion`,value:I(u?.usage.promptTokens)+` / `+I(u?.usage.completionTokens),mono:!0})}),(0,U.jsx)(`div`,{className:`px-5 py-3.5`,children:(0,U.jsx)(M,{icon:(0,U.jsx)(R,{className:`size-4`}),label:`估算费用`,value:u?.usage.costUsd?`$`+Number(u.usage.costUsd).toFixed(4):`—`,mono:!0,warn:!u?.usage.costUsd})})]})]}),m.length?(0,U.jsx)(`div`,{className:`grid gap-4 @min-[900px]:grid-cols-2`,children:m.map(e=>(0,U.jsx)(X,{p:e,proxyApps:d?.proxyApps??[],busy:r===e.id,onAction:p},e.id))}):(0,U.jsx)(`div`,{className:`grid min-h-[200px] place-items-center rounded-lg border border-dashed border-border text-center`,children:(0,U.jsxs)(`div`,{children:[(0,U.jsx)(D,{className:`mx-auto mb-3 size-8 text-muted-foreground`}),(0,U.jsx)(`p`,{className:`text-sm font-medium text-foreground`,children:`尚未添加供应商`}),(0,U.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`点击「添加供应商」录入 API Key / Command Code`})]})}),(0,U.jsx)(te,{open:o,onOpenChange:s,presets:d?.presets??[],proxyApps:d?.proxyApps??[],onDone:()=>g.refresh()}),(0,U.jsx)(Y,{open:c,onOpenChange:l,providers:m})]})}function Y({open:e,onOpenChange:t,providers:n}){let[r,s]=(0,H.useState)(null);async function c(e){if(confirm(`删除供应商「`+e.name+`」?其下全部账号与 Key 将被移除,不可恢复。`)){s(e.id);try{await _.providerRemove(e.id),p.success(`已删除供应商「`+e.name+`」`),await g.refresh()}catch(e){p.error(String(e))}finally{s(null)}}}return(0,U.jsx)(l,{open:e,onOpenChange:t,children:(0,U.jsxs)(a,{className:`max-w-[440px]`,children:[(0,U.jsx)(x,{children:(0,U.jsx)(o,{children:`删除供应商`})}),(0,U.jsx)(`div`,{className:`grid gap-1.5`,children:n.length?n.map(e=>(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded-md border border-border/70 bg-muted/40 px-3 py-2`,children:[(0,U.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,U.jsx)(`strong`,{className:`truncate text-sm font-medium text-foreground`,children:e.name}),(0,U.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[e.kind===`proxy`?`反代`:`直连`,` · `,(e.accounts??[]).length,` 账号`]})]}),(0,U.jsxs)(i,{disabled:r===e.id,onClick:()=>void c(e),size:`chip`,variant:`destructive`,children:[r===e.id?(0,U.jsx)(T,{className:`size-3 animate-spin`}):(0,U.jsx)(E,{className:`size-3`}),`删除`]})]},e.id)):(0,U.jsx)(`p`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`暂无供应商`})}),(0,U.jsx)(`div`,{className:`mt-3 flex justify-end`,children:(0,U.jsx)(i,{onClick:()=>t(!1),variant:`outline`,children:`关闭`})})]})})}function X({p:t,proxyApps:n,busy:r,onAction:a}){let o=K(t.accounts??[]),s=o.find(e=>e.selected)||o.find(e=>e.usable&&!W(e.quota))||o[0],[c,l]=(0,H.useState)(!1),u=t.kind===`proxy`?(n??[]).find(e=>e.id===t.proxyAppId)??null:null,d=t.apiBase||(t.apiPort?`http://127.0.0.1:`+t.apiPort+`/v1`:null);return(0,U.jsxs)(F,{className:`flex min-h-0 flex-col overflow-hidden`,children:[(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 border-b border-border/70 bg-muted px-5 py-3`,children:[(0,U.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,U.jsx)(`strong`,{className:`truncate text-sm font-semibold text-foreground`,children:t.name}),t.kind===`proxy`&&u&&u.installed?u.updateAvailable?(0,U.jsxs)(i,{className:`gap-1 rounded-full px-2.5 text-xs text-warning`,disabled:r,onClick:()=>void a(`proxy-upd-`+t.id,()=>_.proxyUpdateApply(t.proxyAppId).then(()=>void 0),`已提交更新,所有实例将依次更新并重启`),size:`chip`,title:`检测到新版本,点击更新该应用全部实例`,variant:`outline`,children:[(0,U.jsx)(T,{className:`size-3`}),`更新 v`,u.latest]}):(0,U.jsxs)(i,{className:`gap-1 rounded-full px-2.5 text-xs font-mono text-muted-foreground`,disabled:r,onClick:()=>{a(`proxy-chk-`+t.id,async()=>{let e=await _.proxyUpdateCheck();if(await g.refresh(),!e.ok){p.error(e.error||`版本检测失败`);return}let n=e.versions?.[t.proxyAppId||``]||null,r=u.installed;p.info(n&&n!==r?`发现新版本 v`+n+`,点击版本胶囊更新`:`已是最新版本 v`+r)},void 0)},size:`chip`,title:`检测是否有新版本`,variant:`outline`,children:[`v`,u.installed,(0,U.jsx)(T,{className:e(`size-3`,r&&`animate-spin`)})]}):null]}),(0,U.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-1.5`,children:[(0,U.jsxs)(i,{disabled:r,onClick:()=>l(!0),size:`sm`,variant:`outline`,children:[(0,U.jsx)(O,{className:`size-3.5`}),`添加`]}),t.activated?(0,U.jsxs)(i,{disabled:r,onClick:()=>void a(`deact`,()=>_.providerDeactivate(t.id).then(()=>void 0),`已停用供应商(资源已回收)`),size:`sm`,variant:`outline`,children:[(0,U.jsx)(C,{className:`size-3.5`}),`停用`]}):(0,U.jsxs)(i,{disabled:r,onClick:()=>void a(`act`,()=>_.providerActivate(t.id).then(()=>void 0),`已启用供应商`),size:`sm`,variant:`outline`,children:[(0,U.jsx)(w,{className:`size-3.5`}),`启用`]})]})]}),(0,U.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border/60 px-5 py-2.5`,children:[(0,U.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`API 地址`}),(0,U.jsx)(`div`,{className:`flex h-8 min-w-0 flex-1 items-center gap-2 rounded-md border border-border bg-card px-2.5`,children:t.activated&&d?(0,U.jsx)(`code`,{className:`min-w-0 flex-1 truncate font-mono text-xs text-foreground`,children:d}):(0,U.jsx)(`span`,{className:`truncate text-xs text-muted-foreground/70`,children:`服务未启用`})}),t.activated&&d?(0,U.jsxs)(i,{onClick:()=>void navigator.clipboard.writeText(d||``).then(()=>p.success(`已复制 API 地址`)),size:`sm`,title:`复制该供应商 API 地址`,variant:`outline`,children:[(0,U.jsx)(z,{className:`size-3.5`}),`复制`]}):null]}),s?(0,U.jsx)(Q,{acc:s,busy:r,p:t,onAction:a}):(0,U.jsx)(`div`,{className:`px-5 py-3 text-xs text-muted-foreground`,children:`暂无账号数据`}),o.length?(0,U.jsxs)(`div`,{className:`flex min-h-0 flex-col border-t border-border/60`,children:[(0,U.jsxs)(`div`,{className:e(`grid items-center gap-2 border-b border-border/60 bg-muted/60 px-5 py-2 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground`,q),children:[(0,U.jsx)(`span`,{children:`Key`}),(0,U.jsx)(`span`,{className:`text-center`,children:`用量`}),(0,U.jsx)(`span`,{className:`text-center`,children:`操作`})]}),(0,U.jsx)(`div`,{className:`max-h-[288px] min-h-0 overflow-y-auto overscroll-contain`,children:o.map((n,i)=>(0,U.jsx)(`div`,{className:e(i>0&&`border-t border-border/50`),children:(0,U.jsx)($,{a:n,p:t,busy:r,onAction:a})},n.keyId))})]}):(0,U.jsx)(`p`,{className:`border-t border-border/60 px-5 py-3 text-xs text-muted-foreground`,children:`暂无 Keys — 点「添加」录入`}),(0,U.jsx)(Z,{open:c,onOpenChange:l,p:t})]})}function Z({open:e,onOpenChange:t,p:n}){let r=n.accounts??[],[s,c]=(0,H.useState)(``),[u,f]=(0,H.useState)(!1),[m,v]=(0,H.useState)(!1),y=n.kind===`proxy`;async function b(){v(!0);try{let e=await _.proxyLoginStart();if(!e.ok){p.error(e.error||`登录发起失败`);return}p.info(`已打开浏览器,请在 Command Code 页面完成授权…`,{duration:4e3});let r=await _.proxyLoginWait(e.waitMs??18e4);if(!r.ok||!r.apiKey){p.error(r.error||`登录未完成`);return}await _.proxyAddKey(n.id,r.apiKey),p.success(`已通过登录添加账号 `+(r.userName||r.keyName||``)),t(!1),await g.refresh()}catch(e){p.error(String(e))}finally{v(!1)}}async function S(){let e=s.split(/[,;s]+/).map(e=>e.trim()).filter(Boolean);if(!e.length){p.error(`请输入至少一个 Key`);return}f(!0);try{if(y)for(let t of e){let e=await _.proxyAddKey(n.id,t);if(e&&e.limited===`credits`){let t=e.account?.limit?.recovery;p.warning(`已添加:该账号额度用尽`+(t?.type===`at`&&t.at?`(预计 ${G(t.at)} 自动恢复)`:`(等待月度重置后自动恢复)`))}}else{let t=await _.providerKeysSet(n.id,{add:e});if(t.ok===!1){p.error(t.error||`添加失败`);return}}p.success(`已添加 `+e.length+` 个 Key(`+(y?`反代账号`:`API Key`)+`)`),c(``),t(!1),await g.refresh()}catch(e){p.error(String(e))}finally{f(!1)}}async function C(e){if(confirm(`移除 Key `+e+`?`)){f(!0);try{if(y){let t=r.find(t=>t.maskedKey===e||e.startsWith(t.maskedKey));t&&await _.proxyRemoveKey(n.id,t.keyId)}else{let t=await _.providerKeysSet(n.id,{removeMasked:[e]});if(t.ok===!1){p.error(t.error||`移除失败`);return}}p.success(`已移除`),t(!1),await g.refresh()}catch(e){p.error(String(e))}finally{f(!1)}}}return(0,U.jsx)(l,{open:e,onOpenChange:t,children:(0,U.jsxs)(a,{className:`max-w-[440px]`,children:[(0,U.jsx)(x,{children:(0,U.jsxs)(o,{children:[`添加 / 管理 Key — `,n.name]})}),(0,U.jsxs)(`div`,{className:`grid gap-3`,children:[y?(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border border-border/70 bg-muted/40 px-3 py-2.5`,children:[(0,U.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,U.jsx)(`span`,{className:`text-xs font-medium text-foreground`,children:`一键登录`}),(0,U.jsx)(`span`,{className:`text-[11px] leading-tight text-muted-foreground`,children:`浏览器打开 Command Code 授权,自动添加账号`})]}),(0,U.jsx)(i,{disabled:m||u,onClick:()=>void b(),size:`sm`,children:m?`等待授权…`:`一键登录`})]}):null,(0,U.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,U.jsxs)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:[y?`已录入账号(反代)`:`已录入 API Key`,`(`,r.length,`)`]}),r.length?(0,U.jsx)(`div`,{className:`grid max-h-[180px] gap-1 overflow-auto`,children:r.map(e=>(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded-md border border-border/70 bg-muted/40 px-2.5 py-1.5`,children:[(0,U.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5`,children:[(0,U.jsx)(`code`,{className:`truncate font-mono text-xs`,children:e.maskedKey}),e.selected?(0,U.jsx)(N,{tone:`ok`,children:`当前`}):null]}),(0,U.jsx)(i,{size:`chip`,variant:`ghost`,className:`text-destructive`,disabled:u,onClick:()=>void C(e.maskedKey),title:`移除该 Key`,children:(0,U.jsx)(E,{className:`size-3.5`})})]},e.keyId))}):(0,U.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`尚未录入 `,y?`账号`:`Key`]})]}),(0,U.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,U.jsxs)(h,{className:`text-xs text-muted-foreground`,children:[`添加 `,y?`账号 Key / Command Code`:`API Key`,`(每行一个,支持逗号/分号分隔)`]}),(0,U.jsx)(d,{className:`h-20 resize-none font-mono text-xs`,placeholder:y?`sk-... 或 Command Code,每行一个`:`sk-... 每行一个`,value:s,onChange:e=>c(e.target.value)})]})]}),(0,U.jsxs)(`div`,{className:`mt-3 flex justify-end gap-2`,children:[(0,U.jsx)(i,{onClick:()=>t(!1),variant:`outline`,children:`取消`}),(0,U.jsx)(i,{disabled:u||!s.trim(),onClick:()=>void S(),children:u?`保存中…`:`添加`})]})]})})}function Q({acc:t,busy:n,p:r,onAction:a}){let o=t.quota,s=!!t.selected,c=!!t.locked,l=o&&o.monthlyRemaining,u=o?.monthly?.percent,d=Number.isFinite(Number(u))?u+`%`:Number.isFinite(Number(l))?`$ `+Number(l).toFixed(2):`—`;return(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center gap-4 px-5 py-3`,children:[(0,U.jsxs)(`div`,{className:`grid min-w-[180px] content-center gap-1`,children:[(0,U.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:s?c?`当前账号(锁定)`:`当前在用账号`:`选择账号`}),(0,U.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,U.jsx)(A,{className:`max-w-[150px]`,children:t.maskedKey}),s?(0,U.jsxs)(i,{className:`gap-1 px-2`,disabled:n,onClick:()=>a(`refresh`,()=>_.providerRefresh(r.id).then(()=>void 0),`额度已刷新`),size:`chip`,variant:`outline`,children:[(0,U.jsx)(T,{className:e(`size-3`,n&&`animate-spin`)}),`刷新`]}):null]})]}),(0,U.jsxs)(`div`,{className:`grid min-w-0 flex-1 grid-cols-3 items-stretch gap-2`,children:[(0,U.jsx)(P,{icon:(0,U.jsx)(T,{className:`size-3.5`}),label:`5小时`,value:(o?.rolling?.percent??0)+`%`,danger:o?.rolling?.status===`rate-limited`}),(0,U.jsx)(P,{icon:(0,U.jsx)(f,{className:`size-3.5`}),label:`每周`,value:(o?.weekly?.percent??0)+`%`,danger:o?.weekly?.status===`rate-limited`}),(0,U.jsx)(P,{icon:(0,U.jsx)(D,{className:`size-3.5`}),label:`每月`,value:d,danger:o?.monthly?.status===`rate-limited`||Number(o?.monthly?.percent??0)>=100})]})]})}function $({a:t,p:n,busy:r,onAction:a}){let o=!!t.selected,s=t.instanceStatus===`frozen`?`frozen`:t.status||``,c=t.limit?.kind,l=s===`frozen`||!!c||!o&&W(t.quota),u=c===`credits`?t.limit?.recovery?.type===`at`&&t.limit?.recovery?.at?`额度用尽(预计 ${G(t.limit.recovery.at)} 月度重置后自动恢复)`:`额度用尽(待月度重置后自动恢复)`:c===`window`?t.limit?.reason??`时间窗额度已用尽(到 resetAt 自动恢复)`:c===`banned`?`账号被封禁`:null,d=I(t.requests||0)+` 次 · `+I(t.totalTokens||0)+` tok`,[f,p]=(0,H.useState)(!1),m;return m=s===`review`?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(i,{disabled:r,onClick:()=>void a(`in`,()=>_.providerAccountConfirm(n.id,t.keyId).then(()=>void 0),`已入池`),size:`chip`,variant:`outline`,children:`入池`}),(0,U.jsx)(i,{className:`h-[26px]`,disabled:r,onClick:()=>void a(`out`,()=>_.providerAccountDiscard(n.id,t.keyId).then(()=>void 0),`已作废`),size:`chip`,variant:`destructive`,children:`作废`})]}):l&&!o?(0,U.jsxs)(i,{size:`chip`,variant:`outline`,className:`w-[70px] gap-1 px-1.5`,onClick:()=>p(!0),title:u??`查看该账号限额情况`,children:[(0,U.jsx)(L,{className:`size-3.5`}),`限额`]}):o?(0,U.jsxs)(i,{disabled:r,onClick:()=>a(`refresh`,()=>_.providerRefresh(n.id).then(()=>void 0),`额度已刷新`),size:`chip`,variant:`outline`,className:`w-[70px] gap-1 px-1.5`,children:[(0,U.jsx)(T,{className:e(`size-3.5`,r&&`animate-spin`)}),`刷新`]}):(0,U.jsxs)(i,{disabled:r,size:`chip`,variant:`outline`,className:`w-[70px] gap-1 px-1.5`,onClick:()=>{n.kind===`proxy`?a(`sel`,()=>_.proxySelect(n.id,t.keyId).then(()=>void 0),`已切换账号`):a(`use`,()=>_.providerKeyUse(n.id,t.keyId).then(()=>void 0),`已锁定 Key`)},children:[(0,U.jsx)(B,{className:`size-3.5`}),`切换`]}),(0,U.jsxs)(`div`,{className:e(`grid items-center gap-2 px-5 py-2.5 hover:bg-muted/40`,q,o&&`bg-muted/60 shadow-[inset_3px_0_0_var(--primary)]`),children:[(0,U.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5`,children:[(0,U.jsx)(A,{children:t.maskedKey}),s===`registering`?(0,U.jsx)(N,{tone:`off`,children:`检测中…`}):null,s===`banned`?(0,U.jsx)(N,{tone:`err`,children:`封号`}):null,c===`credits`?(0,U.jsx)(`span`,{title:t.limit?.reason??`额度用尽`,children:(0,U.jsx)(N,{tone:`err`,children:`额度用尽`})}):null,c===`window`?(0,U.jsx)(`span`,{title:t.limit?.reason??`时间窗额度已用尽`,children:(0,U.jsx)(N,{tone:`warn`,children:`窗口用尽`})}):null]}),(0,U.jsx)(`span`,{className:`truncate text-right text-xs tabular-nums text-muted-foreground`,title:d,children:d}),(0,U.jsx)(`div`,{className:`flex justify-end`,children:m}),(0,U.jsx)(ee,{open:f,onOpenChange:p,a:t,p:n})]})}function ee({open:e,onOpenChange:t,a:n,p:r}){let s=n.quota,c=(()=>{let e=s?.monthly?.percent;if(e!=null&&Number.isFinite(Number(e)))return Number(e);let t=Number(s?.credits?.monthlyCredits??s?.monthlyRemaining);return Number.isFinite(t)&&t>=0?Math.min(100,Math.round((10-t)/10*100)):0})(),u=s?.monthly?.status?{...s.monthly,percent:c}:{status:`ok`,percent:c,resetsAt:s?.monthly?.resetsAt},d=(()=>{let e=s?.credits?.monthlyCredits,t=s?.monthlyRemaining,n=e!=null&&Number.isFinite(Number(e))?Number(e):t!=null&&Number.isFinite(Number(t))?Number(t):null;return n===null?null:`剩余 $`+n.toFixed(2)})(),f=(e,t,n)=>(0,U.jsxs)(`div`,{className:`grid gap-1 rounded-md border border-border/70 bg-muted/40 px-3 py-2.5`,children:[(0,U.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,U.jsx)(`span`,{className:`text-xs font-medium text-foreground`,children:t}),(0,U.jsx)(N,{tone:e?.status===`rate-limited`||Number(e?.percent)>=100?`err`:`ok`,children:e?.status===`rate-limited`||Number(e?.percent)>=100?`已限额`:`正常`})]}),(0,U.jsxs)(`strong`,{className:`text-xl font-semibold tabular-nums text-foreground`,children:[e?.percent??0,`%`]}),n?(0,U.jsx)(`span`,{className:`text-[11px] leading-tight text-muted-foreground`,children:n}):null,e?.resetsAt?(0,U.jsxs)(`span`,{className:`text-[11px] leading-tight text-muted-foreground`,children:[`重置:`,new Date(e.resetsAt).toLocaleString(`zh-CN`,{month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})]}):null]});return(0,U.jsx)(l,{open:e,onOpenChange:t,children:(0,U.jsxs)(a,{className:`max-w-[420px]`,children:[(0,U.jsx)(x,{children:(0,U.jsx)(o,{children:`限额详情`})}),(0,U.jsxs)(`div`,{className:`grid gap-1`,children:[(0,U.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,U.jsx)(`span`,{children:`账号`}),(0,U.jsx)(`code`,{className:`font-mono`,children:n.maskedKey}),(0,U.jsx)(`span`,{className:`ml-auto text-xs`,children:r.name})]}),s?(0,U.jsxs)(`div`,{className:`grid grid-cols-3 gap-2`,children:[f(s.rolling,`5小时`),f(s.weekly,`每周`),f(u,`每月`),s.credits||s.monthlyRemaining!=null?(0,U.jsxs)(`div`,{className:`col-span-3 flex flex-col gap-1 rounded-md border border-border/70 bg-muted/40 px-3 py-2`,children:[(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,U.jsx)(`span`,{className:`text-xs font-medium text-foreground`,children:`月度额度(Command)`}),s.credits?.belowThreshold?(0,U.jsx)(N,{tone:`warn`,children:`低于充值线`}):s.credits&&Number.isFinite(Number(s.credits.monthlyCredits))&&Number(s.credits.monthlyCredits)<=0?(0,U.jsx)(N,{tone:`err`,children:`额度用尽`}):(0,U.jsx)(N,{tone:`ok`,children:`正常`})]}),(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,U.jsx)(`span`,{className:`text-[11px] leading-tight text-muted-foreground`,children:Number(s.monthlyResetAt)>Date.now()?`月度额度预计 ${G(Number(s.monthlyResetAt))} 重置(随订阅续期)`:`月度额度已于 ${G(Number(s.monthlyResetAt))} 重置`}),d?(0,U.jsx)(`span`,{className:`text-sm font-semibold tabular-nums text-foreground`,children:d}):null]})]}):null]}):(0,U.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`暂无额度数据 — 点「刷新」获取`}),s?(0,U.jsxs)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:[`当前用量统计:`,I(n.requests||0),` 次请求 · `,I(n.totalTokens||0),` tokens`,s.monthly?.resetsAt?`。最迟限额将于月窗口重置后自动解除。`:``]}):null]}),(0,U.jsx)(`div`,{className:`mt-3 flex justify-end`,children:(0,U.jsx)(i,{onClick:()=>t(!1),variant:`outline`,children:`关闭`})})]})})}function te({open:t,onOpenChange:n,presets:r,proxyApps:d,onDone:f}){let[g,y]=(0,H.useState)(``),[S,C]=(0,H.useState)(``),[w,T]=(0,H.useState)(``),[E,D]=(0,H.useState)(`preset`),[O,k]=(0,H.useState)(!1);async function A(){if(E===`preset`&&!g){p.error(`请选择供应商`);return}if(E===`proxy`&&!S){p.error(`请选择反代应用`);return}k(!0);try{let e=E===`preset`?await _.providerAdd({presetId:g,name:w||void 0,keys:[]}):await _.providerAdd({kind:`proxy`,appId:S,name:w||void 0,keys:[]});if(e.ok===!1){p.error(e.error||`添加失败`);return}p.success(`已添加供应商,请在卡片上点「添加」录入 Key`),n(!1),T(``),y(``),C(``),f()}catch(e){p.error(String(e))}finally{k(!1)}}let j=(r??[]).find(e=>e.id===g);return(0,U.jsx)(l,{open:t,onOpenChange:n,children:(0,U.jsxs)(a,{className:`max-w-[420px]`,children:[(0,U.jsx)(x,{children:(0,U.jsx)(o,{children:`添加供应商`})}),(0,U.jsxs)(`div`,{className:`grid gap-3`,children:[(0,U.jsx)(`div`,{className:`flex gap-1.5 rounded-lg bg-muted p-1`,children:[`preset`,`proxy`].map(t=>(0,U.jsx)(i,{className:e(`flex-1 rounded-md font-medium`,E===t?`bg-card text-foreground shadow-sm`:`bg-transparent text-muted-foreground hover:bg-card/60 hover:text-foreground`),onClick:()=>D(t),size:`sm`,variant:`ghost`,children:t===`preset`?`直连预设`:`反代应用`},t))}),E===`preset`?(0,U.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,U.jsx)(h,{children:`供应商`}),(0,U.jsxs)(v,{value:g,onValueChange:y,children:[(0,U.jsx)(b,{className:`w-full`,children:(0,U.jsx)(c,{placeholder:`-- 选择供应商 --`})}),(0,U.jsx)(s,{children:(r??[]).map(e=>(0,U.jsx)(m,{value:e.id,children:e.name},e.id))})]}),j?.note?(0,U.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:j.note}):null]}):(0,U.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,U.jsx)(h,{children:`反代应用`}),(0,U.jsxs)(v,{value:S,onValueChange:C,children:[(0,U.jsx)(b,{className:`w-full`,children:(0,U.jsx)(c,{placeholder:`-- 选择应用 --`})}),(0,U.jsx)(s,{children:(d??[]).map(e=>(0,U.jsx)(m,{value:e.id,children:e.name},e.id))})]})]}),(0,U.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,U.jsx)(h,{children:`供应商名称(可选)`}),(0,U.jsx)(u,{placeholder:`自定义名称,如:Open Code ZEN`,value:w,onChange:e=>T(e.target.value)})]}),(0,U.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`只添加供应商不填 Key;添加后在供应商卡片上点「添加」录入 API Key。`})]}),(0,U.jsxs)(`div`,{className:`mt-4 flex justify-end gap-2`,children:[(0,U.jsx)(i,{onClick:()=>n(!1),variant:`outline`,children:`取消`}),(0,U.jsx)(i,{disabled:O,onClick:()=>void A(),children:O?`添加中…`:`添加供应商`})]})]})})}export{J as RouterPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e,E as t,L as n,M as r,N as i,O as a,S as o,T as s,a as c,c as l,d as u,f as d,h as f,k as p,l as m,p as h,r as g,s as _,u as v,x as y,z as b}from"./supervisor-m53cymoX.js";import{t as x}from"./refresh-cw-3BcNWlWU.js";import{c as S,l as C}from"./supervisor-AngOxQui.js";import{t as w}from"./useSupervisorAction-BG3WZkEK.js";import{n as T,o as E,t as D}from"./widgets-OLyrPchF.js";var O=b(n(),1),k=a();function A(){let[e,t]=(0,O.useState)(null),[n,r]=(0,O.useState)(null),[i,a]=(0,O.useState)(null),[o,d]=(0,O.useState)(``),[h,y]=(0,O.useState)(`hide`),{busy:b,run:x}=w(),S=(0,O.useCallback)(async()=>{let[e,n,i,o]=await Promise.all([g.autostart().catch(()=>null),g.lanPanel().catch(()=>null),g.accessKey().catch(()=>null),g.closeAction().catch(()=>null)]);e&&t(e.on),n&&r(n),i&&a(i),o&&y(o.closeAction)},[]);(0,O.useEffect)(()=>{S()},[S]);async function C(e){t(e);try{let n=await g.setAutostart(e);n.ok===!1?(p.error(n.error||`设置失败`),t(!e)):p.success(e?`已开启开机自启(整条服务链)`:`已关闭开机自启`)}catch(n){p.error(String(n)),t(!e)}}async function E(e){r(t=>t&&{...t,enabled:e});try{let t=await g.setLanPanel(e);if(t.ok===!1){p.error(t.error||`设置失败`),r(t=>t&&{...t,enabled:!e});return}r(t),p.success(e?`已开启局域网访问`:`已关闭局域网访问(仅本机)`)}catch(t){p.error(String(t)),r(t=>t&&{...t,enabled:!e})}}async function A(){let e=o.trim();if(e&&e.length<8){p.error(`访问密钥至少 8 位(建议 16+ 位随机串)`);return}await x(`akk`,()=>g.setAccessKey(e),{success:e?`访问密钥已设置`:`访问密钥已清除`,refresh:!1,onDone:()=>{d(``),S()}})}async function j(e){let t=e===`exit`?`exit`:`hide`;y(t),await x(`ca`,()=>g.setCloseAction(t),{success:t===`exit`?`已设为:关闭窗口时退出管家`:`已设为:关闭窗口时隐藏至托盘`,refresh:!1})}return(0,k.jsxs)(k.Fragment,{children:[(0,k.jsxs)(D,{children:[(0,k.jsx)(T,{title:`启动`,subtitle:`开机行为与偏好`}),(0,k.jsxs)(`div`,{className:`grid gap-4 px-5 py-4`,children:[(0,k.jsxs)(`div`,{className:`flex items-start justify-between gap-6`,children:[(0,k.jsxs)(`div`,{className:`min-w-0`,children:[(0,k.jsx)(`strong`,{className:`block text-sm font-medium text-foreground`,children:`开机自动启动管家`}),(0,k.jsx)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:`开机登录后自动启动 DeepSeek Harness 管家(本程序)。不会自动启动任何单个实例——实例是否被自动拉起,由各自「进程守护」开关决定。`})]}),e===null?(0,k.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`…`}):(0,k.jsx)(`span`,{title:`开机自启`,children:(0,k.jsx)(c,{checked:e,onCheckedChange:e=>void C(e)})})]}),(0,k.jsxs)(`div`,{className:`flex items-start justify-between gap-6 border-t border-border/60 pt-4`,children:[(0,k.jsxs)(`div`,{className:`min-w-0`,children:[(0,k.jsx)(`strong`,{className:`block text-sm font-medium text-foreground`,children:`关闭窗口时`}),(0,k.jsx)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:`隐藏至托盘:管家与服务继续在后台运行;退出管家:关闭并停止全部服务。`})]}),(0,k.jsxs)(_,{value:h,onValueChange:e=>void j(e),children:[(0,k.jsx)(v,{className:`w-[150px]`,children:(0,k.jsx)(u,{})}),(0,k.jsxs)(l,{children:[(0,k.jsx)(m,{value:`hide`,children:`隐藏至托盘`}),(0,k.jsx)(m,{value:`exit`,children:`退出管家`})]})]})]})]})]}),(0,k.jsxs)(D,{children:[(0,k.jsx)(T,{title:`访问`}),(0,k.jsxs)(`div`,{className:`grid gap-4 px-5 py-4`,children:[(0,k.jsxs)(`div`,{className:`flex items-start justify-between gap-6`,children:[(0,k.jsxs)(`div`,{className:`min-w-0`,children:[(0,k.jsx)(`strong`,{className:`block text-sm font-medium text-foreground`,children:`管家局域网访问`}),n?n.enabled?(0,k.jsxs)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:[`开启后,局域网内设备可通过\xA0`,(n.urls??[]).map((e,t)=>(0,k.jsxs)(`span`,{children:[t>0?`、 `:null,(0,k.jsx)(`code`,{className:`rounded bg-muted px-1 py-px font-mono text-foreground`,children:e})]},e)),`\xA0访问本面板。`]}):(0,k.jsx)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:`关闭后仅本机可访问,局域网设备不可用。`}):null]}),n===null?(0,k.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`…`}):(0,k.jsx)(`span`,{title:`局域网访问`,children:(0,k.jsx)(c,{checked:n.enabled,onCheckedChange:e=>void E(e)})})]}),(0,k.jsx)(`div`,{className:`flex items-start justify-between gap-6 border-t border-border/60 pt-4`,children:(0,k.jsxs)(`div`,{className:`min-w-0`,children:[(0,k.jsx)(`strong`,{className:`block text-sm font-medium text-foreground`,children:`访问密钥`}),(0,k.jsxs)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:[`局域网或公网访问本面板需携带此密钥;本机访问不受影响。留空保存可清除。`,i?.configured?(0,k.jsx)(`span`,{className:`mt-1 block text-status-ok`,children:`当前:已设置`}):(0,k.jsx)(`span`,{className:`mt-1 block text-muted-foreground`,children:`当前:未设置`})]})]})}),(0,k.jsxs)(`div`,{className:`flex gap-2`,children:[(0,k.jsx)(f,{type:`password`,autoComplete:`new-password`,placeholder:`输入 ≥8 位访问密钥(建议随机长串)`,value:o,onChange:e=>d(e.target.value),onKeyDown:e=>{e.key===`Enter`&&A()},className:`flex-1`}),(0,k.jsx)(s,{variant:`outline`,onClick:()=>d(``),disabled:!o&&!i?.configured,children:`清除`}),(0,k.jsx)(s,{disabled:b===`akk`,onClick:()=>void A(),children:i?.configured?`更新密钥`:`设置密钥`})]})]})]})]})}function j(){let[n,a]=(0,O.useState)(null),[c,l]=(0,O.useState)(`auto`),[u,m]=(0,O.useState)([]),[_,v]=(0,O.useState)(``),[b,A]=(0,O.useState)(``),[j,N]=(0,O.useState)(!1),P=(0,O.useRef)(null),{busy:F,run:I}=w();(0,O.useEffect)(()=>{if(!j||!P.current)return;let e=window.setTimeout(()=>{let e=P.current;e&&e.scrollIntoView({block:`start`,behavior:`smooth`})},320);return()=>window.clearTimeout(e)},[j]);let L=(0,O.useCallback)(async()=>{let e=await g.registry().catch(()=>null);a(e)},[]);(0,O.useEffect)(()=>{L()},[L]),(0,O.useEffect)(()=>{n&&(l(n.mode||`auto`),m((n.candidates??[]).map(e=>e.origin)),v(n.manualOrigin||``))},[n]);let R=()=>{let e=b.trim();if(!/^https?:\/\//.test(e)){p.error(`请输入合法的镜像 URL`);return}if(u.includes(e)){p.info(`已在列表中`);return}m(t=>[...t,e]),A(``)};async function z(){let e={mode:c,origins:u};if(c===`manual`){if(!/^https?:\/\//.test(_.trim())){p.error(`手动模式需提供合法镜像 URL`);return}e.manualOrigin=_.trim()}await I(`reg`,()=>g.registrySet(e),{success:`已保存镜像配置`,refresh:!1,onDone:()=>void L()})}async function B(){await I(`regr`,()=>g.registryRefresh(),{success:`已探测镜像`,refresh:!1,onDone:()=>void L()})}let V=e=>{let t=(n?.probes??[]).find(t=>t.origin===e);return t&&t.ok?t.latencyMs:null};return(0,k.jsxs)(D,{children:[(0,k.jsx)(T,{title:`镜像源`,subtitle:`npm 拉取 / 更新检测共用此源`}),(0,k.jsxs)(`div`,{className:`grid gap-3 px-5 py-4`,children:[(0,k.jsxs)(d,{value:c,onValueChange:e=>l(e),className:`flex gap-3`,children:[(0,k.jsxs)(`label`,{className:`inline-flex cursor-pointer items-center gap-1.5 text-sm`,children:[(0,k.jsx)(h,{value:`auto`,id:`reg-auto`}),(0,k.jsx)(`span`,{children:`自动(按延迟选最快)`})]}),(0,k.jsxs)(`label`,{className:`inline-flex cursor-pointer items-center gap-1.5 text-sm`,children:[(0,k.jsx)(h,{value:`manual`,id:`reg-manual`}),(0,k.jsx)(`span`,{children:`手动(固定指定)`})]})]}),c===`manual`?(0,k.jsx)(`div`,{className:`grid gap-1.5`,children:(0,k.jsxs)(`div`,{className:`flex gap-2`,children:[(0,k.jsx)(f,{placeholder:`https://registry.npmmirror.com`,value:_,onChange:e=>v(e.target.value),className:`flex-1`}),(0,k.jsx)(s,{variant:`outline`,onClick:()=>void M(_),children:`测试`})]})}):null,(0,k.jsxs)(y,{open:j,onOpenChange:N,className:`grid gap-1`,children:[(0,k.jsxs)(e,{ref:P,children:[(0,k.jsxs)(`span`,{className:`text-xs font-medium text-foreground`,children:[`候选镜像列表(`,u.length,`)`]}),j?(0,k.jsx)(r,{className:`size-3.5 text-muted-foreground`}):(0,k.jsx)(i,{className:`size-3.5 text-muted-foreground`})]}),j?null:(0,k.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded-md border border-border/70 px-3 py-1.5`,children:[(0,k.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,k.jsx)(E,{tone:`ok`,children:`当前`}),(0,k.jsx)(`code`,{className:`truncate font-mono text-xs text-muted-foreground`,children:n?.origin||`未选择`})]}),n?.origin&&V(n.origin)!=null?(0,k.jsxs)(`span`,{className:`shrink-0 text-xs font-medium tabular-nums`,children:[V(n.origin),`ms`]}):null]}),(0,k.jsx)(o,{children:(0,k.jsx)(`div`,{className:`rounded-md border border-border/70`,children:u.map((e,t)=>(0,k.jsxs)(`div`,{className:`flex items-center justify-between gap-2 border-b border-border/50 px-3 py-1.5 last:border-b-0`,children:[(0,k.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[n?.origin===e?(0,k.jsx)(E,{tone:`ok`,children:`当前`}):null,(0,k.jsx)(`code`,{className:`truncate font-mono text-xs text-muted-foreground`,children:e})]}),(0,k.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[V(e)==null?(0,k.jsx)(`span`,{className:`text-xs text-muted-foreground/50`,children:`—`}):(0,k.jsxs)(`span`,{className:`text-xs font-medium tabular-nums`,title:`延迟毫秒数(自动探测)`,children:[V(e),(0,k.jsx)(`span`,{className:`text-muted-foreground/60`,children:`ms`})]}),(0,k.jsx)(s,{size:`chip`,variant:`ghost`,onClick:()=>m(t=>t.filter(t=>t!==e)),title:`移除该候选镜像`,children:(0,k.jsx)(S,{className:`size-3.5 text-destructive`})})]})]},t))})})]}),(0,k.jsxs)(`div`,{className:`flex gap-2`,children:[(0,k.jsx)(f,{placeholder:`https://… 添加自定义镜像`,value:b,onChange:e=>A(e.target.value),className:`flex-1`,onKeyDown:e=>{e.key===`Enter`&&R()}}),(0,k.jsxs)(s,{variant:`outline`,onClick:R,children:[(0,k.jsx)(C,{className:`size-4`}),`添加`]})]}),(0,k.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,k.jsxs)(s,{size:`sm`,disabled:F===`regr`,onClick:()=>void B(),variant:`outline`,children:[(0,k.jsx)(x,{className:t(`size-3.5`,F===`regr`&&`animate-spin`)}),`重新探测`]}),(0,k.jsx)(s,{disabled:F===`reg`,onClick:()=>void z(),children:`保存`})]})]})]})}async function M(e){if(!/^https?:\/\//.test(e)){p.error(`请输入合法镜像 URL`);return}p.info(`测试中…`);try{let t=Date.now(),n=await fetch(e.replace(/\/+$/,``)+`/-/ping`,{signal:AbortSignal.timeout(4e3)}),r=Date.now()-t;n.ok?p.success(`可达,延迟 `+r+` ms`):p.error(`不可达`)}catch{p.error(`探测失败`)}}var N=`DeepSeek Harness 管家`,P=`独立于 Harness 运行的系统级守卫:负责启动、存活监测与故障自动重启被监管目标,提供生命周期管理、智能路由、远程控制与多实例沙箱的运维面板。`;function F(){let[e,n]=(0,O.useState)(null),{busy:r,run:i}=w(),a=(0,O.useCallback)(async()=>{let e=await g.guardVersion().catch(()=>null);n(e||{})},[]);(0,O.useEffect)(()=>{a()},[a]);let o=async()=>{await i(`chk`,async()=>{let e=await g.selfUpdateStatus();if(e?.ok===!1){p.error(e.error||`内核自更新未配置`);return}n(e||{}),e?.updateAvailable&&e.latest?p.warning(`发现内核新版本 v`+e.latest+`(当前 v`+e.installed+`),需更新后重启守卫`):p.success(`内核已是最新版本(v`+(e?.installed||`—`)+`)`)},{refresh:!1})},c=async()=>{window.confirm(`发现内核新版本 v`+(e?.latest||``)+`,是否立即更新?`)&&await i(`upd`,async()=>{let e=await g.selfUpdateApply();if(e?.ok===!1){p.error(e.error||`更新失败`);return}if(e?.restartRequired){p.success(`内核已更新至 v`+(e.installed||e.latest||``)+`,正在重启守卫…`);let t=await g.selfUpdateRestart().catch(()=>null);t?.ok===!1&&p.warning(`更新完成,请手动重启守卫:`+(t.error||``))}else p.success(`内核已是最新,无需更新`)},{refresh:!0})},l=!!(e?.updateAvailable&&e?.latest&&e.latest!==e?.installed);return(0,k.jsxs)(D,{children:[(0,k.jsx)(T,{title:`关于`,subtitle:N,actions:(0,k.jsxs)(s,{size:`sm`,disabled:r===`chk`,onClick:()=>void o(),variant:`outline`,children:[(0,k.jsx)(x,{className:t(`size-3.5`,r===`chk`&&`animate-spin`)}),`检查更新`]})}),(0,k.jsxs)(`div`,{className:`grid gap-3 px-5 py-4`,children:[(0,k.jsxs)(`div`,{className:`grid grid-cols-[96px_minmax(0,1fr)] items-baseline gap-3`,children:[(0,k.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`当前版本`}),(0,k.jsxs)(`span`,{className:`flex items-center gap-2 text-sm font-medium text-foreground`,children:[`v`,e?.installed||e?.version||`—`,l?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsxs)(E,{tone:`warn`,children:[`可更新 v`,e?.latest]}),(0,k.jsxs)(s,{size:`chip`,disabled:r===`upd`,onClick:()=>void c(),variant:`outline`,children:[(0,k.jsx)(x,{className:t(`size-3`,r===`upd`&&`animate-spin`)}),`更新`]})]}):null]})]}),(0,k.jsx)(`p`,{className:`border-t border-border/60 pt-3 text-xs leading-relaxed text-muted-foreground`,children:P})]})]})}function I(){return(0,k.jsxs)(`div`,{className:`grid content-start gap-4`,children:[(0,k.jsx)(A,{}),(0,k.jsx)(j,{}),(0,k.jsx)(F,{})]})}export{I as SettingsPage};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) 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-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-divide-y-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-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-divide-x-reverse:0}}}@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;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-normal:0em;--tracking-wide:.025em;--leading-tight:1.25;--leading-relaxed:1.625;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--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%;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;-webkit-text-decoration:inherit;-webkit-text-decoration: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-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.\@container{container-type:inline-size}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.right-0{right:0}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-\[50\%\]{left:50%}.z-10{z-index:10}.z-50{z-index:50}.col-span-3{grid-column:span 3/span 3}.col-span-full{grid-column:1/-1}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-1{margin-inline:var(--spacing)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.field-sizing-content{field-sizing:content}.aspect-square{aspect-ratio:1}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-\[18px\]{width:18px;height:18px}.size-\[23px\]{width:23px;height:23px}.size-\[96px\]{width:96px;height:96px}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-20{height:calc(var(--spacing) * 20)}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[26px\]{height:26px}.h-\[30px\]{height:30px}.h-\[34px\]{height:34px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\[120px\]{max-height:120px}.max-h-\[160px\]{max-height:160px}.max-h-\[180px\]{max-height:180px}.max-h-\[288px\]{max-height:288px}.max-h-\[340px\]{max-height:340px}.max-h-\[450px\]{max-height:450px}.max-h-\[560px\]{max-height:560px}.max-h-\[min\(24rem\,var\(--radix-select-content-available-height\)\)\]{max-height:min(24rem, var(--radix-select-content-available-height))}.min-h-0{min-height:0}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[36px\]{min-height:36px}.min-h-\[40px\]{min-height:40px}.min-h-\[46px\]{min-height:46px}.min-h-\[52px\]{min-height:52px}.min-h-\[72px\]{min-height:72px}.min-h-\[76px\]{min-height:76px}.min-h-\[78px\]{min-height:78px}.min-h-\[150px\]{min-height:150px}.min-h-\[200px\]{min-height:200px}.min-h-\[220px\]{min-height:220px}.min-h-\[320px\]{min-height:320px}.w-4{width:calc(var(--spacing) * 4)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-\[70px\]{width:70px}.w-\[130px\]{width:130px}.w-\[150px\]{width:150px}.w-\[190px\]{width:190px}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-\[82px\]{max-width:82px}.max-w-\[150px\]{max-width:150px}.max-w-\[180px\]{max-width:180px}.max-w-\[380px\]{max-width:380px}.max-w-\[400px\]{max-width:400px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[120px\]{min-width:120px}.min-w-\[180px\]{min-width:180px}.min-w-\[220px\]{min-width:220px}.min-w-\[400px\]{min-width:400px}.min-w-\[720px\]{min-width:720px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.scroll-my-1{scroll-margin-block:var(--spacing)}.scrollbar-none{scrollbar-width:none}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[56px_minmax\(0\,1fr\)_auto_66px\]{grid-template-columns:56px minmax(0,1fr) auto 66px}.grid-cols-\[64px_auto_minmax\(0\,1fr\)\]{grid-template-columns:64px auto minmax(0,1fr)}.grid-cols-\[88px_minmax\(0\,1fr\)_120px_84px_36px\]{grid-template-columns:88px minmax(0,1fr) 120px 84px 36px}.grid-cols-\[96px_minmax\(0\,1fr\)\]{grid-template-columns:96px minmax(0,1fr)}.grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.grid-cols-\[minmax\(0\,1fr\)_230px_84px\]{grid-template-columns:minmax(0,1fr) 230px 84px}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.grid-rows-\[minmax\(0\,1fr\)\]{grid-template-rows:minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.content-center{align-content:center}.content-end{align-content:flex-end}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-items-center{justify-items:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-x-1\.5{column-gap:calc(var(--spacing) * 1.5)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border\/60>:not(:last-child)){border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){:where(.divide-border\/60>:not(:last-child)){border-color:color-mix(in oklab, var(--border) 60%, transparent)}}.justify-self-center{justify-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-\[4px\]{border-radius:4px}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-black\/5{border-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.border-black\/5{border-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.border-border,.border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.border-border\/60{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/60{border-color:color-mix(in oklab, var(--border) 60%, transparent)}}.border-border\/70{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/70{border-color:color-mix(in oklab, var(--border) 70%, transparent)}}.border-input{border-color:var(--input)}.border-muted{border-color:var(--muted)}.border-primary\/40{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/40{border-color:color-mix(in oklab, var(--primary) 40%, transparent)}}.border-transparent{border-color:#0000}.border-t-primary{border-top-color:var(--primary)}.bg-background{background-color:var(--background)}.bg-black\/45{background-color:#00000073}@supports (color:color-mix(in lab, red, red)){.bg-black\/45{background-color:color-mix(in oklab, var(--color-black) 45%, transparent)}}.bg-border{background-color:var(--border)}.bg-card,.bg-card\/80{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.bg-card\/80{background-color:color-mix(in oklab, var(--card) 80%, transparent)}}.bg-careful-background{background-color:var(--careful-background)}.bg-destructive{background-color:var(--destructive)}.bg-muted{background-color:var(--muted)}.bg-muted-foreground\/40{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.bg-muted-foreground\/50{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/50{background-color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-muted\/60{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/60{background-color:color-mix(in oklab, var(--muted) 60%, transparent)}}.bg-muted\/70{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/70{background-color:color-mix(in oklab, var(--muted) 70%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-primary-foreground{background-color:var(--primary-foreground)}.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.bg-primary\/\[0\.05\]{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/\[0\.05\]{background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-status-brand{background-color:var(--status-brand)}.bg-status-error{background-color:var(--status-error)}.bg-status-ok{background-color:var(--status-ok)}.bg-status-ok-soft{background-color:var(--status-ok-soft)}.bg-success-background{background-color:var(--success-background)}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--warning)}.bg-warning-background{background-color:var(--warning-background)}.bg-white{background-color:var(--color-white)}.bg-\[image\:var\(--panel-accent-gradient\)\]{background-image:var(--panel-accent-gradient)}.bg-\[image\:var\(--primary-btn-grad\)\]{background-image:var(--primary-btn-grad)}.bg-\[length\:100\%_100\%\]{background-size:100% 100%}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-px{padding-block:1px}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-1{padding-bottom:var(--spacing)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-\[18px\]{padding-bottom:18px}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:1.5rem;line-height:var(--tw-leading,2rem)}.text-base{font-size:1rem;line-height:var(--tw-leading,1.5rem)}.text-lg{font-size:1.125rem;line-height:var(--tw-leading,1.75rem)}.text-sm{font-size:.875rem;line-height:var(--tw-leading,1.25rem)}.text-xl{font-size:1.25rem;line-height:var(--tw-leading,1.75rem)}.text-xs{font-size:.75rem;line-height:var(--tw-leading,1rem)}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[22px\]{font-size:22px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-card-foreground{color:var(--card-foreground)}.text-careful{color:var(--careful)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-foreground{color:var(--foreground)}.text-muted-foreground,.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/50{color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.text-muted-foreground\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/60{color:color-mix(in oklab, var(--muted-foreground) 60%, transparent)}}.text-muted-foreground\/70{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/70{color:color-mix(in oklab, var(--muted-foreground) 70%, transparent)}}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-foreground{color:var(--sidebar-foreground)}.text-status-error{color:var(--status-error)}.text-status-ok{color:var(--status-ok)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.shadow-\[0_0_6px_2px_var\(--status-brand-ring\)\]{--tw-shadow:0 0 6px 2px var(--tw-shadow-color,var(--status-brand-ring));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_6px_2px_var\(--status-error-ring\)\]{--tw-shadow:0 0 6px 2px var(--tw-shadow-color,var(--status-error-ring));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_6px_2px_var\(--status-ok-ring\)\]{--tw-shadow:0 0 6px 2px var(--tw-shadow-color,var(--status-ok-ring));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(15\,23\,42\,0\.04\)\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0f172a0a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(15\,23\,42\,0\.06\)\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0f172a0f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_3px_rgba\(0\,0\,0\,0\.22\)\]{--tw-shadow:0 1px 3px var(--tw-shadow-color,#00000038);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_18px_48px_rgba\(0\,0\,0\,0\.18\)\]{--tw-shadow:0 18px 48px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_3px_0_0_var\(--primary\)\]{--tw-shadow:inset 3px 0 0 var(--tw-shadow-color,var(--primary));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--primary-btn-shadow\)\]{--tw-shadow:var(--primary-btn-shadow);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.\!filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:var(--tw-leading,1.25rem)}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-card\/60:hover{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-card\/60:hover{background-color:color-mix(in oklab, var(--card) 60%, transparent)}}.hover\:bg-card\/70:hover{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-card\/70:hover{background-color:color-mix(in oklab, var(--card) 70%, transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/40:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/40:hover{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.hover\:bg-primary\/15:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/15:hover{background-color:color-mix(in oklab, var(--primary) 15%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:bg-\[image\:var\(--primary-btn-grad-hover\)\]:hover{background-image:var(--primary-btn-grad-hover)}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring\/20:focus{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-ring\/20:focus{--tw-ring-color:color-mix(in oklab, var(--ring) 20%, transparent)}}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible,.focus-visible\:ring-ring\/20:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:translate-x-3\.5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 3.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:translate-x-\[18px\][data-state=checked]{--tw-translate-x:18px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--accent-foreground)}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}@media not all and (width>=980px){.max-\[980px\]\:px-6{padding-inline:calc(var(--spacing) * 6)}.max-\[980px\]\:pt-2{padding-top:calc(var(--spacing) * 2)}.max-\[980px\]\:pb-6{padding-bottom:calc(var(--spacing) * 6)}}@media not all and (width>=640px){.max-\[640px\]\:block{display:block}.max-\[640px\]\:hidden{display:none}.max-\[640px\]\:h-auto{height:auto}.max-\[640px\]\:min-h-\[52px\]{min-height:52px}.max-\[640px\]\:min-h-\[64px\]{min-height:64px}.max-\[640px\]\:min-h-dvh{min-height:100dvh}.max-\[640px\]\:grid-cols-\[56px_auto_minmax\(0\,1fr\)\]{grid-template-columns:56px auto minmax(0,1fr)}.max-\[640px\]\:grid-rows-\[auto\]{grid-template-rows:auto}.max-\[640px\]\:flex-col{flex-direction:column}.max-\[640px\]\:items-stretch{align-items:stretch}.max-\[640px\]\:gap-2{gap:calc(var(--spacing) * 2)}.max-\[640px\]\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.max-\[640px\]\:overflow-visible{overflow:visible}.max-\[640px\]\:overflow-x-clip{overflow-x:clip}.max-\[640px\]\:overflow-y-visible{overflow-y:visible}.max-\[640px\]\:px-3{padding-inline:calc(var(--spacing) * 3)}.max-\[640px\]\:px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.max-\[640px\]\:pb-\[18px\]{padding-bottom:18px}.max-\[640px\]\:text-base{font-size:1rem;line-height:var(--tw-leading,1.5rem)}.max-\[640px\]\:font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}}@media (width>=40rem){.sm\:inline{display:inline}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}:where(.sm\:divide-y-0>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:inline-flex{display:inline-flex}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.md\:text-sm{font-size:.875rem;line-height:var(--tw-leading,1.25rem)}}@media (width>=64rem){.lg\:block{display:block}.lg\:inline-flex{display:inline-flex}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}:where(.lg\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.lg\:divide-border\/60>:not(:last-child)){border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){:where(.lg\:divide-border\/60>:not(:last-child)){border-color:color-mix(in oklab, var(--border) 60%, transparent)}}}@container (width>=560px){.\@min-\[560px\]\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@container (width>=640px){.\@min-\[640px\]\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (width>=720px){.\@min-\[720px\]\:grid-cols-\[minmax\(0\,5fr\)_minmax\(0\,6fr\)\]{grid-template-columns:minmax(0,5fr) minmax(0,6fr)}}@container (width>=860px){.\@min-\[860px\]\:grid-cols-\[minmax\(0\,1fr\)_420px\]{grid-template-columns:minmax(0,1fr) 420px}}@container (width>=900px){.\@min-\[900px\]\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\@min-\[900px\]\:grid-cols-\[minmax\(0\,1fr\)_420px\]{grid-template-columns:minmax(0,1fr) 420px}}@container (width>=1000px){.\@min-\[1000px\]\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}@media not all and (width>=640px){.max-\[640px\]\:\[\&_button\]\:h-7 button{height:calc(var(--spacing) * 7)}.max-\[640px\]\:\[\&_button\]\:px-2\.5 button{padding-inline:calc(var(--spacing) * 2.5)}.max-\[640px\]\:\[\&_button\]\:text-xs button{font-size:.75rem;line-height:var(--tw-leading,1rem)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}:root{--panel-accent-gradient:linear-gradient(135deg, #4176e60f, #4176e604 60%, transparent);--radius:.5rem;--background:#fff;--foreground:#0f1115;--card:#fff;--card-foreground:#0f1115;--popover:#fff;--popover-foreground:#0f1115;--primary:#4176e6;--primary-foreground:#fff;--primary-btn-grad:linear-gradient(180deg, #3d5ef0 0%, #2f54eb 100%);--primary-btn-grad-hover:linear-gradient(180deg, #4f7bf0 0%, #2f54eb 100%);--primary-btn-shadow:0 1px 2px #0f172a29, inset 0 1px 0 #ffffff38;--secondary:#f9fafb;--secondary-foreground:#0f1115;--muted:#f1f3f5;--muted-foreground:#81858c;--accent:#ebeef2;--accent-foreground:#0f1115;--destructive:#b42318;--destructive-foreground:#fff;--border:#00000014;--input:#0000001f;--ring:#4176e6;--success:#166534;--success-background:#e7f6ed;--status-ok:#10b981;--status-ok-soft:#34d399;--status-ok-ring:#10b9818c;--status-error:#ef4444;--status-error-ring:#ef444466;--status-brand:#4176e6;--status-brand-ring:#4176e666;--warning:#92400e;--warning-background:#fef3c7;--careful:#991b1b;--careful-background:#fee2e2;--chart-1:#4176e6;--chart-2:#81858c;--chart-3:#8a6f2a;--chart-4:#5686fe;--chart-5:#b42318;--sidebar:#f9fafb;--sidebar-foreground:#61666b;--sidebar-primary:#4176e6;--sidebar-primary-foreground:#fff;--sidebar-accent:#ebeef2;--sidebar-accent-foreground:#0f1115;--sidebar-border:#0000000d;--sidebar-ring:#4176e6;color:#171717;font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%;background:0 0;font-family:Inter,Noto Sans SC,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.dark{--panel-accent-gradient:linear-gradient(135deg, #6b83ff14, #6b83ff05 60%, transparent);--background:#0f1115;--foreground:#f1f4f9;--card:#16191f;--card-foreground:#f1f4f9;--popover:#16191f;--popover-foreground:#f1f4f9;--primary:#6b83ff;--primary-foreground:#fff;--primary-btn-grad:linear-gradient(180deg, #4f6ef2 0%, #3a56e0 100%);--primary-btn-grad-hover:linear-gradient(180deg, #6484f5 0%, #4f6ef2 100%);--primary-btn-shadow:0 1px 2px #00000059, inset 0 1px 0 #ffffff24;--secondary:#1e222b;--secondary-foreground:#f1f4f9;--muted:#1e222b;--muted-foreground:#a7afb7;--accent:#1b2230;--accent-foreground:#f1f4f9;--destructive:#f97066;--destructive-foreground:#fff;--border:#ffffff24;--input:#ffffff29;--ring:#6b83ff;--success:#86efac;--success-background:#123622;--status-ok:#34d399;--status-ok-soft:#10b981;--status-ok-ring:#34d39980;--status-error:#f87171;--status-error-ring:#f8717166;--status-brand:#6b83ff;--status-brand-ring:#6b83ff66;--warning:#facc15;--warning-background:#3a2f12;--careful:#fca5a5;--careful-background:#3a1515;--chart-1:#6b83ff;--chart-2:#a7afb7;--chart-3:#facc15;--chart-4:#8ea0ff;--chart-5:#f97066;--sidebar:#16191f;--sidebar-foreground:#f1f4f9;--sidebar-primary:#6b83ff;--sidebar-primary-foreground:#fff;--sidebar-accent:#1b2230;--sidebar-accent-foreground:#f1f4f9;--sidebar-border:#ffffff1f;--sidebar-ring:#6b83ff}*{box-sizing:border-box}html{font-size:16px}html,body,#root{background:0 0;width:100%;height:100dvh;overflow:hidden}body{min-width:320px;min-height:100dvh;color:var(--foreground);-webkit-user-select:none;user-select:none;background:0 0;margin:0;font-family:inherit;font-size:.875rem;line-height:1.25rem;overflow:hidden}#root{background:0 0;border-radius:1rem}#root[data-system-titlebar=true]{border-radius:0}input,textarea,[contenteditable=true]{-webkit-user-select:text;user-select:text}button{cursor:pointer}button:disabled{cursor:not-allowed}p,h1,h2{margin:0}@media (width<=640px){body{overflow:hidden auto}#root{border-radius:0;overflow:visible}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}html,body{overflow-x:hidden}.fw-shell{overflow-x:clip}.fw-layout{grid-template-rows:minmax(0,1fr);grid-template-columns:232px minmax(0,1fr)}.fw-layout[data-mode=wide-sidebar]{grid-template-rows:minmax(0,1fr);grid-template-columns:clamp(320px,28vw,560px) minmax(0,1fr)}.fw-system-titlebar{--fw-left-column:232px;background:linear-gradient(90deg, #f4f6fa 0, #f4f6fa var(--fw-left-column), #fafbfc var(--fw-left-column), #fafbfc 100%)}.fw-system-titlebar[data-mode=wide-sidebar]{--fw-left-column:clamp(320px, 28vw, 560px)}.fw-system-titlebar .fw-sidebar,.fw-system-titlebar .fw-space-sidebar{padding-top:18px}.fw-system-titlebar .fw-toolbar{background:linear-gradient(#f3f5f7bd 0%,#f7f8f6fa 54%,#fafbfc 100%);border-bottom-color:#0000000a;min-height:82px;box-shadow:inset 0 1px #ffffffb3}@media (width>=641px){.fw-layout .fw-sidebar{min-height:0;position:static;overflow-y:auto;transform:none}.fw-layout .fw-space-sidebar{min-height:0;overflow-y:auto}}@media (width<=640px){.fw-layout,.fw-layout[data-mode=wide-sidebar]{grid-template-columns:minmax(0,1fr)}.fw-layout .fw-sidebar{z-index:60;border-right:1px solid #00000014;width:min(280px,85vw);transition:transform .22s cubic-bezier(.2,.8,.2,1);position:fixed;top:0;bottom:0;left:0;transform:translate(-102%);box-shadow:0 0 40px #0f172a2e}.fw-layout[data-sidebar-open=true] .fw-sidebar{transform:translate(0)}.fw-layout .fw-space-sidebar{z-index:60;width:min(320px,88vw);transition:transform .22s cubic-bezier(.2,.8,.2,1);position:fixed;top:0;bottom:0;left:0;transform:translate(-102%)}.fw-layout[data-sidebar-open=true] .fw-space-sidebar{transform:translate(0)}.fw-system-titlebar{background:#fafbfc}}.fw-layout .fw-drawer-scrim{z-index:55;background:#0f172a73;display:none;position:fixed;inset:0}@media (width<=640px){.fw-layout .fw-drawer-scrim{opacity:0;pointer-events:none;transition:opacity .22s;display:block}.fw-layout[data-sidebar-open=true] .fw-drawer-scrim{opacity:1;pointer-events:auto}}.fw-shell{--fw-glow:47 84 235;--fw-flare:56 189 248;isolation:isolate;position:relative}.fw-shell[data-mode=classic]{--fw-glow:47 84 235;--fw-flare:250 204 21}.fw-shell:before,.fw-shell:after{z-index:50;pointer-events:none;content:"";position:absolute;inset:0}.fw-shell:before{background:radial-gradient(circle at 50% 50%, #ffffff94 0 8%, rgb(var(--fw-glow) / 18%) 18%, rgb(var(--fw-glow) / 0%) 46%), linear-gradient(90deg, rgb(var(--fw-glow) / 0%) 0%, rgb(var(--fw-glow) / 13%) 36%, #ffffffbd 50%, rgb(var(--fw-flare) / 16%) 64%, rgb(var(--fw-glow) / 0%) 100%);mix-blend-mode:screen;opacity:0;transform-origin:50%;animation:.64s cubic-bezier(.16,1,.3,1) both fw-shell-light-open;transform:scaleX(.04)}.fw-shell:after{background:linear-gradient(90deg, transparent 0%, #fff0 42%, #ffffff9e 50%, #fff0 58%, transparent 100%), repeating-linear-gradient(0deg, rgb(var(--fw-glow) / 0%) 0 26px, rgb(var(--fw-glow) / 8%) 27px 28px);mix-blend-mode:screen;opacity:0;animation:.64s cubic-bezier(.16,1,.3,1) both fw-shell-scan;transform:translate(-38%)}@keyframes fw-shell-light-open{0%{opacity:0;transform:scaleX(.04)}18%{opacity:.95}52%{opacity:.62;transform:scaleX(1)}to{opacity:0;transform:scaleX(1.08)}}@keyframes fw-shell-scan{0%{opacity:0;transform:translate(-38%)}26%{opacity:.46}78%{opacity:0;transform:translate(38%)}to{opacity:0;transform:translate(38%)}}@media (prefers-reduced-motion:reduce){.fw-shell:before,.fw-shell:after{display:none}}@keyframes fw-sweep{0%{transform:translate(-110%)}50%{transform:translate(92%)}to{transform:translate(250%)}}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/inter-400-C38fXH4l.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(/assets/inter-500-Cerq10X2.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:600;font-display:swap;src:url(/assets/inter-600-LgqL8muc.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:700;font-display:swap;src:url(/assets/inter-700-Yt3aPRUw.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Noto Sans SC;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/noto-sans-sc-400-68UKsrZK.woff2)format("woff2")}@font-face{font-family:Noto Sans SC;font-style:normal;font-weight:700;font-display:swap;src:url(/assets/noto-sans-sc-700-BiGzk9PQ.woff2)format("woff2")}.scrollbar-none{scrollbar-width:none;-ms-overflow-style:none}.scrollbar-none::-webkit-scrollbar{width:0;height:0;display:none}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#78808c59;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:#78808c8c}*{scrollbar-width:thin;scrollbar-color:#78808c59 transparent}
|